如何将txt文件中多单词一次性存入String数组并优化读取速度?
优化从文本文件读取单词到String数组的效率方法
你的代码存在两个核心性能问题:
- 频繁拼接固定大小数组:每次循环都通过
concatenate创建新数组并复制元素,数组不可变的特性会导致时间复杂度达到O(n²),文件越大速度越慢。 - 多余的字符串分割:
scnr.nextLine()已经读取了完整的一行内容(每行一个单词),再执行split("\r?\n|\r")完全是冗余操作,只会增加不必要的计算开销。
以下是几种高效的优化方案:
方案一:用ArrayList动态存储,最后转数组
这是最通用的优化方式,利用动态集合避免频繁数组扩容:
import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.Scanner; public class DictionaryReader { public static void main(String[] args) { ArrayList<String> wordList = new ArrayList<>(); // try-with-resources自动关闭Scanner,无需手动调用close() try (Scanner scnr = new Scanner(new File("dictionary.txt"))) { while (scnr.hasNextLine()) { String line = scnr.nextLine().trim(); // 跳过空行(可选,根据你的文件是否存在空行调整) if (!line.isEmpty()) { wordList.add(line); } } } catch (FileNotFoundException e) { e.printStackTrace(); } // 转成String数组,指定集合大小更高效 String[] words = wordList.toArray(new String[wordList.size()]); } }
方案二:Java 8+ 用Files类简化读取(适合小/中等大小文件)
利用NIO的Files类可以一行完成读取,底层用高效的BufferedReader实现:
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; public class DictionaryReader { public static void main(String[] args) { String[] words = new String[0]; try { // 一次性读取所有行到List List<String> lines = Files.readAllLines(Paths.get("dictionary.txt")); words = lines.toArray(new String[lines.size()]); } catch (IOException e) { e.printStackTrace(); } } }
如果是超大文件,可以用流式处理避免一次性加载所有内容到内存:
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.stream.Stream; public class DictionaryReader { public static void main(String[] args) { String[] words = new String[0]; try (Stream<String> lineStream = Files.lines(Paths.get("dictionary.txt"))) { words = lineStream .map(String::trim) .filter(line -> !line.isEmpty()) .toArray(String[]::new); } catch (IOException e) { e.printStackTrace(); } } }
方案三:用BufferedReader提升读取速度(适合大文件)
BufferedReader是字符流读取的高效实现,比Scanner少了正则解析的开销,大文件场景下速度更优:
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; public class DictionaryReader { public static void main(String[] args) { ArrayList<String> wordList = new ArrayList<>(); try (BufferedReader br = new BufferedReader(new FileReader("dictionary.txt"))) { String line; // 逐行读取直到文件末尾 while ((line = br.readLine()) != null) { line = line.trim(); if (!line.isEmpty()) { wordList.add(line); } } } catch (IOException e) { e.printStackTrace(); } String[] words = wordList.toArray(new String[wordList.size()]); } }
核心优化总结
- 抛弃固定大小数组的频繁拼接,改用
ArrayList这类动态集合存储元素 - 移除冗余的字符串分割操作,直接使用读取到的每行内容
- 用
try-with-resources语法自动关闭IO资源,避免资源泄漏 - 根据文件大小选择对应读取方式:小文件用
Files.readAllLines,大文件用流式处理或BufferedReader
内容的提问来源于stack exchange,提问作者Sheep_Walker
相关产品推荐
相关产品推荐

