Java技术问询:如何将int转换为大写字符并适配FilterWriter的write方法?
嘿,这个需求我之前做FilterWriter扩展的时候刚好碰到过,其实核心逻辑很清晰,咱们一步步来搞定!
核心思路梳理
因为你已经让write(String)和write(char[])都调用write(int c)方法了,那我们只需要重写write(int c)这一个方法就够了——所有写入操作最终都会走到这里,不用重复写转换逻辑,非常省心。
具体实现步骤
- 把传入的
int c转换为char:这里的int对应的是Unicode码点,(char)c会取低16位(FilterWriter的默认行为也是处理单个字符的码点)。 - 判断这个字符是否为字母:用
Character.isLetter(ch),这个方法会兼容Unicode所有字母,比手动判断ASCII范围更靠谱。 - 如果是字母,转成大写:用
Character.toUpperCase(ch),支持Unicode标准的大小写转换(比如处理带重音的非英语字母)。 - 把处理后的
char转回int,调用父类的super.write(int)方法完成实际写入。
完整代码示例
import java.io.FilterWriter; import java.io.IOException; import java.io.Writer; public class UppercaseFilterWriter extends FilterWriter { // 必须调用父类构造方法传入底层Writer protected UppercaseFilterWriter(Writer out) { super(out); } @Override public void write(int c) throws IOException { char ch = (char) c; // 仅对字母进行大写转换 if (Character.isLetter(ch)) { ch = Character.toUpperCase(ch); } // 传给父类的write方法完成实际写入 super.write((int) ch); } // 无需重写write(String)和write(char[]),因为FilterWriter的默认实现会循环调用write(int) // 如果你不确定,可以查看FilterWriter源码: // public void write(String str, int off, int len) throws IOException { ... 循环调用write(int) ... } // public void write(char cbuf[], int off, int len) throws IOException { ... 循环调用write(int) ... } }
测试验证
写个小测试类验证效果:
import java.io.StringWriter; import java.io.IOException; public class UppercaseFilterTest { public static void main(String[] args) throws IOException { StringWriter stringWriter = new StringWriter(); UppercaseFilterWriter filterWriter = new UppercaseFilterWriter(stringWriter); // 测试各种写入方式 filterWriter.write("Hello 世界!"); // 中文转大写还是本身,不影响 filterWriter.write(new char[]{'a', 'b', 'c'}); filterWriter.write((int)'d'); filterWriter.close(); System.out.println(stringWriter.toString()); // 输出:HELLO 世界!ABCD } }
注意事项
Character.isLetter()和Character.toUpperCase()是Java标准库提供的方法,能处理所有Unicode字母,比手动判断c >= 'a' && c <= 'z'要更通用,比如支持法语、德语等带特殊符号的字母。- 如果需要处理超出BMP(基本多文种平面)的字符(比如部分emoji或罕见文字),那
write(int c)可能需要额外处理代理对,但常规场景下上面的代码完全够用。
内容的提问来源于stack exchange,提问作者1020rpz
相关产品推荐
相关产品推荐

