次のエディタは、Java で大きなファイルを読み取る際のメモリ オーバーフローの問題を完全に解決する記事を提供します。編集者はこれがとても良いものだと思ったので、皆さんの参考として今から共有します。エディターをフォローして見てみましょう
1. 従来の方法: メモリ内でファイルの内容を読み取ります
ファイル行を読み取る標準的な方法は、Guava と Apache Commons IO の両方が提供する簡単な方法です。ファイル行の読み取りは次のとおりです。
Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new File(path));
は、実際には BufferedReader またはそのサブクラス LineNumberReader を使用して読み取ります。
従来のアプローチの問題: ファイルが十分に大きいと、すぐにプログラムが OutOfMemoryError 例外をスローする原因となり、ファイルのすべての行がメモリに格納されることです。
問題について考える: 通常、ファイルのすべての行を一度にメモリに入れる必要はなく、ファイルの各行を走査して、対応する処理を実行するだけで済みます。処理後は捨ててください。したがって、すべての行をメモリに置くのではなく、行の反復によって読み取ることができます。
2. 大きなファイルの読み取り処理方法
繰り返し読み取りを行わず、メモリ不足を発生させずに大きなファイルを処理する:
(1) ファイルストリーミング方法: Scanner クラスを使用します。ファイルの内容を 1 行ずつ連続的に読み取ります
FileInputStream inputStream = null; Scanner sc = null; try { inputStream = new FileInputStream(path); sc = new Scanner(inputStream, UTF-8); while (sc.hasNextLine()) { String line = sc.nextLine(); // System.out.println(line); } }catch(IOException e){ logger.error(e); }finally { if (inputStream != null) { inputStream.close(); } if (sc != null) { sc.close(); } }
このソリューションは、ファイル内のすべての行を反復処理し、参照を維持せずに各行を処理できるようにします。 要するに、それらはメモリに保存されません。
(2) Apache Commons IO ストリーム: Commons IO ライブラリを使用して実装され、ライブラリ
LineIterator it = FileUtils.lineIterator(theFile, UTF-8); try { while (it.hasNext()) { String line = it.nextLine(); // do something with line } } finally { LineIterator.closeQuietly(it); }
によって提供されるカスタム LineIterator を使用します。 この解決策は、ファイル全体 がすべてメモリに格納されていないためです これも結果としてメモリ消費量がかなり控えめになります。
以上が大きなファイルの読み取り時のメモリ オーバーフローに対する Java ソリューションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。