我有一个大文本文件,我想读它,当我尝试这样做没有任何操作,如从这个文件添加一些文本列出它读取文件最大到一分钟,但当我尝试添加一些文本到arrayList和接下来我想做一些操作太慢,你知道我怎么能读取这些数据并使用它? 这是我的代码:
public class ReaderTEst {
public static void main(String[] args) throws IOException {
List<String> graphList = new ArrayList<>();
List<String> edgeList = new ArrayList<>();
FileInputStream inputStream = null;
Scanner sc = null;
try {
inputStream = new FileInputStream("myText.txt");
sc = new Scanner(inputStream, "UTF-8");
while (sc.hasNextLine()) {
String line = sc.nextLine();
line = line.replace("\uFEFF", "");//i use UTF-8 file so I need delete unneeded character
if (Character.isWhitespace(line.charAt(0))) {
edgeList.add(line.trim());
} else {
graphList.add(line);
}
}
if (sc.ioException() != null) {
throw sc.ioException();
}
} finally {
if (inputStream != null) {
inputStream.close();
}
if (sc != null) {
sc.close();
}
}
}
} 这需要很多时间,你知道它会更快吗?我有600 MB的文件txt 当我改变时:
List<Integer> graphList = new ArrayList<>(1);
int i = 0;
while (sc.hasNextLine()) {`String line = sc.nextLine();`
line = line.replace("\uFEFF", "");//i use UTF-8 file so I need delete unneeded character
graphList.add(i++);
}
我工作,但是当我想要放字符串时需要很长时间
答案 0 :(得分:1)
您应该使用BufferedReader.readLine()
。你可以用每秒读取数百万行。 Scanner
对你正在做的事情来说太过分了。
但\uFEFF
不是文字。这个真的是一个文本文件吗?这是BOM标记吗?在这种情况下,它只会在第一行的开头:不需要在每一行扫描它。
答案 1 :(得分:0)
您的主要问题如下:
List<String> graphList = new ArrayList<>();
List<String> edgeList = new ArrayList<>();
您应该使用初始容量初始化每个List
,以便JVM不需要自动扩展后备阵列。
line = line.replace("\uFEFF", "");
这也会减慢您的计划速度。每行\uFEFF
的频率是多少?在尝试替换之前,我会检查该行是否包含\uFEFF
。
除此之外,还有其他优化措施;也许你可以利用FileChannel
来阅读文件,但这是关于它的。
答案 2 :(得分:0)
首先,由于架构特性,我建议使用List的LinkedList实现。因此,ArrayList是内置数组,LinkedList包含在节点上。 ArrayList创建新的更大的数组并将旧的数组复制到新数组,然后达到一些能力。 Oracle有关于此的完美文档,我向您推荐LinkedList ArrayList