每隔5秒(例如),服务器会检查文件是否已添加到特定目录。如果是,它会读取并处理它们。有关文件可能相当大(例如100多莫),因此将它们复制/上传到上述目录可能会很长。读取尚未完成复制/上传的文件内容
如果服务器试图访问尚未完成复制/上传的文件,该怎么办? 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在后台做什么,抛出了这个异常呢?
您是否尝试过使用大量的Xmx来确保它不是真正的OOME? – assylias 2013-03-04 11:34:26
我的猜测是,readLine()在某种程度上实际上没有找到换行符(可能是因为换行符由于某种原因,不同的O.S.或某种编码问题而不同),并且一次读取非常大的行。 – ddmps 2013-03-04 11:40:05
@assylias我试着用最大1 Gb的JAVA堆大小(即'-Xmx1024m')尝试,但仍然抛出异常。 – sp00m 2013-03-04 13:18:24