【发布时间】:2015-10-26 13:10:37
【问题描述】:
我有以下简单的代码,它从当前目录中的文件读取到字节数组并打印数组的内容(这是文件的内容,ASCII 可打印字符从 ASCII 32 到 ASCII 126):
import java.io.FileInputStream;
import java.io.IOException;
class Input {
public static void main(String[] args) throws IOException {
FileInputStream fis=null;
try {
fis=new FileInputStream("file.txt");
int available=fis.available();
byte[] read=new byte[available];
int bytesRead;
int offset=0;
while(offset<read.length) {
bytesRead=fis.read(read,offset,read.length-offset);
if (bytesRead==-1) break;
offset+=bytesRead;
}
System.out.println(read.length);
for (byte b:read) {
int i=b & 0xFF;
System.out.write(i);
System.out.write('\t');
}
}
finally {
if (fis != null)
try {
fis.close();
}
catch(IOException e) {
e.printStackTrace();
}
}
}
}
但是当它运行时,它只会在标准输出中打印 64 个字符(即使调试字符串在数组中打印了 96 个字节,因为它应该是..) 我不知道我做错了什么。
【问题讨论】:
-
file.txt的内容是什么?文件中的某些字符可能无法打印。你真的期待什么?请注意,像这样读取文件是不合理的,您正在创建一个大小与文件大小相同的数组(可能很大)。你对b&0xFF有什么期待? -
文件内容在问题中
-
@Jean-BaptisteYunès 显然每个 ASCII 字符都是从 32 到 126。虽然那是 95 个字符而不是 96...
-
@Siguza 是的,我包括删除,即 127
-
@Siguza - 我也复制了,通过设置可用的各种数字。我认为这可能是一个写入缓冲区刷新问题 - 我在 for(byte b:read) 循环之后添加了一个 println,并开始获取输出。
标签: java io inputstream