在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方法 可能重复的