我尝试阅读上传文件的内容。我使用的库是gwtupload
,它使用Apache FileUpload
库。上传的文件是22个字节,但是当我用Scanner
或BufferedReader
读取它时,最后一行需要很长时间才能解析。这是我的代码片段以及执行结果:
代码:
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
。
答案 0 :(得分:0)
您当前的问题是(我怀疑)您正在阅读的文件正在使用\r\n
作为其行终止符。您的代码假设行终止符是一个字符。
第二个问题是您的代码正在计算字符大小,但您要检查的大小(很可能)是以字节为单位的大小。如果您的文件以编码方案编码,其中一个字符可能由多个字节表示,则会中断;例如UTF-8。
最后一个问题是您使用平台的默认字符集来解码文件。但是,如果您从随机服务器下载该文件,则可以使用不同的字符集对其进行编码。
上传的文件来自Win 7盒子,但我不认为它对扫描仪有用,因为它会检查所有可能的行终止符。
你不明白我说的话。问题是以下几行:
sb2.append(line).append("\n");
System.out.println(sb2.length())
这些假设文件中使用的行终止长度与"\n"
的长度相同。如果实际的行终止是"\r\n"
,那么这是不正确 ...因为它很可能是在文件来自Windows时。
(阅读器和扫描仪部件中都会显示相同的代码。)