fileinputstream是字节流的管道形式, ByteArrayOutputStream是字节流的数组形式,ByteArrayOutputStream/ByteArrayInputStream在内部都维护的一个字节数组,将输入流转换成其内部数组来保存。这个不难理解。看代码:
public class test {
private static String a;
public static void main(String[] args) throws IOException, InterruptedException {
File file = new File("C:\\Users\\Administrator\\Desktop\\a.txt");
FileInputStream fileInputStream =new FileInputStream(file);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] by = new byte[50];
int length=0;
while ((length=fileInputStream.read(by))!=-1){
byteArrayOutputStream.write(by,0,length);
}
FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\info1\\b.txt");
fileOutputStream.write(byteArrayOutputStream.toByteArray());
}
上面代码很清晰了,实现了一个文件的复制功能。
逻辑:
- 将文件读取到fileinputstream流通道里
- 建立了一个BytearryOutputstream ,其内部维护了一个字节数组,现在没有数据填充,是一个空的字节数组。
- 依次从fileinputstream流通道里读取50个字节放入数组by[]中,然后将这个by[]填充putStream中的数组里面去
- 构建一个文件输出流通道FileOutputStream
- 然后将byteArryOutputstream中的字节数组写出去
byteArryInputream 和byteArryOutputstream很相似的,byteArryInputream()受一个字节数组by[]作为参数,然后直接将这个数组填充到自己维护的字节数组空间里面,然后提供了读取方法。
byteArrayOutputStream()没有直接提供往内部放数据的构造函数,但是write()方法接受一个by[]作为参数,填充其内部维护的数组空间内。byteArrayOutputStream()/byteArrayInputStream()都没有直接到文件操作的功能,它是内存操作!就像int[] byte[]数组一样。是内存里的