A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 xuhao3622603 于 2015-6-26 09:29 编辑

首先所有的输入流类中都有read(byte[] b) 这个方法。我想,只要用了这个方法,其实就是在用缓冲技术,
事实上看视频上老师演示BufferedInputStream的原理,也是用了read(byte[] b) 的方法,然后一个个从数组里面取出来,然后return出去。
那么BufferedInputStream有什么用?
不用它一样可以使用缓冲来读跟写。
例如下面的代码


import java.io.*;
class abc
{
        public static void main(String[] args) throws IOException
        {
                FileInputStream fis = new FileInputStream("d:\\02.jpg");
                FileOutputStream fos = new FileOutputStream("d:\\00000000.jpg");

                byte[] a = new byte[1024*4];
                int ch;

                while((ch=fis.read())!=-1)
                {
                        fis.read(a);

                        fos.write(a);
                        
                }
        }
}


那么问题就来了,我写的这个demo可以运行,也创建了文件并且传了数据,但是数据大小跟源文件差了1k,很显然哪里出错了。
但是的思路哪里错了,我实在想不出来,希望高手解答。

11 个回复

倒序浏览
问题是出现在了这段代码了
  1. byte[] a = new byte[1024*4];
  2.                 int ch;

  3.                 while((ch=fis.read())!=-1)
  4.                 {
  5.                         fis.read(a);

  6.                         fos.write(a);
  7.                         
  8.                 }
复制代码


修改为下面就可以了
  1. byte[] a = new byte[1024*4];
  2.         int ch;

  3.         while((ch=fis.read())!=-1)
  4.         {
  5.                 fis.read(a,0,ch);

  6.                 fos.write(a,0,ch);
  7.                
  8.         }
复制代码
回复 使用道具 举报
苟苟 发表于 2015-5-1 20:56
问题是出现在了这段代码了

首先,感谢您回复我。
不过按您说的改过后,我觉得更有问题。
我的代码中ch是read()的返回值,也就是说是字符的ascii码,把它放进去,不觉得很奇怪吗?当然如果我的想法不对,请指正。

还有,其实除了这个错误外,我最想知道的是,如果不用bufferdeinputstream就能实现缓冲,那要他干嘛?
回复 使用道具 举报
有没有大神来帮忙看下
回复 使用道具 举报
会不会是没有关流的原因?
回复 使用道具 举报
class abc
{
         public static void main(String[] args) throws IOException
         {
                 FileInputStream fis = new FileInputStream("d:\\02.jpg");
                 FileOutputStream fos = new FileOutputStream("d:\\00000000.jpg");

                 byte[] arr = new byte[1024*4];
                 int len;

                 while((len=fis.read())!=-1)
                 {
                        fos.write(arr,0,len);
                 }
                 fis.close();
                 fos.close();


         }
}
回复 使用道具 举报
wk843620202 发表于 2015-5-2 02:28
class abc
{
         public static void main(String[] args) throws IOException

感谢回答,但你这个也不对的。
我想出来正确的怎么写了。
import java.io.*;



class abc
{
        public static void main(String[] args) throws IOException
        {
                FileInputStream fis = new FileInputStream("d:\\02.jpg");
                FileOutputStream fos = new FileOutputStream("d:\\00000000.jpg");

                byte[] a = new byte[1024*4];
                int ch;

                while((ch=fis.read(a))!=-1)
                {
                       

                        fos.write(a,0,ch);
                       
                }
        }
}
我原来写的代码,while判断的时候read了一下,指针向后走了一下,然后下面又read([])了一下,原来read的那个字符,就无法写入了。
那么这个是用到了缓冲吧?其实我写这个代码,就是因为关于缓冲有疑问。
我写的代码是自定义了一个数组缓冲区,那么BufferedInputStream是已经封装好了缓冲区,同时增加了功能。
回复 使用道具 举报
yihuihua 发表于 2015-5-2 00:49
会不会是没有关流的原因?

感谢回答,我已经想出来正确的该怎么写。
import java.io.*;
class abc
{
        public static void main(String[] args) throws IOException
        {
                FileInputStream fis = new FileInputStream("d:\\02.jpg");
                FileOutputStream fos = new FileOutputStream("d:\\00000000.jpg");

                byte[] a = new byte[1024*4];
                int ch;

                while((ch=fis.read(a))!=-1)
                {
                       

                        fos.write(a,0,ch);
                       
                }
        }
}

我原来写的代码,while判断的时候read了一下,指针向后走了一下,然后下面又read([])了一下,原来read的那个字符,就无法写入了。
那么这个是用到了缓冲吧?其实我写这个代码,就是因为关于缓冲有疑问。
我写的代码是自定义了一个数组缓冲区,那么BufferedInputStream是已经封装好了缓冲区,同时增加了功能。
回复 使用道具 举报
都好牛逼的感觉啊
回复 使用道具 举报
xuhao3622603 发表于 2015-5-2 09:02
感谢回答,但你这个也不对的。
我想出来正确的怎么写了。
import java.io.*;

应该改为这个:while((len=fis.read(arr))!=-1)
回复 使用道具 举报
xuhao3622603 发表于 2015-5-1 21:09
首先,感谢您回复我。
不过按您说的改过后,我觉得更有问题。
我的代码中ch是read()的返回值,也就是说 ...

read(byte[] buf)返回的是读入缓冲区的字节总数,也就是缓冲区内存入多少个字节,不是字符的编码值
回复 使用道具 举报
来这一趟涨知识了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马