日期:2014-05-20  浏览次数:20908 次

关于文件IO读取一个简单问题
请教前辈:
      这是关于文件IO读取的一段代码,代码本身没有错误,现在我感到疑惑的是:
为什么加了此句System.out.println("Total read bytes:"+fis.read(bytes));循环体内的内容不读取,注释此条语句则可以读取文件内的全部内容,难道fis.read(bytes)取这个值后,n就等于-1了吗?


FileInputStream fis=null;
try {
fis=new FileInputStream(f);

//定义一个字节数组,逐块读入至内存缓冲区中,
byte[] bytes=new byte[1024];
int n=0;//实际读取的字节数

System.out.println("Total read bytes:"+fis.read(bytes));
//-1表示文件已读完
while((n=fis.read(bytes))!=-1){
//将字节转换成字符串
String str=new String(bytes,0,n);
System.out.println(str); 
}


------解决方案--------------------
如文件大小小于1024,则语句System.out.println("Total read bytes:"+fis.read(bytes));一次就把文件内容读完了,进入循环后,再读n=-1了,干脆不进循环了。
稍微改一下:

FileInputStream fis=null;
try 
{
fis=new FileInputStream(f);
//定义一个字节数组,逐块读入至内存缓冲区中,
byte[] bytes=new byte[1024];
int n=0;//实际读取的字节数

//System.out.println("Total read bytes:"+fis.read(bytes));//--------------这不输出
//-1表示文件已读完
while((n=fis.read(bytes))!=-1)
{
//将字节转换成字符串
System.out.println("Total read bytes:"+n);//--------------这输出读入的大小。
String str=new String(bytes,0,n);
System.out.println(str); 
}

------解决方案--------------------
引用:
没整明白,读取了文件的大小,与读取文件的内容有什么关系?会影响循环条件吗?

read(bytes)的作用不是读取文件的大小。你在执行这一句时,说不定已经把文件中所有字节都读到bytes里面了。所以可能不会再进循环。
引用
public int read(byte[] b)
         throws IOException从此输入流中将最多 b.length 个字节的数据读入一个字节数组中。在某些输入可用之前,此方法将阻塞。 

覆盖:
类 InputStream 中的 read
参数:
b - 存储读取数据的缓冲区。 
返回:
读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回 -1。 
抛出: 
IOException - 如果发生 I/O 错误。
另请参见:
InputStream.read(byte[], int, int)

你要是想计算一共读了多少字节,就得定义一个变量,然后在循环里做累加。
FileInputStream fis=null;
try {
fis=new FileInputStream(f);

//定义一个字节数组,逐块读入至内存缓冲区中,
byte[] bytes=new byte[1024];
int n=0;//实际读取的字节数
int sum=0;//累计读取字节数
//System.out.println("Total read bytes:"+fis.read(bytes));
//-1表示文件已读完
while((n=fis.read(bytes))!=-1){
//将字节转换成字符串
sum+=n;
String str=new String(bytes,0,n);
System.out.println(str); 
}
System.out.println("Total read bytes:"+sum);