Writer/Reader 字符流

Writer:字符输出流基类

  • 结构图

OutputStreamWriter 字符输出流

  • 概述
    转换流 java.io.OutputStreamWriter,是Writer的子类,是从字符流到字节流的桥接器。
    它使用指定的字符集将字符编码为字节。它使用的字符集可以由名称指定,也可以接受平台的默认字符集。

  • 构造方法

    构造方法描述
    OutputStreamWriter​(OutputStream out)创建使用默认字符编码的OutputStreamWriter
    OutputStreamWriter(OutputStream out, String charsetName)创建使用指定字符集的OutputStreamWriter
    public class Demo {
        public static void main(String[] args) throws IOException {
            OutputStreamWriter osw = new
                    OutputStreamWriter(new
                    FileOutputStream("1.txt"));//默认UTF-8
            //写数据
            osw.write("西琳");
            //关闭流
            osw.close();
        }
    }
    ---*---
    输出结果:
    西林 被写入当前项目的目录下的1.txt文件中
    
    public class Demo {
        public static void main(String[] args) throws IOException {
            OutputStreamWriter osw = new
                    OutputStreamWriter(new
                    FileOutputStream("1.txt"),"GBK");
            //写数据
            osw.write("西琳");
            //关闭流
            osw.close();
        }
    }
    ---*---
    输出结果:
    ���� 被写入当前项目的目录下的1.txt文件中
    

    注意:该类将字符通过对应的字符集转换为一系列字节,存储到目的地。当“西琳”两个字符通过GBK字符集编码存放到文件中,该文件需支持GBK编码才能正常显示“西琳”,否则显示乱码。

  • 写数据方法

    方法名描述
    void write(int c)写一个字符
    void write(char[] cbuf)写入一个字符数组
    void write(char[] cbuf, int off, int len)写入字符数组的一部分
    void write(String s)写一个字符串
    void write(String s, int off, int len)写入字符串的一部分
    public class Demo{
        public static void main(String[] args) throws IOException {
            OutputStreamWriter osw =
                    new OutputStreamWriter(new FileOutputStream("1.txt"),"gbk");
            //写一个字符
    //        osw.write(97);
    
            //写一个字符数组
    //        char[] cs = {'a','b','c','d','e'};
    //        osw.write(cs);
    
            //写字符数组的一部分
    //        char[] cs = {'a','b','c','d','e'};
    //        osw.write(cs,1,3);
    
            //写一个字符串
    //        osw.write("abcde");
    
            //写字符串的一部分
    //        osw.write("abcde",1,3);
            
            //刷新流
    //        osw.flush();
            
            //关闭流
            osw.close();
        }
    }
    ---*---
    输出结果:
    a
    abcde
    bcd
    abcde
    bcd
    
  • 刷新流 / 关闭流

    方法名描述
    flush()刷新缓冲区,还可以继续写数据
    close()关闭流,释放资源,但关闭之前会刷新流。一旦关闭不能在写数据

FileWriter 写入字符文件的便捷类

  • 概述
    由于转换流的名字较长,而且一般情况都是按照本地默认编码实现的,所以为了简化书写,转换流提供了对应的子类。

  • 构造方法

    构造方法描述
    FileWriter(String fileName)创建写入字符便捷类对象,并指向文件
    FileWriter(File file)创建写入字符便捷类对象,并指向文件
    FileWriter(String fileName ,boolean append)创建写入字符便捷类对象,并指向文件。还可选择追加写入
    FileWriter(File file ,boolean append)创建写入字符便捷类对象,并指向文件。还可选择追加写入
  • 复制文件对比
    直接使用转换流

    public class Demo{
        public static void main(String[] args) throws IOException {
            InputStreamReader isr = 
                    new InputStreamReader(new FileInputStream("idea_test\\src\\com\\file\\testFile.java"));
            OutputStreamWriter osw = 
                    new OutputStreamWriter(new FileOutputStream("copy.java"));
            //复制文件
            char[] cs = new char[1024];
            int len;
            while ((len=isr.read(cs))!=-1){
                osw.write(cs);
            }
            //关闭流
            isr.close();
            osw.close();        
        }
    }
    ---*---
    输出结果:
    文件复制成功
    

    使用便捷类

    public class Demo{
        public static void main(String[] args) throws IOException {
            FileReader fr = new FileReader("idea_test\\src\\com\\file\\testFile.java");
            FileWriter sw = new FileWriter("copy.java");
    		//复制文件
            char[] cs = new char[1024];
            int c;
            while ((c= fr.read(cs))!=-1){
                sw.write(cs);
            }
            //关闭流
            fr.close();
            sw.close();
        }
    }
    ---*---
    输出结果:
    文件成功复制
    

BufferedReader 字符缓冲输入流

  • 概述
    和字节缓冲流一样,该类为字符输出流提供一个可设置大小的缓冲区,先将数据写入缓冲区,之后再一次写入内存中。注意:真正的读数据还是字符输出流,该类仅提供一个缓冲区。

  • 构造方法

    构造方法描述
    BufferedReader​(Reader in)创建使用默认大小的输入缓冲区的缓冲字符输入流
    BufferedReader​(Reader in, int sz)创建使用指定大小的输入缓冲区的缓冲字符输入流
  • 缓冲字符流复制文件

    public class Demo{
        public static void main(String[] args) throws IOException {
            BufferedReader br = 
            	new BufferedReader(new FileReader("idea_test\\src\\com\\file\\testpoker.java"));
            BufferedWriter bw = 
            	new BufferedWriter(new FileWriter("idea_test\\copy.java"));
            //一次复制一个字符
    //        int c = 0;
    //        while ((c=br.read())!=-1){
    //            bw.write(c);
    //        }
    
            //一次复制一个字符数组
            char[] cs = new char[1024];
            int len;
            while ((len=br.read(cs))!=-1){
                bw.write(cs);
            }
    
            //关闭流
            br.close();
            bw.close();
        }
    }
    ---*---
    输出结果:
    文件均复制成功
    

字符缓冲输出流特有功能

  • void newLine():写一个系统属性定义的行分隔符

    public class Demo{
        public static void main(String[] args) throws IOException {
            BufferedWriter bw = new BufferedWriter(new FileWriter("e:\\360sd\\2.txt"));
            BufferedReader br = new BufferedReader(new FileReader("e:360sd\\1.txt"));
            //一次读写一行字符
            String str;
            int len;
            while((str=br.readLine())!=null){//读一行字符(不包括换行符)
                bw.write(str);	//写入一个字符串
                bw.newLine();	//写入一个当前系统的换行符
                bw.flush();		//刷新流
                System.out.println(str);//用于查看结果
            }
            //关闭流
            br.close();
            bw.close();
        }
    }
    ---*---
    输出结果:
    1你好世界!
    2你好世界!
    3你好世界!
    4你好世界!
    

Reader :字符输入流基类

  • 结构图

InputStreamReader 字符输入流

  • 概述
    转换流 java.io.InputStreamReader,是Reader的子类,是从字节流到字符流的桥接器。
    它使用指定的字符集读取字节并将它们解码为字符。它使用的字符集可以通过名称指定,也可以明确指定,或者可以接受平台的默认字符集。

  • 构造方法

    构造方法描述
    InputStreamReader​(InputStream in)创建一个使用默认字符集的InputStreamReader
    InputStreamReader​(InputStream in, String charsetName)创建一个使用指定字符集的InputStreamReader
    public class Demo{
        public static void main(String[] args) throws IOException {
            InputStreamReader isr = 
            	new InputStreamReader(new FileInputStream("1.txt"));//默认UTF-8
            //读数据
            int ch = 0;
            while((ch=isr.read())!=-1){
                System.out.print((char) ch);
            }
            //关闭流
            isr.close();
        }
    }
    ---*---
    输出结果:
    西琳
    
    public class Demo{
        public static void main(String[] args) throws IOException {
            InputStreamReader isr = 
            	new InputStreamReader(new FileInputStream("1.txt"),"GBK");
            //读数据
            int ch = 0;
            while((ch=isr.read())!=-1){
                System.out.print((char) ch);
            }
            //关闭流
            isr.close();
        }
    }
    ---*---
    输出结果:
    ����
    

    注意:该类将字节通过对应的字符集读取并转换为字符,读取到程序中。当“西琳”两个字符通过UTF-8字符集编码存放到文件中,读取该文件也需要使用UTF-8字符集编码才能正常显示“西琳”,否则显示乱码。

  • 读数据方法

    方法名描述
    int read()读一个字符数据
    int read(char[] cbuf)读一个字符数组数据
    int read​(char[] cbuf, int offset, int length)读一个字符数组的一部分
    public class Demo{
        public static void main(String[] args) throws IOException {
            InputStreamReader isr = new InputStreamReader(new FileInputStream("1.txt"));
            //读一个字符
    //        int ch;
    //        while ((ch=isr.read())!=-1){
    //            System.out.print((char)ch);
    //        }
    
            //读一个字符数组
            char[] cs = new char[5];
            int len;
            while ((len=isr.read(cs))!=-1){
                System.out.println(new String(cs,0,len));
            }
    
            //关闭流
            isr.close();
        }
    }
    ---*---
    输出结果:
    abcd
    abcd
    

FileReader 读取字符文件的便捷类

  • 概述
    由于转换流的名字较长,一般情况都是按照本地默认编码实现的,所以为了简化书写,转换流提供了对应的子类。

  • 构造方法

    构造方法描述
    FileReader(String fileName)创建读取字符便捷类对象,并指向文件
    FileReader(File file)创建读取字符便捷类对象,并指向文件
  • 复制文件对比
    直接使用转换流

    public class Demo{
        public static void main(String[] args) throws IOException {
            InputStreamReader isr = 
                    new InputStreamReader(new FileInputStream("idea_test\\src\\com\\file\\testFile.java"));
            OutputStreamWriter osw = 
                    new OutputStreamWriter(new FileOutputStream("copy.java"));
            //复制文件
            char[] cs = new char[1024];
            int len;
            while ((len=isr.read(cs))!=-1){
                osw.write(cs);
            }
            //关闭流
            isr.close();
            osw.close();        
        }
    }
    ---*---
    输出结果:
    文件复制成功
    

    使用便捷类

    public class Demo{
        public static void main(String[] args) throws IOException {
            FileReader fr = new FileReader("idea_test\\src\\com\\file\\testFile.java");
            FileWriter sw = new FileWriter("copy.java");
    		//复制文件
            char[] cs = new char[1024];
            int c;
            while ((c= fr.read(cs))!=-1){
                sw.write(cs);
            }
            //关闭流
            fr.close();
            sw.close();
        }
    }
    ---*---
    输出结果:
    文件成功复制
    

BufferedWriter 字符缓冲输出流

  • 概述
    和字节缓冲流一样,该类为字符输出流提供一个可设置大小的缓冲区,先将数据写入缓冲区,之后再一次写入内存中。注意:真正的读数据还是字符输出流,该类仅提供一个缓冲区。

  • 构造方法

    构造方法描述
    BufferedWriter​(Writer out)创建使用默认大小的输出缓冲区的缓冲字符输出流
    BufferedWriter​(Writer out, int sz)创建一个使用给定大小的输出缓冲区的新缓冲字符输出流
  • 缓冲字符流复制文件

    public class Demo{
        public static void main(String[] args) throws IOException {
            BufferedReader br = 
            	new BufferedReader(new FileReader("idea_test\\src\\com\\file\\testpoker.java"));
            BufferedWriter bw = 
            	new BufferedWriter(new FileWriter("idea_test\\copy.java"));
            //一次复制一个字符
    //        int c = 0;
    //        while ((c=br.read())!=-1){
    //            bw.write(c);
    //        }
    
            //一次复制一个字符数组
            char[] cs = new char[1024];
            int len;
            while ((len=br.read(cs))!=-1){
                bw.write(cs);
            }
    
            //关闭流
            br.close();
            bw.close();
        }
    }
    ---*---
    输出结果:
    文件均复制成功
    

字符缓冲输入流特有功能

  • public String readLine():读一行字符。不包括任何终止字符,如果读到流的结尾,则返回null。

    public class Demo{
        public static void main(String[] args) throws IOException {
            BufferedWriter bw = new BufferedWriter(new FileWriter("e:\\360sd\\2.txt"));
            BufferedReader br = new BufferedReader(new FileReader("e:360sd\\1.txt"));
            //一次读写一行字符
            String str;
            int len;
            while((str=br.readLine())!=null){//读一行字符(不包括换行符)
                bw.write(str);	//写入一个字符串
                bw.newLine();	//写入一个当前系统的换行符
                bw.flush();		//刷新流
                System.out.println(str);//用于查看结果
            }
            //关闭流
            br.close();
            bw.close();
        }
    }
    ---*---
    输出结果:
    1你好世界!
    2你好世界!
    3你好世界!
    4你好世界!
    

总结

1.字符流本质是转换流,通过查询编码表实现字符与字节转换。既然是转换流那么就可以指定转换编码

2.字符缓冲流这套装备除了让字符流更强大以外还提供了特有功能。(读取一行字符串和写入行分隔符,newLine / readLine)

3.字符流写数据都需要刷新缓冲区。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值