Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.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中读取一个非常大的csv文件(比如3GB)的内存效率是什么?_Java_File_Lambda - Fatal编程技术网

在Java中读取一个非常大的csv文件(比如3GB)的内存效率是什么?

在Java中读取一个非常大的csv文件(比如3GB)的内存效率是什么?,java,file,lambda,Java,File,Lambda,我已经编写了两种方法来读取该文件 public static void parseCsvFile(String path) throws IOException { FileInputStream inputStream = null; Scanner sc = null; try { inputStream = new FileInputStream(path); sc = new Scanner(inputStream, "UTF-8

我已经编写了两种方法来读取该文件

 public static void parseCsvFile(String path) throws IOException {
    FileInputStream inputStream = null;
    Scanner sc = null;
    try {
        inputStream = new FileInputStream(path);
        sc = new Scanner(inputStream, "UTF-8");
        while (sc.hasNextLine()) {
            String line = sc.nextLine();
            //logger.info(line);
        }
        // note that Scanner suppresses exceptions
        if (sc.ioException() != null) {
            throw sc.ioException();
        }
    } finally {
        if (inputStream != null) {
            inputStream.close();
        }
        if (sc != null) {
            sc.close();
        }
    }
  }

    public static void parseCsvUsingJavaStream(String path) {
    try (Stream<String> stream = Files.lines(Paths.get(path))) {
         stream.forEach(System.out :: println);
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
  }
publicstaticvoidparsecsvfile(字符串路径)抛出IOException{
FileInputStream inputStream=null;
扫描仪sc=空;
试一试{
inputStream=新文件inputStream(路径);
sc=新扫描仪(输入流,“UTF-8”);
while(sc.hasNextLine()){
字符串行=sc.nextLine();
//logger.info(行);
}
//请注意,扫描仪会抑制异常
如果(sc.ioException()!=null){
抛出sc.ioException();
}
}最后{
如果(inputStream!=null){
inputStream.close();
}
如果(sc!=null){
sc.close();
}
}
}
公共静态void parseCsvUsingJavaStream(字符串路径){
try(Stream=Files.line(path.get(path))){
stream.forEach(System.out::println);
}捕获(ioe异常ioe){
ioe.printStackTrace();
}
}

从第一种方法中,我了解到,该方法不会将文件中的所有行一次加载到内存中,这是内存有效的。我想用lambda表达式实现同样的效果。我的问题是,我的第二种方法是否将所有行加载到内存中?如果是,那么我如何使我的第二种方法内存更高效?

您的问题的答案如下:

将文件中的所有行作为流读取。与readAllLines不同,此方法不会将所有行读取到列表中,而是在使用流时缓慢填充


第二个代码示例的内存效率应该与第一个代码示例大致相同。

使用streams api会导致与另一种方法大致相同的内存使用率,除非并行化该流

从:

将文件中的所有行作为流读取。与readAllLines不同,此方法不会将所有行读取到列表中,而是在使用流时缓慢填充

使用指定的字符集将文件中的字节解码为字符,并且支持readAllLines指定的相同行终止符

此方法返回后,从文件读取时发生的任何后续I/O异常或读取格式错误或不可映射的字节序列时发生的任何后续I/O异常都会被包装在一个未选中的异常中,该异常将从导致读取的Stream方法中抛出。如果在关闭文件时抛出IOException,它也会包装为未选中的IOException

返回的流封装了一个读卡器。如果需要及时处理文件系统资源,则应使用try-with-resources构造来确保在流操作完成后调用流的close方法

可能重复的