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

Java文本读取至数组、读取异常排查及文本清理工具开发求助

嘿,来解决你的两个Java文件处理问题!

一、如何读取文本文件并存储到数组中

读取文本到数组的核心思路是先灵活收集所有行内容(毕竟提前不知道文件行数,数组长度固定不好直接用),再转成数组。给你几种常用的实用方法,按需选:

  • 方法1:用Scanner(适合小文件,写法直观)
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class FileToArray {
    public static void main(String[] args) {
        List<String> linesList = new ArrayList<>();
        try {
            // 重点:要传File对象,不是直接丢路径字符串!
            Scanner scanner = new Scanner(new File("C://Users//...//yourfile.txt"));
            while (scanner.hasNextLine()) {
                linesList.add(scanner.nextLine());
            }
            scanner.close();
            // 把列表转成数组
            String[] data = linesList.toArray(new String[0]);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • 方法2:用BufferedReader(大文件首选,效率更高)
    像你说的11万行大文件,用这个更靠谱,它逐行读取,内存占用小很多:
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;

public class FileToArray {
    public static void main(String[] args) {
        List<String> linesList = new ArrayList<>();
        // try-with-resources自动关流,不用手动写close了
        try (BufferedReader br = new BufferedReader(new FileReader("C://Users//...//yourfile.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                linesList.add(line);
            }
            String[] data = linesList.toArray(new String[0]);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • 方法3:Java 8+ 用Files类(一行代码搞定,简洁)
    如果你的项目用Java 8及以上,这个写法超级省事,不过超大文件要注意内存压力:
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

public class FileToArray {
    public static void main(String[] args) {
        try {
            List<String> linesList = Files.readAllLines(Paths.get("C://Users//...//yourfile.txt"));
            String[] data = linesList.toArray(new String[0]);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

二、排查你的读取器提前停止的问题

看了你贴的代码片段,一眼就发现了几个关键问题,咱们一个个捋:

1. Scanner初始化犯了低级错误!

你写的是:

Scanner input = new Scanner("C://Users//...");

这里你把路径字符串直接传给Scanner,它会把这个字符串当成要读取的内容,而不是去读取这个路径下的文件!这就导致它只读了一行(就是你的路径),自然很快就停止了,根本没碰你的11万行大文件。

正确的写法必须传File对象或者路径对象:

// 两种写法都可以
Scanner input = new Scanner(new File("C://Users//...//yourfile.txt"));
// 或者用Paths,更推荐
Scanner input = new Scanner(Paths.get("C://Users//...//yourfile.txt"));

2. 数组初始化的问题

你定义了String[] data = null;但没初始化长度,后面如果直接用data[i++]会直接触发空指针异常。必须先用List来收集每行内容,最后再转成数组,就像上面第一个问题里的做法。

3. 其他可能的坑(如果修正后还是有问题)

  • 编码问题:如果文件里有特殊字符(比如表情、非UTF-8编码的字符),Scanner默认用平台编码,可能读到一半就崩了。可以指定编码:
Scanner input = new Scanner(new File("yourfile.txt"), "UTF-8");
  • 换行符不标准:有些文件用\r而不是常见的\n,Scanner的hasNextLine()可能识别错,这时候自定义分隔符:
input.useDelimiter("\\r?\\n"); // 兼容所有换行格式
  • 大文件内存压力:11万行如果每行很长,Scanner可能内存不够,换成BufferedReader更稳妥,它的内存占用小很多。

最后给你修正后的完整代码

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class FileReader {
    public static void main(String[] args) {
        List<String> linesList = new ArrayList<>();
        // try-with-resources自动关闭资源,避免泄漏
        try (Scanner input = new Scanner(new File("C://Users//...//yourfile.txt"), "UTF-8")) {
            input.useDelimiter("\\r?\\n"); // 兼容所有换行符
            while (input.hasNextLine()) {
                linesList.add(input.nextLine());
            }
            String[] data = linesList.toArray(new String[0]);
            // 打印行数验证一下
            System.out.println("成功读取 " + data.length + " 行");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:01:47