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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 要你快乐 中级黑马   /  2014-11-24 21:12  /  877 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. import java.io.*;

  2. class MyBufferedInputStreamDemo {

  3.         public static void main(String[] args){
  4.                 copy();
  5.                
  6.         }
  7.        
  8.         public static void copy() {
  9.                 MyBufferedInputStream bin = null;
  10.                 BufferedOutputStream bout = null;
  11.                 try {
  12.                         bin = new MyBufferedInputStream(new FileInputStream("C:\\Users\\XK-21\\Desktop\\1.png"));
  13.                         bout = new BufferedOutputStream(new FileOutputStream("C:\\Users\\XK-21\\Desktop\\2.png"));
  14.                         int ch = 0;
  15.                         while((ch=bin.myRead()) != -1){
  16.                                 bout.write(ch);
  17.                         }
  18.                 } catch (FileNotFoundException e) {
  19.                         e.printStackTrace();
  20.                 } catch (IOException e) {
  21.                         throw new RuntimeException("MP3复制失败");
  22.                 } finally{
  23.                         if(bin != null){
  24.                                 try {
  25.                                         bin.myClose();
  26.                                 } catch (IOException e) {
  27.                                         throw new RuntimeException("读取字节流关闭失败");
  28.                                 }
  29.                         }
  30.                        
  31.                         if(bout != null){
  32.                                 try {
  33.                                         bout.close();
  34.                                 } catch (IOException e) {
  35.                                         throw new RuntimeException("写入字节流关闭失败");
  36.                                 }
  37.                         }
  38.                 }
  39.                
  40.         }
  41. }

  42. class MyBufferedInputStream       
  43. {
  44.         private InputStream in;

  45.         private byte[] buf = new byte[1024*4];
  46.                
  47.         private int pos = 0,count = 0;
  48.        
  49.         MyBufferedInputStream(InputStream in)
  50.         {
  51.                 this.in = in;
  52.         }

  53.         //一次读一个字节,从缓冲区(字节数组)获取。
  54.         public int myRead()throws IOException
  55.         {
  56.                 //通过in对象读取硬盘上数据,并存储buf中。
  57.                 if(count==0)
  58.                 {
  59.                         count = in.read(buf);
  60.                         if(count<0)
  61.                                 return -1;
  62.                         pos = 0;
  63.                         byte b = buf[pos];

  64.                         count--;
  65.                         pos++;
  66.                         return b&255;
  67.                 }
  68.                 else if(count>0)
  69.                 {
  70.                         byte b = buf[pos];

  71.                         count--;
  72.                         pos++;
  73.                         return b&0xff;
  74.                 }
  75.                 return -1;

  76.         }
  77.         public void myClose()throws IOException
  78.         {
  79.                 in.close();
  80.         }
  81. }
复制代码


因为字节流在读一个字节的时候有可能会读到连续8个二进制1,对应的十进制是-1,这样的话数据还没读完就结束了,所以在写myRead()方法的时候把存到byte数组中的每个字节又与(&)上了255,而在写入调用write方法时会将int强转为byte,只取8位,这样取回的还是原来的数据。   但是,这是因为一读一写保证了数据没变,,,那假如我就是要用字节流来读取一个文本文件,然后打印在控制台上,那这样没有用到字节输出流的write方法那么打印的数据不就改变了吗?         

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马