Java IO流 -> 节点流 -> 字节数组流
1. 字节数组流 ByteArrayInputStream/ByteArrayOutputStream
-
通过字节的形式操作一块内存区域,虚拟机可以直接访问,因此不需要通知操作系统释放系统资源,虚拟机的垃圾回收机制就可以将资源回收。主动调用close方法也可以,该方法是一个空方法,什么也不做;
-
主要用来缓存数据,向它的内部缓冲区写入数据,缓冲区自动增长,当写入完成时可以从中提取数据。常用于存储数据以以便一次写入。
1.1 ByteArrayInputStream的基本使用
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* 测试字节数组输入流ByteArrayInputStream
*/
public class TestByteArrayInputStream {
public static void main(String[] args) {
try{
//1.指定数据源
byte[] data = "public class TestByteArrayInputStream {\n\tpublic static void main(String[] args){".getBytes();
//2.创建流
InputStream in = new ByteArrayInputStream(data);
//3.操作数据
byte[] buffer = new byte[10];
for(int len = 0; (len = in.read(buffer)) != -1;){
System.out.print(new String(buffer,0,len));
}
}catch (IOException e){
e.printStackTrace();
}
}
}
1.2 ByteArrayOutputStream的基本使用
import java.io.*;
import java.util.Arrays;
/**
* 测试字节数组输出流ByteArrayOutputStream
*/
public class TestByteArrayOutputStream {
public static void main(String[] args) {
try{
//不用指定数据源
//1.创建流
OutputStream out = new ByteArrayOutputStream();
//2.操作数据
byte[] data = "public class TestByteArrayOutputStream {\n\tpublic static void main(String[] args) {".getBytes();
out.write(data,0,data.length);
out.flush();
byte[] buf = ((ByteArrayOutputStream) out).toByteArray();
System.out.println(new String(buf,0,buf.length));
}catch (IOException e){
e.printStackTrace();
}
}
}
2. 文件到字节数组的拷贝 / 字节数组到文件的拷贝
- 用FileUtil封装类中的copy()方法实现:(FileUtil见Java IO流-文件字节流和文件字符流封装FileUtil)
import java.io.*;
public class TestFileUtil {
public static void main(String[] args) {
try{
/**
* 1.从一个文件读取数据到字节数组中
*/
InputStream in = new FileInputStream("D:\\pictures\\babe.jpg"); //该图片的大小为352851
OutputStream out = new ByteArrayOutputStream();
FileUtil f = new FileUtil(in,out);
f.copy();
byte[] buffer = ((ByteArrayOutputStream) out).toByteArray();
System.out.println(buffer.length); //352851
/**
* 2.将字节数组写出到文件
*/
in = new ByteArrayInputStream(buffer);
out = new FileOutputStream("byteArray.jpg");
f = new FileUtil(in, out);
f.copy();
}catch (FileNotFoundException e){
e.printStackTrace();
}
}
}