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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 Alan 于 2013-4-17 10:10 编辑

复习IO流  写了段代码复制一张图片,可运行结果复制的图片都是0KB ,就完成了新建,不知道问题出在哪里,求告诉高手浏览下
import java.io.*;
class MyInputStream
{
public static void main(String[] args) throws IOException
{
  InputStream is = new FileInputStream("1.jpg");
  OutputStream os = new FileOutputStream("2.png");
  MyBufferedInputStream   aa = new MyBufferedInputStream(is);
  BufferedOutputStream   bb = new BufferedOutputStream(os);
  long start = System.currentTimeMillis();
  for(int ly = 0;(ly=aa.myRead())!=-1;)
  {
   bb.write(ly);
  }
  long end = System.currentTimeMillis();
  System.out.println(end+"-"+start+"="+(end-start));
  aa.myClose();
  bb.close();
}

}
class MyBufferedInputStream
{
private InputStream in;
private byte[] buf = new byte[1024*4];
  
  int pos = 0,count = 0;

MyBufferedInputStream(InputStream in)
{
  this.in = in;
}
//一次读一个字节,从缓冲区(字节数组)获取。
public int myRead()throws IOException
{

  //通过in对象读取硬盘上数据,并存储buf中。
  if(count==0)
  {
   count = in.read(buf);
   if(count<0)
    return -1;
   
   byte b = buf[pos];
   pos = 0;
   pos++;
   count--;
   return b&0xff;
  
  }
  else if(count>0)
  {
   byte b = buf[pos];
   count--;
   pos++;
   return b&0xff;
  }
  return -1;
}
public void myClose()throws IOException
{
  in.close();
}
}

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

1 个回复

倒序浏览
  1. /*
  2. 11111111 -->提升了一个int类型,那不还是-1,吗?是-1的原因是因为在8个1的前面补得的是1导致的
  3. 那么我只要在前面补0,既可以保留原字节数据不变,又可以避免-1的出现,那么怎,补0呢
  4.                            
  5. 11111111 11111111 11111111 11111111
  6. &00000000 00000000 00000000 11111111
  7. -------------------------------------
  8. 00000000 00000000 00000000 11111111

  9. 这样就可以避免-1的发生

  10. read方法在提升,write方法将指定的字节写入此缓冲的输出流(强制转换,取最低的8位)
  11. */

  12. import java.io.*;
  13. class MyBufferedInputStream{
  14.    private InputStream in;
  15.    
  16.    private byte[] buf=new byte[1024*4];
  17.    
  18.    private int pos=0;
  19.    
  20.    private int count=0;
  21.    MyBufferedInputStream(InputStream in)
  22.    {
  23.      this.in=in;
  24.    }
  25.    
  26.    //一次读一个字节,从缓冲区(字节数组)获取
  27.    public int myRead() throws IOException
  28.    {
  29.       //通过in对象,读取硬盘上的数据,并存储到buf中
  30.           if(count==0)
  31.           {
  32.           
  33.           count= in.read(buf);
  34.           if(count<0)
  35.             return -1;
  36.           pos = 0;
  37.           //取数组第一个元素pos=0;
  38.           byte b=buf[pos];
  39.           
  40.           count--;
  41.           pos++;
  42.          //b与255进行与操作,用十六进制表示就是0xff
  43.           return b&255;
  44.           }else if(count>0)
  45.           {
  46.           byte b=buf[pos];
  47.           
  48.           count--;
  49.           pos++;
  50.           //b与255进行与操作,用十六进制表示就是0xff
  51.           return b&255;
  52.           }
  53.           
  54.           return -1;
  55.    }
  56.    public void myClose()throws IOException
  57.    {
  58.       in.close();
  59.    }

  60. }
复制代码
图片属于二进制数据,不属于字符流,
因为图片转化成二进制数据读入的时候发生了错误,
好像是图片数据转化成11111111时,当读到-1时停止,
所以拷贝文件会发生错误,
你可以参考上面的代码,毕老师讲过的,仔细看一下

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马