You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java读取文件字符存入二维数组后输出异常问题求助

解决Java读取文本到二维char数组的输出混乱问题

嘿,作为Java新手遇到这种问题很正常,我帮你分析下代码里的核心问题,然后给你修正后的版本:

原代码的主要问题

  • 换行符处理逻辑错误:不同系统的换行符不一样(Windows是\r\n,Linux是\n),你用System.getProperty("line.separator").charAt(0)只判断了其中一个字符,会导致\r被当成普通字符统计,行数和字符数计算全错。
  • 数组赋值逻辑完全混乱:第二个循环里,每读取一个字符就用嵌套for循环把整个二维数组的所有位置都赋值成这个字符,这就难怪输出全是重复的+和.了,而且还提前打印了数组内容,直接导致输出混乱。
  • 行数统计不全:如果文件最后一行没有换行符,你的第一个循环不会统计这一行,导致numberOfLines少算一行。
  • 重复打开文件效率低:你用了两个Scanner分别读取文件,其实完全可以一次读取把内容存起来,避免重复IO操作。

修正后的代码

import java.util.*;
import java.io.*;

public class Doomday2 {
    public static void main(String args[]) throws FileNotFoundException {
        // 第一步:读取所有行,统计行数和列数
        Scanner lineScanner = new Scanner(new File(args[0]));
        List<String> fileLines = new ArrayList<>();
        int totalLines = 0;
        int columns = 0;

        while (lineScanner.hasNextLine()) {
            String line = lineScanner.nextLine();
            fileLines.add(line);
            totalLines++;
            // 取第一行的长度作为列数(题目说每行字符数相同)
            if (totalLines == 1) {
                columns = line.length();
            }
        }
        lineScanner.close();

        // 初始化对应尺寸的二维char数组
        char[][] charArray = new char[totalLines][columns];

        // 第二步:填充二维数组
        for (int i = 0; i < totalLines; i++) {
            String currentLine = fileLines.get(i);
            // 直接将字符串转为char数组赋值,简单高效
            charArray[i] = currentLine.toCharArray();
            
            // 如果需要逐个字符赋值(适合理解逻辑),可以替换成下面的代码:
            // for (int j = 0; j < columns; j++) {
            //     charArray[i][j] = currentLine.charAt(j);
            // }
        }

        // 第三步:打印数组内容(还原原文件格式)
        System.out.println("二维数组输出内容:");
        for (int i = 0; i < totalLines; i++) {
            for (int j = 0; j < columns; j++) {
                System.out.print(charArray[i][j]);
            }
            System.out.println(); // 每行结束换行,和原文件格式一致
        }

        // 打印统计信息
        System.out.println("\nNumber of lines: " + totalLines);
        System.out.println("Number of chars: " + (totalLines * columns));
        System.out.println("Number of columns: " + columns);
    }
}

代码说明

  1. 用nextLine()读取整行:直接跳过换行符的处理,准确获取每行内容,统计行数和列数更可靠。
  2. 用List暂存所有行:避免重复打开文件,后续填充数组时直接从List取数据,效率更高。
  3. 数组尺寸精准初始化:根据实际行数和列数创建数组,不用浪费空间创建1000x1000的大数组。
  4. 填充逻辑清晰:每行对应二维数组的一行,要么直接转char数组赋值,要么逐个字符填充,完全符合“按行存储”的需求。
  5. 打印格式友好:每行打印完换行,能清晰看到原文件的结构,不会出现混乱的输出。

内容的提问来源于stack exchange,提问作者mariatsamp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:10:05