Reader和Writer

本文介绍了Java中的字符流Reader和Writer,它们是输入输出流的抽象类,提供读写字符的功能。Reader用于从文件读取字符到控制台,Writer则用于将控制台内容写入文件。文章详细讲解了Reader和Writer的常用方法,如read、write、close等,并探讨了缓冲技术在Writer中的应用。同时,通过示例展示了如何使用Reader和Writer进行数据的读写操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Writer用于写出去到文件中,Reader用于把外面的文件读进控制台
Writer和Reader有很多子类,但是子类大多都是直接运用父类Writer和Reader的方法,而且Writer和Reader方法不多,且有共性,故只要搞懂Writer和Reader的方法即可。Writer和Reader都是抽象类,所以想输入输出只能用他们的子类。

字节流不能直接操作Unicode字符,所以java提供了字符流,汉字在文件中占用2个字节,如果使用字节流,读取不当会出现乱码现象,采用字符流就可以避免这个现象,在Unicode字符中,一个汉字被看作一个字符。
所有字符输入流类都是Reader(输入流)抽象类的子类,而所有字符输出流都是Writer(输出流)抽象类的子类。

Reader常用方法

读取方法
int read() 用于从流中读出一个字符,并将它返回
int read(char buffer[]):将从流中读出的字符放到字符数组buffer中,返回读出的字符数
int read(char buffer[],int offset,int length):将读出的字符放到字符数组的指定offset开始的空间,每次最多读出length个字符

其他方法:
void close():关闭Reader流
skip(long n):跳过指定的n个字符
boolean ready():判断流是否已经准备好被读取
void mark(int readAheadLimit)
void reset()

Reader例子

Reader fr = new FileReader("C:/mydata.txt");
BufferedReader br = new BufferedReader(fr);
String record = null;
int count = 0;
while ((record = br.readLine()) != null) {
    count++;
    System.out.printf(“%d:%s“,count,record);
}

Reader类
低级Reader类:
CharArrayReader
StringReader
PipedReader
FileReader
高级Reader类
BufferedReader
InputStreamReader
LineNumberReader

Writer工作原理

将写入的数据先存储到缓冲区,随着刷新而将缓冲区中的数据输入到文件中,刷新后缓冲区清空,这就是缓冲技术。因而有了BufferWriter,对BufferWriter操作实际是对与BufferedWriter关联的FileWriter类操作,所以对BufferedWriter进行flush和close实际上是对FileWriter进行flush和close。

Reader读进来只能一个一个字符去读,所以这里缓冲技术显得格外重要。

复制的原理:将文本中的数据缓存到Reader流中,再新建个文件,用Writer释放出去。

Writer常用方法

写入方法:
void write(int c):将参数c的低16位组成字符写入到流中。
void write(char[] buffer):将字符数组buffer中的字符写入到流中。
void write(char[] buffer, int offset, int length):将字符数组buffer中从offset开始的length个字符写入到流中。
void write(String string):将string字符串写入到流中。
void write(String string, int offset, int length):将字符string中从offset开始的length个字符写入到流中。
其他方法:
void close():和OutputStream的close方法类似。
void flush():和OutputStream的flush方法类似。

Writer例子

try {
//字符文件输出流
    Writer fw = new FileWriter(“c:/mydata.txt"); 
//打印流
PrintWriter out = new PrintWriter(fw); out.print("面朝大海,春暖花开!"); 
  out.printf(“%d * %d = %d“, 2, 3, 2*3); out.close();                                  
    fw.close();                                   
} catch (IOException e) {                             
    e.printStackTrace();                          
} 

从键盘输入数据,保存到文件中

//InputStreamReader为字节转换为字符输入流
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(new FileWriter(“d:\\abc.txt”));

String line = null;
while((line = reader.readLine()) != null){
    if(“quit”.equals(line.toLowerCase())){
        break;
    }
  pw.println(line);
}
pw.close();

Writer相关类
低级Writer类:
CharArrayWriter
StringWriter
PipedWriter
FileWriter
高级Writer类:
BufferedWriter
OutputStreamWriter
PrintWriter

用法示例:

//writer的用法
public class IOWriter {

    /**
     * @param IO流中的writer
     * 向demo.txt文本中写入东西
     * 如果是FileWriter fileWriter=new FileWriter("D:\\demo.txt",true);则是在之前的基础上续写
     * 如果没有true,则是覆盖之前写的所以内容
     */
    public static void main(String[] args) {

        try {
            FileWriter fileWriter=new FileWriter("D:\\demo.txt");
            fileWriter.write("abc");
            fileWriter.write("defg");
            fileWriter.flush();//flush刷新后,流可以继续使用
            fileWriter.close();//close刷新后,流关闭
        } catch (IOException e) {
            e.printStackTrace();
        }  
    }
}

//reader的用法

public class IOReader {
    /**
     * @param IO流中的Reader
     * 把demo.txt中的字符流都读出来 
     */
    public static void main(String[] args) {
        try {
            FileReader fileReader=new FileReader("D:\\demo.txt");    
            char[] buffer=new char[1024];
            int len=0;
            while((len=fileReader.read(buffer))!=-1) {
                System.out.println(new String(buffer, 0, len));
            }
//第一种方法:
            /*
               while(true) {    
                int a=fileReader.read();
                if(a==-1) {
                    break;
                }
                System.out.print((char)a+"");
            }*/

//第二种方法:
            /*int a=0;
            while ((a=fileReader.read())!=-1) {
                System.out.print((char)a+"\t");
            }*/

//第三种方法:     
            /*
             * 读取文件的方法(经典)
             */
            /*char[] buf=new char[1024];
            int len=0;
            while((len=fileReader.read(buf))!=-1) {
                String bufferString=new String(buf, 0, len);
                System.out.println(bufferString);
            }*/        
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

参考博客:
http://blog.csdn.net/noble510520/article/details/50083555

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值