我是java的新手,我正在阅读一个~25 MB的文件,加载它需要很长时间......有没有其他方法可以让它更快?是扫描仪无法处理大文件吗?
String text = "";
Scanner sc = new Scanner(new File("text.txt"));
while(sc.hasNext()) {
text += sc.next();
}
您在每次迭代时都连接到文本,并且字符串在 Java中是不可变的。这意味着String
每次text
“修改”时它都会在内存中创建一个新对象,从而导致大文件的加载时间很长。当您不断更改 a 时,您应该始终尝试使用a 。StringBuilder
String
你可以这样做:
StringBuilder text = new StringBuilder();
Scanner sc = new Scanner(new File("text.txt");
while(sc.hasNext()) {
text.append(sc.next());
}
当你想访问文本的内容时,你可以调用text.toString()
.
它是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 等。
尝试使用BufferedStreams
,例如,BufferedInputStream, BufferedReader
他们会加速它。有关BufferedStreams
查看此处的更多信息;
http://docs.oracle.com/javase/tutorial/essential/io/buffers.html
而不是String
使用,StringBuilder
因为String
s 在 中是不可变的Java
,它将在循环String
的每次迭代中创建一个新的while