目录
ByteArrayInputStream
往构造方法里传的参数是字节数组,不是文件:
getBytes方法能得到字节数组。
FileInputStream和FileOutputStream的源是文件,存在硬盘中,Java虚拟机不能直接去操作,要通过操作系统(OS),所以用完后要通知操作系统去释放资源(close方法)
ByteArrayInputStream的是字节数组,在内存中,不用close,是靠GC回收的。
所以,ByteArrayInputStream类的close方法是个空方法,没有用处,只是为了保证风格统一:
public void close() throws IOException {
}
ByteArrayInputStream类的close方法不用通知操作系统去释放,因为它就在虚拟机的内存中。
ByteArrayInputStream 没有 FileNotFoundException 这个异常。
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
public class Test {
public static void main(String[] args) {
//1、创建源
byte[] datas = "abcdefg".getBytes();
//2、选择流
InputStream is = null;
try {
is = new ByteArrayInputStream(datas);
//3、操作(分段读取)
byte[] flush = new byte[5];//缓冲容器
int len = -1;
while((len = is.read(flush)) != -1) {
//字节数组-->字符串(解码)
String str = new String(flush, 0, len);
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//4、释放资源 关不关无所谓
try {
if(null != is) {
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
输出结果:
abcde
fg
ByteArrayInputStream类的创建源是字节数组,不要太大。释放资源可以不用处理。
ByteArrayOutputStream
其构造方法:
不需要指定目的地。
其内部根据你的数据,要多大给多大。
该类实现了将数据写入字节数组的输出流。当数据写入缓冲区时,缓冲区会自动增长。可以使用toByteArray()和toString()检索数据。
他有缓冲区,可以通过toByteArray()和toString()拿到数据。
和ByteArrayInputStream一样,ByteArrayOutputStream的close方法也是一个空方法:
public void close() throws IOException {
}
举例:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class Test {
public static void main(String[] args) {
//1、创建源
byte[] dest = null;//可以不用创建,写了是为了保证风格统一。
//2、选择流 (要用新增的方法toByteArray,所以不能发生多态)
ByteArrayOutputStream baos = null;
try {
baos = new ByteArrayOutputStream();
//3、操作(写出)
String msg = "I love Java.";
//字符串-->字节数组(编码)
byte[] datas = msg.getBytes();
baos.write(datas, 0, datas.length);
baos.flush();
//获取数据
dest = baos.toByteArray();
System.out.println(dest.length + "-->" + new String(dest, 0, baos.size()));
} catch (IOException e) {
e.printStackTrace();
} finally {
//4、释放资源 关不关无所谓
try {
if(null != baos) {
baos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
输出结果:
12-->I love Java.
这里有12个字节 。
ByteArrayOutputStream的源是内部来维护的。创建流的时候,不关联源。可以不用释放资源。要获取一下数据,因为它内部将数据保留在内存里了,用toByteArray方法拿一下这个数据。