Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从文件的行号n到行号m读取行?_Java_File_Readline - Fatal编程技术网

Java 如何从文件的行号n到行号m读取行?

Java 如何从文件的行号n到行号m读取行?,java,file,readline,Java,File,Readline,有没有一种方法可以从文件中读取从行号n到行号m的行 换句话说,我有一个超过100k条目的文件。我希望一次加载10k行,处理它们,然后加载下一个10k行,以便在有限的内存资源下运行。有什么方法可以做到这一点吗?你不能从任意一行开始阅读,但这不是你在问题的第二部分所说的。如果可以在整个过程中保留资源,您需要的是以下内容: int batchSize = 10000; try (BufferedReader br = Files.newBufferedReader(file.toPath())) {

有没有一种方法可以从文件中读取从行号n到行号m的行


换句话说,我有一个超过100k条目的文件。我希望一次加载10k行,处理它们,然后加载下一个10k行,以便在有限的内存资源下运行。有什么方法可以做到这一点吗?

你不能从任意一行开始阅读,但这不是你在问题的第二部分所说的。如果可以在整个过程中保留资源,您需要的是以下内容:

int batchSize = 10000;
try (BufferedReader br = Files.newBufferedReader(file.toPath())) {
    boolean eof = false;
    while (!eof) {
        List<String> batch = new ArrayList<>(batchSize);
        for (int i=0 ; i<batchSize ; i++) {
            String line = br.readLine();
            if (eof = line == null) break;
            batch.add(line);
        }
        processBatch(batch);
    }
}
int batchSize=10000;
try(BufferedReader br=Files.newBufferedReader(file.toPath())){
布尔eof=假;
而(!eof){
列表批次=新的ArrayList(batchSize);

对于(int i=0;我为什么不仅仅使用
BufferedReader
?如果你使用
readLine
,你已经在使用
BufferedReader
,对吗?使用,这是一个
BufferedReader
,支持行号。@Jean Logeart是的,我已经在使用BufferedReader了,但是为了获取第二批,我从一开始就开始了删除文件并跳过所有已提取的行。这是一项成本高昂的操作,而且,当批大小很小且总行数太多时,这将在时间上产生大量开销。是否有任何方法可以避免这种情况。@Andreas:您能给我举个例子,比如如何从n行提取到n行吗m通过使用LineNumberReader和BufferedReader?我可以使用LineNumberReader访问一行。您能告诉我如何使用BufferedReader从该行获取行,而不跳过n行之前的所有行吗?嗨,第一批可以很容易地获取,但我最终会跳过已获取批中的所有行ch下一批。这将导致时间延迟。实际上,我正在尝试一次从文件中批量获取所有行,共10k行。@Dici我发现最好用一个额外的括号澄清
(eof=line==null)
(eof=(line==null))
@Dici内联赋值通常是错误的,因此如果(line==null)可能是
{eof=true;break;}
更好。