• java—— 字节流


      字节流的继承图

      

      主要的字节流有:

      InputStream/OutputStream: 这是基类,它们是抽象类。

        FileInputStream/FileOutputStream: 输入源和输出目标是文件的流。

           ByteArrayInputStream/ByteArrayOutputStream: 输入源和输出目标是字节数组的流。

      DataInputStream/DataOutputStream: 装饰类,按基本类型和字符串而非只是字节读写流。

      BufferedInputStream/BufferedOutputStream: 装饰类,对输入输出流提供缓冲功能。

    一、InputStream/OutputStream

      

         read从流中读取下一个字节,返回类型为int,但取值在0到255之间,当读到流结尾的时候,返回值为-1

      

    二、FileInputStream/FileOutputStream 文件流  

      FileOutputStream的主要构造方法有

        public FileOutputStream(File file) throws FileNotFoundException

        public FileOutputStream(File file, boolean append) throws FileNotFoundException

        public FileOutputStream(String name) throws FileNotFoundException

        public FileOutputStream(String name, boolean append) throws FileNotFoundException

      从构造方法上可得出:可以是File对象file,也可以是文件路径name。

      备注:append参数指定是追加还是覆盖,true表示追加,默认为 false。

      FileInputStream的主要构造方法有

        public FileInputStream(String name) throws FileNotFoundException

        public FileInputStream(File file) throws FileNotFoundException

      演示代码实现文件复制

     1 public static void main(String[] args) throws IOException {
     2         InputStream in = new FileInputStream("D:\mys\2.jpg");
     3         File copy = new File("D:\mys\2copy.jpg");
     4         OutputStream out = new FileOutputStream(copy);
     5         byte[] b = new byte[10];
     6         int len = 0;
     7         while((len = in.read(b)) != -1){
     8              out.write(b, 0, len);
     9         }
    10         in.close();
    11         out.close();
    12     }

      创建文件流对象会实际打开文件,然后操作系统会分配相关资源。如果当前用户没有写权限,会抛出异常SecurityException(父类  RuntimeException)。如果指定的文件是一个已存在的目录,或者由于其他原因不能打开文件,会抛出异常FileNotFoundException,它是IOException的一个子类。

    三、ByteArrayInputStream/ByteArrayOutputStream    字节数组流

      ByteArrayOutputStream的输出目标是一个byte数组,这个数组的长度是根据数据内容动态扩展的。它有两个构造方法:

        public ByteArrayOutputStream()

        public ByteArrayOutputStream(int size)

        size指定的就是初始的数组大小(默认 32)

      ByteArrayOutputStream中的数据也可以方便的写到另一个OutputStream:

        public synchronized void writeTo(OutputStream out) throws IOException

      ByteArrayInputStream将byte数组包装为一个输入流,是一种适配器模式,它的构造方法有:

        public ByteArrayInputStream(byte buf[])

        public ByteArrayInputStream(byte buf[], int offset, int length)

        以buf中offset开始可以添加的 length 个字节数据

    四、DataInputStream/DataOutputStream    数据操作流

      允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型

      DataOutputStream的构造方法:

        public DataOutputStream(OutputStream out)

      

      DataInputStream的构造方法:

        public DataInputStream(InputStream in)

      

      写的顺序与读的顺序要保持一致

      备注:DataInputStream是装饰类基类FilterInputStream的子类,FilterInputStream是InputStream的子类。

     五、BufferedInputStream/BufferedOutputStream   缓冲流

       缓冲流要“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,同时增加了一些新的方法

         BufferedInputStream 内部有个字节数组作为缓冲区,读取时,先从这个缓冲区读,缓冲区读完了再调用包装的流读,它的构造方法有两个:

          public BufferedInputStream(InputStream in)

          public BufferedInputStream(InputStream in, int size)

             size表示缓冲区大小,默认值为8192。

       BufferedOutStream 内部有个字节数组作为缓冲区,它的构造方法也有两个:

          public BufferedOutStream(InputStream in)

          public BufferedOutStream(InputStream in, int size)

            size表示缓冲区大小,默认值为8192。

      使用输出流缓冲输入流实现文件复制

     1 public static void main(String[] args) throws IOException {
     2         InputStream in = new FileInputStream("D:\mys\2.jpg");
     3         File copy = new File("D:\mys\2copy.jpg");
     4         OutputStream out = new FileOutputStream(copy);
     5         BufferedInputStream bfi = new BufferedInputStream(in);
     6         byte[] b = new byte[10];
     7         int len = 0;
     8         while ((len = bfi.read(b)) != -1) {
     9             out.write(b, 0, len);
    10         }
    11         out.close();
    12         //关闭缓冲流时,会自动关闭它所包装的底层节点流
    13         bfi.close();
    14     }

      向文件中写出数据

    1 public static void main(String[] args) throws IOException {
    2          FileOutputStream fos=new FileOutputStream("BOSDemo.txt");
    3          BufferedOutputStream bos=new BufferedOutputStream(fos);
    4          String content="我是缓冲输出流测试数据!";
    5          bos.write(content.getBytes(),0,content.getBytes().length);
    6          //输出的缓冲流,写出的数据会先在内存中缓存,使用flush()将会使内存中的数据立刻写出
    7          bos.flush();
    8          bos.close();
    9     }

    专门的类库如Apache Commons IO

  • 相关阅读:
    springboot项目创建父级依赖
    springboot整合测试
    springboot中使用RedisTemplate实现redis数据缓存
    springboot整合redis
    springboot整合shiro
    配置 maven 环境变量
    虚拟机和主机之间一系列工具包,开启双向复制粘贴后导致的内存占用问题
    mysql服务无法启动的问题
    Linux学习遇到的问题(权限问题:例如无法创建目录"**": 权限不够"等等)
    Windows 10 配置Git 环境变量(还有:安装git后,鼠标右键没有“git bush here”)
  • 原文地址:https://www.cnblogs.com/SacredOdysseyHD/p/8476022.html
Copyright © 2020-2023  润新知