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); } }
代码说明
- 用
nextLine()读取整行:直接跳过换行符的处理,准确获取每行内容,统计行数和列数更可靠。 - 用List暂存所有行:避免重复打开文件,后续填充数组时直接从List取数据,效率更高。
- 数组尺寸精准初始化:根据实际行数和列数创建数组,不用浪费空间创建1000x1000的大数组。
- 填充逻辑清晰:每行对应二维数组的一行,要么直接转char数组赋值,要么逐个字符填充,完全符合“按行存储”的需求。
- 打印格式友好:每行打印完换行,能清晰看到原文件的结构,不会出现混乱的输出。
内容的提问来源于stack exchange,提问作者mariatsamp
相关产品推荐
相关产品推荐

