美文网首页
字节流----图片、媒体的操作

字节流----图片、媒体的操作

作者: 东风谷123Liter | 来源:发表于2018-10-10 21:55 被阅读0次
  • InputStream:读;
  • OutputStream:写;
  • 字符流使用的是字符数组,字节流使用的是字节数组;
  • MyBufferedInputStream
    • 定义数组
    • 定义指针
    • 定义计数器
    • mp3格式文件开头就有-1的二进制位,
    • byte类型的-1提升为int类型的-1,原因是因为在8个1前面补1导致的;如果补0就可以解决这个问题。接受为什么用int不用byte, 在8个1前面补0,不补1;方法:让它与255与运算就OK!
    • 读的时候类型提升了,但是写入的时候只写低八位,保证了元数据的原样性。

而其他正常byte类型的数据提升后的值与255进行按位与操作后的数值不变,这就是与255按位与操作的魅力。

在计算机中数据的存储使用补码表示的,-1的补码就是8个1或者32个1。

那问题来了,如果reader方法读到了行尾的-1怎么办,是返回-1还是返回255。


代码如下:

import java.io.*;
//创建自己的缓存器,用来缓存字节流。
class MyBufferedInputStream1{
     //创建一个字节流对象;
     private InputStream is;
     private byte[] buf = new byte[1024*4];
     private int pos, count;
     MyBufferedInputStream1(InputStream it){
           this.is = it;
     }
     //一次从缓冲区读取一个字节;
     //为什么不返回byte类型呢?
     //为解决开头读到八个1时,返回-1的情况;对字节进行提升,
     //在前面补上0,这样就能保证数值没有变化,又能防止返回-1;
     //为了在前面补0,我们就让byte类型的数据提升后和255进行按位与操作即可。
     public int myRead() throws IOException{
           //通过is对象读取硬盘上的数据,并存到buf中。
           if(count==0) {
                count = is.read(buf);
                if(count<0)
                     //当缓存器中的字符串长度小于0时,返回-1。
                     return -1;
                pos = 0;  //如果刚好count=0,就给缓存器中的字符串附上下标。
                byte b = buf[pos];  //读取一个字符
                //往后面移1位,字符数量-1
                count--;
                pos++;
                //返回int类型
                return b&0xffff;
           }
           //如果count>0,就重复上述取值的过程。
           else if(count>0) {
                byte b = buf[pos];
               count--;
                pos++;
                return b&0xffff;
           }
           return -1;
     }
     //模仿官方缓存器,写一个自己的关闭文件的快捷方法;
     public void myClose()throws IOException{
           is.close();
     }
}
public class MyBufferedInputStream {
     public static void main(String[] args) {
           //调用系统中返回当前时间的函数,用来计算拷贝文件需要多长时间。
           long start = System.currentTimeMillis();
           try {
               copy_2();
           }
           catch(Exception e) 
                System.out.println("拷贝失败!");
           }
           long end = System.currentTimeMillis();
           System.out.println((end-start)+"ms");
     }
     //异常处理时,代码量很多要学会用静态函数。
     public static void copy_2() throws IOException{
          MyBufferedInputStream1 mbis = 
new MyBufferedInputStream1(new FileInputStream("[F://MOVE_MUSIC//1.mp3](file:///F://MOVE_MUSIC//1.mp3)"));
           //由于只写了自己的输入字节流缓存器,输出字节流缓存器就都用Java自己的。
           BufferedOutputStream bfos = 
new BufferedOutputStream(new FileOutputStream("[F://MOVE_MUSIC//2.mp3](file:///F://MOVE_MUSIC//2.mp3)"));
           System.out.println("第一个字节:"+mbis.myRead());
           int by = 0;
           //虽然有缓存器,但缓存器其实就是字节流对象的装饰类,还是每次只能读取一位;
           //要想一行一行的读写数据,还是要用while循环实现。
           while((by=mbis.myRead())!= -1) {
                bfos.write(by);
           }
           mbis.myClose();
           bfos.close();
     }
}

相关文章

  • 字节流----图片、媒体的操作

    InputStream:读; OutputStream:写; 字符流使用的是字符数组,字节流使用的是字节数组; M...

  • java学习第七天

    IO流 文件字节流非常通用,可以用来操作字符的文档,还可以操作任何的其他类型文件(图片,压缩包),因为字节流直接使...

  • Java 21-2 IO技术字符流

    发现 文本数据 媒体文件字节流没问题 但是对于文本文件 想要操作文件中的中文数据时 字节流只能操作字节需要我们转码...

  • java——IO讲解(字符流和缓冲区的使用)

    在java中字节流主要是对一些视频,音频,图片进行操作,而字符流则是对一些字符操作。和字节流一样,字符流也有两个基...

  • 字节流和缓冲字节流——java学习之<16>

    字节流一般用于对图片,音乐等文件的操作。 字节输入流:FileInputStream字节输出流:FileOutpu...

  • Java 字符流操作

    上篇文章Java 字节流操作介绍了java中基本的字节流操作,但是我们常常对于字符操作,如果使用字节流来实现输入输...

  • Android 中的文件读写操作

    IO流(操作文件内容): 字节流 检查外部存储的状态 向外部存储写入字符串、图片 读取外部存储中的文本文件,图片文...

  • JS节流小知识

    一、什么是节流? 节流:当某个操作是连续性执行的时候,我们通过某种方式,降低该操作的执行频率,这就是节流。就跟水龙...

  • 图解防抖动与节流模式

    防抖动 防抖动立即触发 防抖动 节流 节流立即触发 节流 总结 防抖动:将多个操作合并为一个操作(例如,键盘输入关...

  • 1.字节流和字符流

    字节流 字节流主要是操作byte类型数据,以byte数组为准,主要操作类就是OutputStream、InputS...

网友评论

      本文标题:字节流----图片、媒体的操作

      本文链接:https://www.haomeiwen.com/subject/adnmaftx.html