已有BufferedReader,如何不使用readLine()读取EBCDIC大文件单个字符?
解决方案
既然已经持有BufferedReader实例,直接用它的read()方法读取单个字符即可——这个方法不会一次性加载整个文件,完美适配你的大文件场景。核心要确保创建BufferedReader时指定了正确的EBCDIC字符集(比如常见的IBM037),否则读取的字符会乱码。
代码示例
// 假设你的BufferedReader已正确初始化,且指定了EBCDIC编码(如IBM037) int checkCount = 5; // 要检查的前N个字符 int currentChar; int readCount = 0; try { while ((currentChar = bufferedReader.read()) != -1 && readCount < checkCount) { char ebcdicChar = (char) currentChar; // 按需处理字符,比如打印查看 System.out.printf("第%d个字符: %c (编码值: %d)%n", readCount + 1, ebcdicChar, currentChar); readCount++; } } catch (IOException e) { e.printStackTrace(); } finally { // 后续不再使用时关闭资源 try { if (bufferedReader != null) { bufferedReader.close(); } } catch (IOException e) { e.printStackTrace(); } }
关键说明
read()方法每次仅读取一个字符,返回该字符的Unicode编码值(int类型),完全不会触发大文件加载,避开了String的大小限制。- 创建
BufferedReader时必须指定正确的EBCDIC字符集,示例代码如下:
不同地区的EBCDIC编码可能有差异,比如BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(new FileInputStream("你的文件路径"), Charset.forName("IBM037")) );IBM1047也是常用类型,需根据文件实际编码调整。 - 之前用Scanner失败,大概率是因为Scanner默认使用系统编码而非EBCDIC,且部分Scanner方法会预读数据,相比之下
read()方法更直接可控。
内容的提问来源于stack exchange,提问作者Bruno Morato
相关产品推荐
相关产品推荐

