• Java IO之字符流


    1、字符流
     
    字节流提供了处理任何类型输入/输出操作的功能(因为对于计算机而言,一切都是0和1,只需把数据以字节形式表示就够了),但它们不可以直接操作Unicode字符,因为一个Unicode字符占用2个字节,而字节流一次只能操作一个字节。既然Java的口号就是"一次编写、处处运行",那么包含直接的字符输入/输出的支持是必要的。因此就有一些字符输入/输出流,之前已经说明过了,字符流顶层是Reader和Writer这两个抽象类。
     
    2、Reader抽象类
     
    Reader是定义Java的字符输入流的抽象类,该类的所有方法在出错的情况下都将引发IOException。Reader类中有这些方法:
     
    方法
    作用
    abstract void close() 
    关闭该流并释放与之关联的所有资源
    void mark(int readAheadLimit)
    标记流中的当前位置
    boolean markSupported() 
    判断此流是否支持mark()操作
    int read() 
    从文件中读取单个字符
    int read(char[] cbuf) 
    从文件中读取字符到cbuf,返回值-1,表示没有读取到数据。
    abstract int read(char[] cbuf, int off, int len) 
    将文件中的字符读入cbuf数组,从off位置开始,读取len个字符。
    三个read方法在字符可用、发生I/O异常或者已经到达流的末尾前,此方法会一直阻塞
    int read(CharBuffer target) 
    试图将文件中的字符读入指定的字符缓冲区
    boolean ready()
    判断是否准备读取此流
    void reset()
    重置该流
    long skip(long n)
    跳过n个字符
     
     
    3、Writer抽象类
     
    Writer是定义字符输出流的抽象类,所有该类的方法都返回一个void值并在出错的条件下引发IOException。Writer类中的方法有:
     
    方法
    作用
    Writer append(char c) 
    将制定字符添加到此writer
    Writer append(CharSequence csq) 
    将制定字符序列添加到此writer
    Writer append(CharSequence csq, int start, int end)  
    将指定字符序列的子序列添加到此writer.Appendable
    abstract void close()  
    但要先flush()它
    abstract void flush()  
    刷新该流的缓冲
    void write(char[] cbuf) 
    将cbuf中的内容写入文件
    abstract void write(char[] cbuf, int off, int len)
    将字符数组cbuf中从off开始的len个字节写入文件
    void write(int c)
    写入单个字符到文件中
    void write(String str)  
    写入字符串到文件中
    void write(String str, int off, int len)
    写入str从off位置开始的len个字符到文件中
     
     
    4、FileReader和FileWriter
     
    FileReader类创建了一个可以读取文件内容的Reader类,最常用的构造方法是:
     
    • 1、FileReader(String fileName)
    • 2、FileReader(File file)
     
    FileWriter创建了一个可以写文件的Writer类,最常用的构造方法是:
     
    • 1、FileWriter(String fileName)
    • 2、FileWriter(String fileName, boolean append)
    • 3、FileWriter(File file)
     
    其中第二个构造方法,如果append为true,那么输出是追加到文件结尾的。FileWriter类的创建不依赖文件是否存在,在创建文件之前,FileWriter将在创建对象时打开它来作为输出。如果试图打开一个只读文件,那么将引发一个IOException。看一下FileWriter和FileReader的使用,现在D盘没有"Files.txt"文件:
     
    import java.io.File;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.Reader;
    import java.io.Writer;
    public class FileReaderWriterTest {
        public static void main(String[] args) throws Exception{
            File file = new File("D:/Files.txt");
            Writer out = new FileWriter(file);
            // 声明一个String类型对象
            String str = "Hello World!!!";
            out.write(str);
            out.close();
            
            //读文件操作
            Reader in = new FileReader(file);
            // 开辟一个空间用于接收文件读进来的数据
            char c[] = new char[1024];
            // 将c0的引用传递到read()方法之中,同时此方法返回读入数据的个数
            int i = in.read(c);
            in.close();
            if(i==-1){
                System.out.println("文件中无数据");
            }else{
                System.out.println(new String(c, 0, i));
            }
        }
    }
    

    利用FileWriter和FileReader进行了一次的读写操作,先看一下D盘Files文件夹下是否有"writer.txt",假如有"writer.txt"那"writer.txt"中又是什么:

    看来利用FileWriter写入一个内存中的字符串到文件中是成功了,那么利用利用FileReader读入文件中的内容到内存呢,看一下运行结果
    Hello World!!!
    打印结果和文件中的内容一致,说明FileReader的操作也成功。
     
    这就是FileWriter和FileReader的使用,和FileOutputStream和FileInputStream的使用差不多,不过实际操作中一般不会用FileWriter和FileReader。
     
    比较:
    InputStream和OutputStream类处理的是字节流,数据流中的最小单位是字节(8个bit);Reader与Writer处理的是字符流,在处理字符流时涉及了字符编码的转换问题
     
    Reader类能够将输入流中采用其他编码类型的字符转换为Unicode字符,然后在内存中为其分配内存;Writer类能够将内存中的Unicode字符转换为其他编码类型的字符,再写到输出流中。
     
     
  • 相关阅读:
    一、
    一、AJAX
    一、RequireHttps
    【2019-08-23】被环境影响时,想想初心
    【2019-08-22】任何收获,是需要成本的
    【2019-08-20】有点目标,有点计划,有点目的
    【2019-08-21】承认自己错误,就是正确的开始
    【2019-08-19】新,是一种魔力
    【2019-08-18】时间是有密度的
    【2019-08-17】工作太多是适得其反
  • 原文地址:https://www.cnblogs.com/liujiarui/p/13905677.html
Copyright © 2020-2023  润新知