读取上传文件的内容时尺寸错误

时间:2011-09-13 02:57:26

标签: java file-upload

我尝试阅读上传文件的内容。我使用的库是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.从字符21到29,ASCII代码为0

1 个答案:

答案 0 :(得分:0)

您当前的问题是(我怀疑)您正在阅读的文件正在使用\r\n作为其行终止符。您的代码假设行终止符是一个字符。

第二个问题是您的代码正在计算字符大小,但您要检查的大小(很可能)是以字节为单位的大小。如果您的文件以编码方案编码,其中一个字符可能由多个字节表示,则会中断;例如UTF-8。

最后一个问题是您使用平台的默认字符集来解码文件。但是,如果您从随机服务器下载该文件,则可以使用不同的字符集对其进行编码。


  

上传的文件来自Win 7盒子,但我不认为它对扫描仪有用,因为它会检查所有可能的行终止符。

你不明白我说的话。问题是以下几行:

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

这些假设文件中使用的行终止长度与"\n"的长度相同。如果实际的行终止是"\r\n",那么这是不正确 ...因为它很可能是在文件来自Windows时。

(阅读器和扫描仪部件中都会显示相同的代码。)