3

我是java的新手,我正在阅读一个~25 MB的文件,加载它需要很长时间......有没有其他方法可以让它更快?是扫描仪无法处理大文件吗?

String text = "";
Scanner sc = new Scanner(new File("text.txt"));
while(sc.hasNext()) {
text += sc.next();
}
4

3 回答 3

8

您在每次迭代时都连接到文本,并且字符串在 Java中是不可变的。这意味着String每次text“修改”时它都会在内存中创建一个新对象,从而导致大文件的加载时间很长。当您不断更改 a 时,您应该始终尝试使用a 。StringBuilderString

你可以这样做:

StringBuilder text = new StringBuilder();
Scanner sc = new Scanner(new File("text.txt");
while(sc.hasNext()) {
  text.append(sc.next());
}

当你想访问文本的内容时,你可以调用text.toString().

于 2013-08-06T06:44:44.427 回答
4

它是String +=, 每次都会创建一个不断增长的新 String 对象。事实上,对于小于 25 MB 的空间,可以做到(以下):

StringBuilder sb = new StringBuilder();
BufferReader in = new BufferedReader(new InputStreamReader(
    new FileInputStream(new File("text.txt"), "UTF-8")));
for (;;) {
    String line = in.readLine();
    if (line == null)
        break;
    sb.append(line).append("\n");
}
in.close();
String text = sb.toString();

readLine产生换行符之前的行,不包括它们。

在 Java 7 中可以这样做:

Path path = Paths.get("text.txt");
String text = new String(Files.readAllBytes(path), "UTF-8");

编码是明确给出的,如 UTF-8。“Windows-1252”将用于 Windows Latin-1 等。

于 2013-08-06T06:45:45.323 回答
1

尝试使用BufferedStreams,例如,BufferedInputStream, BufferedReader他们会加速它。有关BufferedStreams查看此处的更多信息; http://docs.oracle.com/javase/tutorial/essential/io/buffers.html

而不是String使用,StringBuilder因为Strings 在 中是不可变的Java,它将在循环String的每次迭代中创建一个新的while

于 2013-08-06T06:44:16.743 回答