5.17Java字节数组流

5.17Java字节数组流

位置--->位于JVM当中,Java可以直接访问

特点:

  • 由垃圾回收机制GC来释放

  • 与操作系统无关--->字节数组流不需要释放

  • 任何东西(数据、对象...)都可以转成字节数组(字节数组直接是二进制,方便进行网络的传输)

  • 字节数组不要太大

package iostudy.ioprogramme;

import java.io.*;
import java.nio.charset.StandardCharsets;

/**
* JavaIo字节数组输入流
* 1、创建源--->创建源文件
* 2、选择流--->选择字节数组输入流
* 3、进行文件操作--->文件操作
* 4、关闭资源
* @since JDK 1.8
* @date 2021/5/18
* @author Lucifer
*/
public class IoByteInputStream {
   public static void main(String[] args) {

  }

   public static void byteCopy(){
       //创建源--->创建源从创建文件变成创建字节数组
       byte[] src = "talk is cheap show me the code!".getBytes(StandardCharsets.UTF_8);
       //选择流--->字节输入选择流
       InputStream is = null;
       //操作--->选择流变成字节数组
       try {
           is = new ByteArrayInputStream(src);
           //缓冲容器依然是字节数组
           byte[] flush = new byte[5]; //每次的字节数组空间大小为5
           int temp = -1; //接收长度
           while ((temp=is.read(flush))!=-1){
               //将字节数组转成字符串--->解码
               String str = new String(flush, 0, temp);
               System.out.println(str);
          }
      }catch (IOException e) {
           System.out.println(e.getMessage());
           e.printStackTrace();
      }
  }
   /*
   因为ByteArrayInputStream在我们虚拟机内存中开辟的空间,所以不需要和操作系统交互
   所以不需要写try关闭资源的代码
    */
}

字节数组流和其他流不一样的地方:

  • 创建流是创建字节数组流--->字节数组不要太大

  • 释放资源可以不用处理--->因为不涉及到与计算机硬盘交互

字节数组输出流:

package iostudy.ioprogramme;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
* 测试字节数组输出流--->ByteArrayOutputStream(构造器不需要指定目的地--->文件可以一直往里面追加内容,所以不需要写路径)
* 该类实现了将数据写入字节数组的输出流。 当数据写入缓冲区时,缓冲区会自动增长。 数据可以使用toByteArray()和toString()
* 特殊方法:toByteArray()--->创建一个新分配的字节数组。
* 1、创建源
* 2、选择流--->字节数组输出流
* 3、操作(写出内容)
* 4、释放资源--->关闭源文件
* @since JDK 1.8
* @date 2021/5/19
* @author Lucifer
*/
public class IoByteOutputStream {
   public static void main(String[] args) throws IOException {
       //创建源--->字节数组
       byte[] dest = null;
       //选择流--->因为要使用新增方法(子类单独有的方法),所以不要发生多态(发生多态使用的都是重写的方法或延续的方法)
       ByteArrayOutputStream baos = null;
       /*尝试对文件进行操作*/
       try {
           baos = new ByteArrayOutputStream();
           //写出的字符串内容
           String str = "show me the code!"; //将内容写入字节数组中
           /*放入字节缓冲区*/
           byte[] datas = str.getBytes(StandardCharsets.UTF_8); //字符串--->字节数组--->涉及到编码的问题
           //写出内容
           baos.write(datas, 0, datas.length);
           //强制刷新
           baos.flush();
           //获取数据长度
           dest = baos.toByteArray(); //将字节数组放入目的数组当中--->缓冲区会自动变化
           System.out.println(dest.length + "--->" + new String(dest, 0, baos.size())); //dest.length和dest.size都是dun
      }catch (FileNotFoundException e){
           System.out.println(e.getMessage());
           e.printStackTrace();
      } catch (IOException e) {
           e.printStackTrace();
      }finally {
           /*释放资源--->这里关不关闭资源不要紧*/
           if (null != baos) {
               baos.close();
          }
      }
  }
}

特点:

  • 创建源--->内部维护

  • 选择流--->流选择的时候不关联源

  • 操作

  • 关闭资源--->可以不用

  • 获取数据,通过toByteArray方法,因为内部将数据保留到内存中了

手写文件--->字节数组--->文件的流操作

文件输入流、字节数组输入流、字节数组输出流、文件输出流

 

posted @ 2021-05-19 19:32  俊king  阅读(237)  评论(0)    收藏  举报