我有个bmp图像,大小是512*499*24bit,766518 byte.
我用 FileInputStream fin = new FileInputStream(new File("C:\\hand.bmp"));
     System.out.println("还能读取字节数:"+fin.available());
输出的值是 257590 。 
我就不明白了,这两个数值之间差不多是3倍的关系,但还不是3,是2.9左右。谁能给我解释一下这个。
另外,如果用fin.read(),执行10次能得到10个int数值,这样的话字符流是读了10个字节吗?那就是说一个字节转换成一个int了?
我想把这个BMP图像的灰度矩阵读出来,24bit的图像是不是就是说,3个字节代表一个像素,这个我怎么读啊?
在线等,求助。

解决方案 »

  1.   

    public int available()throws IOException
    Returns:
    an estimate of the number of remaining bytes that can be read (or skipped over) from this input stream without blocking. public int read()throws IOException
    Returns:
    the next byte of data, or -1 if the end of the file is reached另外,InputStream是字节流,不是字符流。
      

  2.   

    InputStream是字节流,不是字符流。ByteStream。
      

  3.   

    FileInputStream是JAVA里的二进制比特流IO,你read()一次是读一个字节(8bit),available()还没用过,应该有自己的计算规则通常都是顶一个固定长度的字节数组作为缓冲,每次用read(byte[])方法往里面读定长的字节,该方法会返回实际读到的字节数,读到文件末尾会返回-1byte[] temp = new byte[1024];
    int lenth=0;
    while((lenth=(fin.read(temp))!=-1)
    {
       System.out.println("读到"+lenth+"字节");
    }
    fin.close();
      

  4.   

    1.fin.available()不是指硬盘上该文件的大小,fin会一次加载部分字节到内存缓存中,然后从内存中去读取,读完后继续从硬盘上加载,所以此方法查看的是缓存区可提供的字节数,故结果会小于文件大小。
    2.read返回的结果是int,可以强传为byte,实际读到的是一个byte,int型的前面24位为0,只有最后8位才会有效,所以强转为byte不会产生失去精度问题。
    3.这个应该是取出三个字节,然后拼接在一起吧。。
      

  5.   

    fin.available()不可能是内存中的大小。