You need to enable JavaScript to run this app. Java使用FileReader.read()读取字符转char存数组时数组为空的问题
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.04 01:54:00