关于字符流得学习

字符流是一种用于读取和写入字符数据的输入输出流。与字节流不同,字符流以字符为单位读取和写入数据,而不是以字节为单位。常用来处理文本信息。

字符输入流

Reader 类是所有字符流输入类的父类,该类定义了许多方法,这些方法对所有子类都是有效的。

其实一般情况下我们使用最多也就是 FIleReader 和 BufferedReader;

注意点

  • 与字节流相似,输入字符流在使用 buffer 时候没有加 close 关掉 buffer 也一样是可以把文件中的内容读取到控制台中的,相比输出字符流就必须要加上 buffer 的 close 方法了
  • read 方法返回 int 型,也就是一个字符的 ascall 码,readLine 方法可以返回当前位置后一整行的字符串类型
  • 如果 read 方法读不到字符了它会返回 -1,如果 readLine 方法读不到行了它会返回 null 的字符串

常用子类:

  1. CharArrayReader :将字符数组转换为字符输入流,从中读取字符。
  2. StringReader        :将字符串转换为字符输入流,从中读取字符。
  3. BufferedReader    :为其他字符输入流提供读缓冲区。
  4. PipedReader        :连接到一个 PipedWriter。
  5. InputStreamReader :将字节输入流转换为字符输入流,可以指定字符编码。

子类必须实现得方法只有read(char[],int,int)和close(),但是多数子类将重写此处得定义得一些方法,以提高更高得效率或者其它功能;对文件得操作使用:使用FileReader类进行实例化操作。

  1. close():关闭此流并释放与此流相关的系统资源。
  2. read():从输入流读取一个字符。
  3. read(char[] cbuf):从输入流中读取一些字符,并将它们存储到字符数组 cbuf中

①、读取字符:read方法,每次可以读取一个字符,返回读取的字符(转为 int 类型),当读取到文件末尾时,返回-1。

②、读取指定长度的字符:read(char[] cbuf, int off, int len),并将其存储到字符数组中。其中,cbuf 表示存储读取结果的字符数组,off 表示存储结果的起始位置,len 表示要读取的字符数。

字符输出流

与 Reader 类相反,Writer 类是所有字符输出流的父类,该类中有许多方法,这些方法对继承该类的所有子类都是有效的。

子类必须要实现得方法仅有write(char[] ,int,int)、flush()和close();但是多数得子类将重写此处定义得一些方法,以提供更高得效率和或其它功能;

  1. write(int c) 写入单个字符。
  2. write(char[] cbuf) 写入字符数组。
  3. write(char[] cbuf, int off, int len) 写入字符数组的一部分,off为开始索引,len为字符个数。
  4. write(String str) 写入字符串。
  5. write(String str, int off, int len) 写入字符串的某一部分,off 指定要写入的子串在 str 中的起始位置,len 指定要写入的子串的长度。
  6. flush() 刷新该流的缓冲。
  7. close() 关闭此流,但要先刷新它。

Writer 类的常用子类:

  1. CharArrayWriter  :向内存缓冲区的字符数组写数据。
  2. StringWriter         :向内存缓冲区的字符串(StringBuffer)写数据。
  3. BufferedWriter     :为其他字符输出流提供写缓冲区。
  4. PipedWriter          :连接到一个 PipedReader。
  5. OutputStreamReader    :将字节输出流转换为字符输出流,可以指定字符编码。

Writer 类中的 write() 方法和 append() 方法:

方法名及返回值类型说明
void write(int c)向输出流中写入一个字符
void write(char[] cbuf)把参数 cbuf 指定的字符数组中的所有字符写到输出流中
void write(char[] cbuf,int off,int len)把参数 cbuf 指定的字符数组中的若干字符写到输出流中。其中,off 指定字符数组中的起始下标,len 表示元素个数
void write(String str)向输出流中写入一个字符串
void write(String str, int off,int len)向输出流中写入一个字符串中的部分字符。其中,off 指定字符串中的起始偏移量,len 表示字符个数
append(char c)将参数 c 指定的字符添加到输出流中
append(charSequence esq)将参数 esq 指定的字符序列添加到输出流中
append(charSequence esq,int start,int end)将参数 esq 指定的字符序列的子序列添加到输出流中。其中,start 指定子序列的第一个字符的索引,end 指定子序列中最后一个字符后面的字符
的索引,也就是说子序列的内容包含 start 索引处的字符,但不包括 end
索引处的字符

注意:Writer 类所有的方法在出错的情况下都会引发 IOException 异常。关闭一个流后,再对其进行任何操作都会产生错误。

①、写入字符:write(int b) 方法,每次可以写出一个字符

②、写入字符数组:write(char[] cbuf) 方法,将指定字符数组写入输出流。

③、写入指定字符数组:write(char[] cbuf, int off, int len) 方法,将指定字符数组的一部分写入输出流。

④、写入字符串:write(String str) 方法,将指定字符串写入输出流。

⑤、写入指定字符串:write(String str, int off, int len) 方法,将指定字符串的一部分写入输出流。

/**
 * 字符流:
 * 		Write:写入字符流抽象类。子类必须要实现得方法仅有write(char[] ,int,int)、flush()和close();
 * 				  但是多数得子类将重写此处定义得一些方法,以提供更高得效率和或其它功能;
 * 				  与outputStream一样,对文件得操作使用:FileWrite类来完成。
 *		Reader:
 *				  用于读取字符流得抽象类。子类必须实现得方法只有read(char[],int,int)和close()。
 * 				  但是多数子类将重写此处得定义得一些方法,以提高更高得效率或者其它功能;
 * 				  对文件得操作使用:使用FileReader类进行实例化操作。
 *     每次操作得单位是一个字符;
 *     文件字符流操作会自带缓存,默认为1024字节,在缓存满后,或者手动刷新缓存,或者关闭流时候会把数据写入文件;
 */
public class 字符流 {

	public static void main(String[] args) {
		out();
		in();
	}
	private static void out() {
		File file1 = new File("F:\\workspace\\java基础\\src\\文件与IO\\file\\test02.txt");
		try {
			// 创建 FileReader 对象
			Writer outWriter = new FileWriter(file1,true);
            //Write 输出流的 flush() 操作是指,一般 IO 操作在有缓冲区的情况下,调用 close() 方法缓冲区才会被输出到磁盘中,
			//如果直接执行 flush 可以在缓冲区没有满的时候手动输出一次到磁盘
			outWriter.write("疑是地上霜");
			outWriter.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	private static void in() {
		File file2 = new File("F:\\workspace\\java基础\\src\\文件与IO\\file\\test02.txt");
		try {
			// 创建 FileReader 对象
			Reader reader = new FileReader(file2);
			char[] cs = new char[1];
			int len = -1;
			// 创建 StringBuilder 对象
			StringBuilder stringBuilder =new StringBuilder();
			// 循环读取数据,如果返回 -1, 则表示已经到了输入流的末尾。
			while ((len=reader.read(cs))!=-1) {
				stringBuilder.append(new String(cs,0,len));
			}
			// 关闭 FileReader 对象
			reader.close();
			System.out.println(stringBuilder);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

关于流得学习笔记!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值