每 5 秒(例如),服务器会检查文件是否已添加到特定目录。如果是,它会读取并处理它们。相关文件可能很大(例如 100+ Mo),因此将它们复制/上传到所述目录可能会很长。
如果服务器尝试访问尚未完成复制/上传的文件怎么办?JAVA 如何管理这些并发访问?它是否取决于服务器的操作系统?
我试了一下,将一个~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
),因此异常不是由于文件的大小(正如我们首先想到的那样)。JAVA 在后台做什么,引发了这个OutOfMemoryError
异常?