以下代码测试通过import java.io.*;
public class aa
{
public static void main(String args[])  throws IOException

FileInputStream fp=new FileInputStream("cls.bat");
byte b[]=new byte[1000];
int n=0;
while((fp.read(b,n,1)!=-1)&&n<1000)  //注意此处的b是不加下标的,WHY???
{
System.out.print((char)b[n]);
n++;
}
}
}我有问题的是这一句:fp.read(b,n,1)!=-1   //每调用一次read函数就读入一个字节给b,   为什么不是用b[n]?而是直接用b?

解决方案 »

  1.   

    read
    public int read(byte[] b,
                    int off,
                    int len)
             throws IOException从此输入流中将最多 len 个字节的数据读入一个字节数组中。在某些输入可用之前,此方法将阻塞。 覆盖:
    类 InputStream 中的 read
    参数:
    b - 存储读取数据的缓冲区。
    off - 数据的起始偏移量。
    len - 读取的最大字节数。 
    返回:
    读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回 -1。 
    抛出: 
    IOException - 如果发生 I/O 错误。
    另请参见:
    InputStream.read()
      

  2.   

    2楼的并没有解答我的疑问呀,,
    我知道怎么用,只是想知为什么? 
    I know "How",but I don't know "WHY"while((fp.read(b,n,1)!=-1)&&n<1000)  {}上面的循环每一个字节就读一次,理论说每读一次只是读取一个字符按顺序放到b中,不是应该用 b[n]才表示一个字符的吗??   为什么用b,而不用b[n]?
      

  3.   

    我不知道为什么程序要写成没次只读一个字节,这样效率会很低。
    InputStream里如果提供你说的方法了,你完全可以使用。
      

  4.   

    1、关于楼主的问题!你可以看看API中,read中b直接定义为byte[],即你给传入的数字它自动添到数组中,你如果写b[],编译会报错,传入的参数错误,参数是byte型而不是byte[]型。
    2、其实按字节读取效率并不低,当我们只是为了复制而不读取其中内容的时候,按字节比按字符要好很多。
      

  5.   

    read(b)是读的是b.length长度的字节 read(b,int off,int len)读的是len长度的  你那个N 是读的时候的起始位置