位置--->位于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方法,因为内部将数据保留到内存中了
手写文件--->字节数组--->文件的流操作
文件输入流、字节数组输入流、字节数组输出流、文件输出流