2011-09-13 24 views
0

我嘗試讀取上傳文件的內容。我使用的庫是gwtupload,它使用Apache FileUpload庫。上傳的文件是22字節,但是當我用ScannerBufferedReader讀取它時,最後一行需要很長時間才能解析。這裏是我的代碼片段與執行結果一起:讀取上傳文件內容時尺寸錯誤

代碼:

 for (FileItem item : sessionFiles) { 
      System.out.println("FileItem.size() = " + item.getSize()); 
      // Read with a scanner 
      System.out.println("Read with a Scanner"); 
      Scanner scanner = new Scanner(item.getInputStream()); 
      while (scanner.hasNextLine()) { 
       sb.append(scanner.nextLine()).append("\n"); 
       System.out.println(sb.length()); 
      } 
      // Read with a Reader 
      System.out.println("Read with a Reader"); 
      StringBuffer sb2 = new StringBuffer(); 
      BufferedReader reader = new BufferedReader(
        new InputStreamReader(item.getInputStream())); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       sb2.append(line).append("\n"); 
       System.out.println(sb2.length()); 
       // if (sb2.length() + 1 == item.getSize()) { 
       // break; 
       // } 
      } 
      for (int i = 0; i < 30; i++) { 
       System.out.println(String.format("%d: %c [%d]", i, 
         sb2.charAt(i), (int) sb2.charAt(i))); 
      } 
      System.out.println("End"); 

結果:

FileItem.size() = 22 
Read with a Scanner 
21 
1047552 
Read with a Reader 
21 
1047552 
0: I [73] 
1: d [100] 
2: , [44] 
3: D [68] 
4: a [97] 
5: t [116] 
6: e [101] 
7: , [44] 
8: [32] 
9: D [68] 
10: e [101] 
11: s [115] 
12: c [99] 
13: r [114] 
14: i [105] 
15: p [112] 
16: t [116] 
17: i [105] 
18: o [111] 
19: n [110] 
20: 
[10] 
21: 

Eclipse控制檯顯示的字符,直到29但當我粘貼控制檯,它停止從21到29,ASCII代碼是0

回答

0

你的直接問題是(我懷疑)你正在閱讀的文件是使用\r\n作爲它的行結束符。你的代碼假設行結束符是一個字符。

第二個問題是您的代碼正在計算字符大小,但是您檢查的大小(最可能)是以字節爲單位的大小。如果你的文件被編碼爲一個字符可能由多個字節表示的編碼方案,這將會中斷;例如UTF-8。

最後一個問題是您正在使用平臺的默認字符集來解碼文件。但是,如果您從隨機服務器下載該文件,則可能會將其編碼爲不同的字符集。


上傳的文件來自一個Win 7的框,但我不認爲它應該的問題了掃描儀,因爲它會檢查所有可能的行終止。

你不明白我在說什麼。問題是下列行:

sb2.append(line).append("\n"); 
System.out.println(sb2.length()) 

這些都假設在文件中使用的線路終端的長度是一樣的"\n"長度。而這是不是真如果實際行終止是"\r\n" ...因爲它很可能是文件來自Windows時。

(相同的代碼同時出現在閱讀器和掃描儀的部分。)

+0

上傳的文件來自'贏7'框,但我不認爲它應該的問題了'Scanner',因爲它會檢查所有可能的行終止符。 'private static final String LINE_SEPARATOR_PATTERN =「\ r \ n | [\ n \ r \ u2028 \ u2085 \ u0085]」;'使用'hasNextLine()'或'nextLine()'方法。 – Sydney