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

如何将txt文件中多单词一次性存入String数组并优化读取速度?

优化从文本文件读取单词到String数组的效率方法

你的代码存在两个核心性能问题:

  1. 频繁拼接固定大小数组:每次循环都通过concatenate创建新数组并复制元素,数组不可变的特性会导致时间复杂度达到O(n²),文件越大速度越慢。
  2. 多余的字符串分割: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:57:48