字符流和字节流(二)

时间:2021-07-23 21:02:22

字符流和字节流的转换

InputStreamReader 和 OutputStreamReader :

把一个以字节为导向的 stream 转换成一个以字符为导向的 stream 。

InputStreamReader 类是从字节流到字符流的桥梁:它读入字节,并根据指定的编码方式,将之转换为字符流。

使用的编码方式可能由名称指定,或平台可接受的缺省编码方式。

InputStreamReader 的 read() 方法之一的每次调用,可能促使从基本字节输入流中读取一个或多个字节。

为了达到更高效率,考虑用 BufferedReader 封装 InputStreamReader ,

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

InputStreamReader(InputStream) 用缺省的字符编码方式,创建一个 InputStreamReader 。

InputStreamReader(InputStream, String) 用已命名的字符编码方式,创建一个 InputStreamReader 。

OutputStreamWriter 将多个字符写入到一个输出流,根据指定的字符编码将多个字符转换为字节。

每个 OutputStreamWriter 合并它自己的 CharToByteConverter, 因而是从字符流到字节流的桥梁。

InputStreamReader可以把InputStream转换成Reader,OutputStreamWriter可以把OutputStream转换成Writer.这就实现了字节流和字符流的转换。

示例如下:

      FileOutputStream fos = new FileOutputStream(“1.txt”);
OutputStreamWriter osw = new OutputStreamWriter(fos);
BufferedWriter bw = new BufferedWriter(osw);
Bw.write(“hello”);
Bw.close();//这样可以把缓冲区的字符写入1.txt中
      FileInputStream fis = new FileInputStream(“1.txt”);      InputStreamReader isr = new InputStreamReader(fis);      BufferedReader br = new BufferedReader(isr);      String strLine;      While((strLine=br.readLine())!=null){//数据一行一行读取         System.out.println(strLine);      }

字节流与字符流的区别

字节流和字符流使用是非常相似的,那么除了操作代码的不同之外,还有哪些不同呢?

字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的

字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容

那开发中究竟用字节流好还是用字符流好呢?

在所有的硬盘上保存文件或进行传输的时候都是以字节的方法进行的,包括图片也是按字节完成,而字符是只有在内存中才会形成的,所以使用字节的操作是最多的。

如果要java程序实现一个拷贝功能,应该选用字节流进行操作(可能拷贝的是图片),并且采用边读边写的方式(节省内存)。

DataInputStream:可以读取java基本数据类型,例如readDouble(),readFloat(),readInt(),readLine(),

ObjectInputStream:可以实现自定义对象的输入流

ObjectInputStream ois = new ObjectInputStream(fis);

ois.writeObject(对象);

字符流和字节流(二)