每隔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