たとえば、サーバーは5秒ごとに、ファイルが特定のディレクトリに追加されているかどうかを確認します。はいの場合、それらを読み取って処理します。関連するファイルは非常に大きくなる可能性があるため(たとえば、100以上のMo)、それらを上記のディレクトリにコピー/アップロードするのに非常に時間がかかる可能性があります。
サーバーがコピー/アップロードが完了していないファイルにアクセスしようとするとどうなりますか?JAVAはこれらの同時アクセスをどのように管理しますか?サーバーのOSに依存しますか?
〜1300000行のTXTファイル(つまり、約200 Mo)をリモートサーバーからローカルコンピューターにコピーしてみました。これには約5秒かかります。この経過中に、次のJAVAクラスを実行します。
public static void main(String[] args) throws Exception {
String local = "C:\\large.txt";
BufferedReader reader = new BufferedReader(new FileReader(local));
int lines = 0;
while (reader.readLine() != null)
lines++;
reader.close();
System.out.println(lines + " lines");
}
次の例外が発生します。
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2882)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:515)
at java.lang.StringBuffer.append(StringBuffer.java:306)
at java.io.BufferedReader.readLine(BufferedReader.java:345)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at main.Main.main(Main.java:15)
ファイルのコピーが完了した後でクラスを実行すると、期待どおりの出力(つまり1229761 lines
)が得られるため、例外はファイルのサイズによるものではありません(最初に考えることができます)。OutOfMemoryError
この例外をスローしたバックグラウンドでJAVAは何をしていますか?