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
相关产品推荐
相关产品推荐

