public class Demo02_ByteArrayOutputStream {
/**
* ByteArrayOutputStream ByteArrayIntputStream
* 说白了,他就是个小数组,是一个中转站.所以他接收不了流对象
* 内存输出流
* 他在创建对象的时候就会创建一个字节数组缓冲区,当写入数据
* 首先:ByteArrayOutputStream
* 有两个构造方法
* A.一个无参的,仅仅只是为了创建一个,byte数组输出流对象,用于存储write写入的结果
* B.一个有个size参数的.可以设置指定的缓冲区大小,以字节为单位
* 他有一个重要方法
* toByteArray();把内存流对象中所有数据转化为byte数组
* 转换后的byte数组可以通过String的构造函数来把数组转化为字符串形式
* 通过这个方法吧字符串转化为byte数组后.用标准的输出流.然后输出这个数组就可以了.
* fos.write(arr);为什么这样输出的中文没有乱码?
* 因为你把字节从文本读进来.又全部写进去.当然没有问题.
* 如果是普通的转换.
* 他有一个注意点
* 他的数据是写在内存的.虽然属于流.但是不用关闭.如果流是通过硬盘来连接的,那么这个流就需要关闭,比如InputStream
* 读取中文的时候出现了乱码
* 出现乱码肯定是定义了一个字节数组,然后用syso在循环中输出.
* 拷贝文件只要码表相同.用哪个都不会出现乱码
* 解决方案
* 1.字符流读取
* 2.内存流来解决
* 3.得到字节数组,通过String构造方法.来解决
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// demo1();
// demo2();
}
private static void demo2() throws IOException {
byte[] arr = {-50,-46,-43,-66,-44,-38,-54,-64,-67,-25,-75,-60,-74,-91,-74,-53,44,-53};
ByteArrayInputStream bais = new ByteArrayInputStream(arr);
//因为用小数组定义读取.所以出现了乱码
int len;
byte[] arr1 = new byte[2];
while((len = bais.read(arr1)) != -1) {
System.out.print(new String(arr1,0,len));
}
}
private static void demo1() throws IOException {
FileInputStream fis = new FileInputStream("a.txt");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int b;
byte[] arr = new byte[2];//2.得到中文字节数组
while((b = fis.read(arr)) != -1 ) {
// baos.write(b);//1.普通的写入文件
for(int i = 0 ; i < arr.length ; i++) {
System.out.print(arr[i] + ",");
}
}
fis.close();
System.out.println(baos);
// baos.close();//这是在内存操作的流.可以不关闭.这个方法没什么意义.只有操作硬盘的才要关闭
}
} |
|