Java学习笔记(十)字符流 - FileReader、FileWriter、InputStreamReader、OutputStreamWriter

目录

2.2 字符流

2.2.1 Reader 的具体实现子类 - FileReader

2.2.2 Writer 的具体实现子类 - FileWriter

2.2.3 带缓存的FileReader  -  BufferedReader

2.2.4 带缓存的FileWriter  -  BufferedWriter

2.2.5 用InputStreamReader和OutputStreamWriter解决编码问题


2.2 字符流

字符流主要是对文本文件操作,其内置了编码转化的功能,在处理纯文本的文件方面比较有优势。英文的编码是一个字节,而中文的编码在GBK里是两个字节,那么若一个文件中是中英混杂,会出现乱码。而用字符流处理这样的文本较于字节流会更加方便。

使用场景:

  1. 读取字符并修改字符
  2. 不建议用于文件的拷贝
  3. 不能读取非纯文本文件,如音频,视频等

字符流的两个抽象类为Reader和Writer。        

2.2.1 Reader 的具体实现子类 - FileReader

  1. 构造方法

      2. 常用方法

  • int read()  -  返回读取的一个字符
  • int read(char[] c)  -  将读取c.length()大小的字符数组
  • int read(char[] c, int offset, int length)  -  将读取一部分到字符数组中
  • boolean ready( )

2.2.2 Writer 的具体实现子类 - FileWriter

  1. 构造方法

 

     2. 常用方法

  • void write(int c)  -  写入一个字符
  • void write(String str, int off, int length)  -  写入字符串的一部分
  • void write(char[] cbuf, int off, int length)  -  写入字符数组的一部分
  • String getEncode()  -  获取当前编码方式

2.2.3 带缓存的FileReader  -  BufferedReader

由于BufferedReader用法与FileReader类似,其设计模式与FileInputStream类似,故不赘述。其新增的方法有:

  • String readLine()  -  读取文本文件一行,返回一串字符串

2.2.4 带缓存的FileWriter  -  BufferedWriter

由于BufferedWriter用法与FileWriter类似,其设计模式与FileOutputStream类似,故不赘述。其新增的方法有

  • void newLine()  -  写一行行分隔符。 行分隔符字符串由系统属性line.separator定义,并不一定是单个换行符('\ n')字符。

2.2.5 用InputStreamReader和OutputStreamWriter解决编码问题

  1. InputStreamReader

InputStreamReader是从字节流到字符流的桥:它读取字节,并使用指定的charset将其解码为字符 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。

每个调用InputStreamReader的read()方法之一可能会导致从底层字节输入流读取一个或多个字节。 为了使字节有效地转换为字符,可以从底层流读取比满足当前读取操作所需的更多字节。

为了最大的效率,请考虑在BufferedReader中包装一个InputStreamReader。如:

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

构造方法:

    2.OutputStreamWriter

OutputStreamWriter是字符的桥梁流以字节流:向其写入的字符编码成使用指定的字节charset 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。

每次调用write()方法都会使编码转换器在给定字符上被调用。 所得到的字节在写入底层输出流之前累积在缓冲区中。 可以指定此缓冲区的大小,但是默认情况下它大部分用于大多数目的。 请注意,传递给write()方法的字符不会缓冲。

构造方法:

     3. 解决编码问题

用字节流读取UTF-8的文件,传入InputStreamReader转成字符流,在包装在BufferedReader里,再用OutputStreamWriter和BufferedWriter写成编码为GBK的文件

public static void main(String[] args) throws IOException {
		String PYFILE = "D:\\PyQt5Project\\opencv_vcom\\myopencv\\coindetection.py";
		FileInputStream finput = new FileInputStream(PYFILE);
		BufferedReader br = new BufferedReader(new InputStreamReader(finput, "UTF-8"));
		
		FileOutputStream foutput = new FileOutputStream("coindetection.py");
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(foutput, "GBK"));
		
		String content = "";
		while((content = br.readLine()) != null) {
			bw.write(content);
			bw.newLine();
			System.out.println(content);
		}
		bw.close();
		
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值