字符流读写

字符输入流

字符输入流Reader
java.io.Reader抽象类是标识用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入流的基本共性功能方法。

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

Reader 类的常用子类如下。

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

java.io.FileReader类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

作用:把硬盘文件中的数据以字符的方式读取到内存中。

Tips:字节与字符的对应规则。Windows系统的中文编码默认时GBK编码表。IDEA中utf-8。


与 InputStream 类相同,在 Reader 类中也包含 close()、mark()、skip() 和 reset() 等方法,这些方法可以参考 InputStream 类的方法。下面主要介绍 Reader 类中的 read() 方法,如表 1 所示。
 

表 1 Reader类中的read()方法
方法名及返回值类型说明
int read()从输入流中读取一个字符,并把它转换为 0~65535 的整数。如果返回 -1, 则表示
已经到了输入流的末尾。为了提高 I/O 操作的效率,建议尽量使用下面两种 read()
方法
int read(char[] cbuf)从输入流中读取若干个字符,并把它们保存到参数 cbuf 指定的字符数组中。 该方
法返回读取的字符数,如果返回 -1,则表示已经到了输入流的末尾
int read(char[] cbuf,int off,int len)从输入流中读取若干个字符,并把它们保存到参数 cbuf 指定的字符数组中。其中,
off 指定在字符数组中开始保存数据的起始下标,len 指定读取的字符数。该方法返
回实际读取的字符数,如果返回 -1,则表示已经到了输入流的末尾

FileReader 


java.io.FileReader类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

作用:把硬盘文件中的数据以字符的方式读取到内存中。

Tips:字节与字符的对应规则。Windows系统的中文编码默认时GBK编码表。IDEA中utf-8。

构造方法:(红色为常用)

构造方法摘要
FileReader(File file)
          在给定从中读取数据的 File 的情况下创建一个新 FileReader。

FileReader(FileDescriptor fd)
          在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader。
FileReader(String fileName)
          在给定从中读取数据的文件名的情况下创建一个新 FileReader。


参数:String name文件路径;File file文件

构造方法的作用:

1.创建一个FileReader对象

2.会把FileReader对象指向要读取的文件

字符输入流的使用步骤:

1.创建FileReader对象,构造方法中绑定要读取的数据源;

2.使用FileReader对象中的方法read读取文件;

3.释放资源。
 

// 创建FileReader对象,构造方法中绑定要读取的数据源;
FileReader fr = new FileReader("D:\\a\\a.txt");
// 使用FileReader对象中的方法read读取文件
int len = 0;
while((len = fr.read()) != -1){ // 读到末尾
    // 一个字符-->ASCII码对应
    // 你-->20320
    System.out.println(len);
    // 你-->20320-->你
    System.out.println((char)len); // 大到小,强制转换
}
fr.close(); // 释放资源
// int read(char[] cbuf)一次读取读个字符,将字符读入数组。
char[] cs = new char[1024]; // 存储读取到的多个字符
int len = 0; // 记录每次读取的有效字符个数
while((len = fr.read(cs)) != -1){
    /*
    String类的构造方法
    String(char[] value)把字符数组转换为字符串
    String(chaar[] value,int offset,int count)把字符数组的一部分转换为字符串
    offset数组的开始索引,count转换的个数
     */
    System.out.println(new String(cs,0,len));
}
fr.close(); // 释放资源

 

字符输出流

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

Writer 类的常用子类如下。

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


与 OutputStream 类相同,Writer 类也包含 close()、flush() 等方法,这些方法可以参考 OutputStream 类的方法。下面主要介绍 Writer 类中的 write() 方法和 append() 方法,如表 2 所示。
 

表 2 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
索引处的字符

FileWriter类


java.io.FileWriter类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

作用:把内存中的字符数据写入到文件中

构造方法:(红色为常用)

构造方法摘要
FileWriter(File file)
          根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(File file, boolean append)
          根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(FileDescriptor fd)
          构造与某个文件描述符相关联的 FileWriter 对象。
FileWriter(String fileName)
          根据给定的文件名构造一个 FileWriter 对象。
FileWriter(String fileName, boolean append)
          根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。

 参数:写入数据的目的地

String name 文件路径;File file 文件

构造方法作用:

1.创建一个FileWriter对象;

2.会根据构造方法中传递的文件/文件路径,创建文件;

3.会把FileWriter对象指向创建好的文件。

字符输出流的使用步骤:

1.创建一个FileWriter对象;

2.构造方法中绑定要写入数据的目的地;

3.使用FileWriter对象中的方法writer,把数据据写入到内存缓冲区(字符转换为字节的过程)中;

4.使用FileWriter对象中的方法flush,把内存缓冲区中的数据,刷新到文件中;

4.释放资源(会把内存缓冲区中的数据刷新到文件中,故flush可不写)。
 

FileWriter fw = new FileWriter("D:\\a\\abc.txt");
// 97-->a
fw.write(97); 
fw.flush(); // 如果都不写,则在缓冲区,没有刷新进文件中
fw.close();

练习读取多个字符案例 

import java.io.*;
import java.util.Arrays;
 
public class ReaderTest006 {
    public static void main(String[] args) throws IOException {
        //定义File对象
        File f1=new File("D:/a.txt");
        //字符输入流Reader
        Reader in=new FileReader(f1);
        //使用缓冲区读取多个字符
        char[] buffer=new char[10];
        int n=in.read(buffer);//每次最多读取buffer数组长个字符,把读取到的字符存入buffer数组中,返回的是实际读取的字符数
        System.out.println(n);
        System.out.println(Arrays.toString(buffer));
        char[] buffer1=new char[10];
        int n1=in.read(buffer1);//每次最多读取buffer数组长个字符,把读取到的字符存入buffer数组中,返回的是实际读取到的字符数
        System.out.println(n1);
        System.out.println(Arrays.toString(buffer1));
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值