逐行读取大文件(文件包含1.000.000行)并解析java中的某些行的最快方法是什么?例如,这是我文件的一个片段
INFO 00:02:12 - returning228885634
INFO 00:02:12 - Step is 1 for 228885634 statusOK duration 0.018
INFO 00:02:12 - Step is 2 for 228885634 statusOK duration 1.55
INFO 00:02:13 - START executing FOR test32967 at Mon Sep 23 00:02:13 GMT+00:00 2013
INFO 00:02:13 - Currently working 7
我只想从这个片段中解析测试的id(32967)!
答案 0 :(得分:3)
您可以尝试这样: -
try (SeekableByteChannel bytechanel= Files.newByteChannel(Paths.get("abc.txt"))) {
ByteBuffer byte1 = ByteBuffer.allocateDirect(1000);
for(;;) {
StringBuilder s = new StringBuilder();
int n = bytechanel.read(byte1);
// some code
}
}
同时寻找 java.nio.* 套餐
答案 1 :(得分:1)
对于像这样的事情,很难打败BufferedReader
。
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
String line = null;
while ((line = reader.readLine()) != null) {
//do something with line
}
} finally {
try {
reader.close();
} catch (IOException e) {
}
}
答案 2 :(得分:1)
使用Guava的Files.readLines()
方法,您可以为其提供LineProcessor
。
Files.readLines(new File("a_file.ext"), Charsets.UTF_8, new LineProcessor<String>() {
@Override
public boolean processLine(String line) throws IOException {
return line.contains("some identifier");
}
@Override
public String getResult() { // the @tring here is the generic type of LineProcessor, change it to whatever
//create a result, get your id or ids
return "";
}
});
答案 3 :(得分:0)
要处理大型文件,您可以利用新java包中的类来处理IO nio
包提供各种机制来管理这种类型的文件,具有相当的性能。
请参阅http://docs.oracle.com/javase/7/docs/api/java/nio/channels/package-summary.html
答案 4 :(得分:0)
如果您使用的是Java 8,则可以使用“文件和流”类来尝试此操作。
例如:
Files.newBufferedReader(Paths.get("somefile")).lines().map((t)-> r).collect(Collectors.toList());
还会查找来自java.nio.files
的java.nio.*和其他类