当前位置: 代码迷 >> 综合 >> 字符流和字节流的桥梁InputstreamReader/OutputStreamWriter
  详细解决方案

字符流和字节流的桥梁InputstreamReader/OutputStreamWriter

热度:45   发布时间:2023-12-22 01:01:11.0

字符流和字节流的桥梁InputstreamReader/OutputStreamWriter

字符流和字节流转换的桥梁InputstreamReader
  • 背景
    • 计算机存储的单位是字节,从持久设备读取到程序中是解码,从程序写到持久设备中是编码不管是编码还是解码,不同字符集编解码成字符需要不同的个数,因此字节流读取容易出错,比如乱码因此需要一个流,把字节流读取的字节进行缓冲后,在通过字符集解码成字符返回
  • InputstreamReader(继承Reader)
    • 简介:将字节流转换为字符流,字节流通向字符流的桥梁,如果不指定字符集编码,则解码过程将使用平台默认的字符编码,如:UTF-8文本文件存储是A编码,然后如果以B编码进行读取则会乱码
  • 构造函数
//使用系统默认编码集
public InputStreamReader(InputStream in)//指定指定编码集创建对象
public InputStreamReader(InputStream in,String charsetName)
  • 常用APl
int read()
讲解:读取单个字符int read(char[]cbuf,int off,int len)
讲解:读取一部分字符到数组里面,从数组下标off处放置length长度的字符int read(char[]cbuf)
讲解:将读取到的字符存到数组中,返回读取的字符数void close()
讲解:关闭流释放资源
  • eg
package domee.chapter12;import java.io.*;public class InputStreamReaderTest {
    public static void main(String[] args)throws IOException {
    String dir = "C:\\Users\\123\\Desktop\\test\\A.txt";test1(dir);}public static void test1(String string)throws IOException{
    //读取字节流InputStream inputStream = new FileInputStream(string);//向字符流转换InputStreamReader inputStreamReader = new InputStreamReader(inputStream);BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String size;while ( (size = bufferedReader.readLine())!= null ){
    System.out.println(size);}inputStreamReader.close();bufferedReader.close();}
}
字符流和字节流转换的桥梁InputstreamReader
  • OutputStreamWriter(继承writer)
    • 简介:
      • 将字符流转换为字节流(看源码解释),字符流通向字节流的桥梁,如果不指定字符集编码,则编码过程将使用平台默认的字符编码,如:GBK o构造函数
//使用系统默认编码集
public outputStreamwriter(OutputStream out)//指定指定编码集创建对象
public outputStreamwriter(OutputStream out,String charsetName)
  • 常用API
void write(int c)
讲解:写入一个字符void write(char[]cbuf,int off,int len)
讲解:写入字符数组的一部分,通过off和1en控制void write(String s,int off,int len)
讲解:写入字符数组的一部分,通过off和1en控制。void newLine()
讲解:写如一个换行符合void close()
讲解:关闭输入流并释放与该流关联的系统资源void flush()
讲解:write是写到缓冲区中,可以认为是内存中,当缓冲区满时系统会自动将缓冲区的内容写入文件,但是一般还有一部分有可能会留在内存这个缓冲区中,所以需要调用flush空缓冲区数据。
  • eg(指定编码写入,如果用其他编码打开则乱码,读取也是会乱码)
package domee.chapter12;import java.io.*;public class OutputStreamWriterTest {
    public static void main(String[] args) throws IOException{
    test("C:\\Users\\123\\Desktop\\test\\X.txt");}public static void test(String string)throws IOException {
    OutputStream outputStream = new FileOutputStream(string);OutputStreamWriter writer = new OutputStreamWriter(outputStream,"GBK");String s = "太阳当空照,花儿对我笑";writer.write(s,0,s.length());writer.close();}
}