Java使用FileReader.read()读取字符转char存数组时数组为空的问题
代码存在的具体问题
- 下标操作顺序错位:
charArray[counter] = (char)charInt;存完值才执行counter--,下一行打印charArray[counter]时,指向的是计数器减1后的空白位置,根本读不到刚存入的字符。 - 赋值方向完全颠倒:代码写的是
charArray[counter] = sortedQuote[secondCounter];,本意是把读到的字符存进sortedQuote,结果反而把sortedQuote的默认空字符(char类型默认值\u0000)赋值给了charArray,两个数组自始至终都没存入有效读取内容。 - 打印下标错位:执行
secondCounter++后再打印sortedQuote[secondCounter],此时指向的是下一个还没存值的空位置,自然输出为空。 - 缺失有效内容计数:两个数组都初始化为1000长度,没有记录实际读取的字符总数,后续直接遍历整个数组打印时,会输出大量默认空字符,观感上和数组全空没有区别。
- 隐性空指针风险:
fr初始为null,若文件找不到触发异常进入finally块时,直接调用fr.close()会抛空指针异常。
修正后可正常运行的代码
import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class ReversedQuotation { public static void main(String[] args) { char[] reversedQuote = new char[1000]; int counter = reversedQuote.length - 1; int totalReadCount = 0; FileReader fr = null; try { fr = new FileReader("/Users/cal/Desktop/backwards.txt"); while(true) { try { int charInt = fr.read(); if(charInt == -1) break; // 从数组末尾向前倒序存储读取到的字符 reversedQuote[counter] = (char)charInt; // 实时验证读取内容正常 System.out.print((char)charInt); counter--; totalReadCount++; } catch (IOException e) { System.out.println("读取文档时发生IO错误"); e.printStackTrace(); } } // 仅打印实际存储的有效反转内容 System.out.println("\n文件内容反转后效果:"); for(int i = reversedQuote.length - totalReadCount; i < reversedQuote.length; i++){ System.out.print(reversedQuote[i]); } } catch (FileNotFoundException e) { System.out.println("未找到目标文档错误"); } finally { if(fr != null) { try { fr.close(); } catch(IOException e) { System.out.println("关闭FileReader时发生错误"); } } } } }
核心调整说明
- 移除冗余的双数组设计,仅保留一个数组用于存储反转内容,从数组最大下标向前依次存值,天然实现内容倒序效果,避免赋值方向写反的问题。
- 调整下标操作顺序:先完成存值,再移动计数器,杜绝下标错位读取。
- 新增
totalReadCount计数器记录实际读取的字符数,打印时只输出有有效内容的片段,不会输出数组初始化的空字符。 - 在finally块增加
fr的非空判断,避免文件未找到时触发空指针异常。
内容的提问来源于stack exchange,提问作者Cal
相关产品推荐
相关产品推荐

