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