1. 개요
이 튜토리얼은 Java에서 큰 파일을 효율적으로 읽는 방법을 보여줍니다. Java- 기본으로 돌아갑니다.
2. 메모리에서 읽으십시오
파일 줄을 읽는 표준 방법은 메모리에서 읽는 것입니다. Guava와 Apachecommonsio는 모두 파일 줄을 빠르게 읽는 방법을 제공합니다.
Files.readLines(new File(path), Charsets.UTF_8);
FileUtils.readLines(new File(path));
이 방법의 문제점은 파일의 모든 줄이 메모리에 저장되며 파일이 충분히 커지면 프로그램이 빠르게 untofMemoryError 예외를 던지게된다는 것입니다.
예를 들어 : 약 1G의 파일을 읽으십시오.
@testpublic void subleusingguava_wheniteratingafile_thenworks ()는 ioexception {string path = ... files.readlines (새 파일 (path), charsets.utf_8);}이 방법은 처음에 소량의 메모리 만 차지합니다. (약 0MB의 메모리를 소비합니다)
[메인] 정보 org.baeldung.java.corejavaiounittest- 총 기억 : 128 MB [메인] 정보 org.baeldung.java.corejavaiounittest- 무료 메모리 : 116 MB
그러나 모든 파일을 메모리로 읽으면 마침내 볼 수 있습니다 (약 2GB의 메모리가 소비됩니다).
[메인] 정보 org.baeldung.java.corejavaiounittest- 총 기억 : 2666 MB [메인] 정보 org.baeldung.java.corejavaiounittest- 무료 메모리 : 490 MB
이는이 프로세스가 약 2.1GB의 메모리를 소비한다는 것을 의미합니다. 그 이유는 간단합니다. 이제 파일의 모든 줄은 메모리에 저장됩니다.
파일의 모든 내용을 메모리에 넣으면 사용 가능한 메모리가 아무리 큰 메모리가 아무리 큰 메모리가 빠르게 실행됩니다. 이것은 분명합니다.
또한 일반적으로 파일의 모든 줄을 한 번에 메모리에 넣을 필요는 없습니다. 대신 파일의 각 줄을 가로지고 해당 처리를 수행 한 후 처리 후 버리기 만하면됩니다. 그래서 그것은 우리가 할 일입니다. 모든 행을 메모리에 넣는 대신 행을 반복합니다.
3. 파일 스트림
이제이 솔루션을 살펴 보겠습니다. java.util.scanner 클래스를 사용하여 파일의 내용을 스캔하고 연속적으로 라인별로 읽습니다.
fileInputStream inputStream = null; 스캐너 sc = null; try {inputStream = new FileInputStream (path); SC = 새 스캐너 (InputStream, "UTF-8"); while (sc.hasnextline ()) {String line = sc.nextline (); // system.out.println (line); } // 스캐너는 (sc.ioException ()! = null) {sc.ioException (); }} 마침내 {if (inputStream! = null) {inputStream.close (); } if (sc! = null) {sc.close (); }}이 솔루션은 파일의 모든 라인을 가로 지르며,이를 참조하지 않고 각 라인을 처리 할 수 있습니다. 어쨌든, 그들은 메모리에 저장되지 않았습니다 : (약 150MB의 기억이 소비되었습니다)
[메인] Infoorg.baeldung.java.corejavaiounittest-Totalmemory : 763MB
[메인] Infoorg.baeldung.java.corejavaiounittest-freememory : 605MB
4. Apachecommonsio 스트림
라이브러리에서 제공 한 사용자 정의 라인 테이터를 사용하여 Commonsio Library를 사용하여 구현할 수도 있습니다.
lineIterator it = fileUtils.lineIterator (theFile, "utf-8"); try {while (while (it.hasnext ()) {String line = it.nextline (); // line}}}} 마침내 {lineiterator.closequietly (it);}전체 파일이 메모리에 저장되지 않기 때문에 이것은 다소 보수적 인 메모리 소비로 이어집니다. (약 150MB의 메모리가 소비됩니다)
[main] infoo.b.java.corejavaiointegrationtest-totalmemory : 752MB
[main] infoo.b.java.corejavaiointegrationtest-freememory : 564MB
5. 결론
이 짧은 기사에서는 반복적 인 읽기 및 메모리가 부족하지 않고 큰 파일을 처리하는 방법에 대해 설명합니다. 이는 큰 파일을 처리하는 데 유용한 솔루션을 제공합니다.
이 모든 예제는 GitHub 프로젝트에서 구현되고 코드 스 니펫을 구현합니다.이 프로젝트는 Eclipse 기반 프로젝트이므로 쉽게 가져오고 실행해야합니다.
위의 것은 대형 파일의 Java 효율적인 읽기에 대한이 기사의 모든 내용입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!