IO流(学习Java第24天)(转换流OutputStreamWriter、转换流InputStreamReader、字符流便捷类)

目录

一、转换流OutputStreamWriter

二.转换流InputStreamReader

三.字符流便捷类


一、转换流OutputStreamWriter

java.io.OutputStreamwriter类,继承Writer类,他是字符输出流,只能操作文本文件,不能操作其他类型文件。OutputStreamwriter是字符流通向字节流的桥梁(字符流转成字节流),使用指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。

  • OutputStreamWriter构造方法
    • OutputStreamWriter(OutputStream in): 创建一个使用默认字符集的字符流
    • OutputStreamWriter(OutputStream in, String charsetName): 创建一个指定字符集的字符流
OutputStreamWriter isr = new OutputStreamWriter(new FileOutputStream("out.txt"));
OutputStreamWriter isr2 = new OutputStreamWriter(new FileOutputStream("out.txt") , "GBK");
  • 写出数据方法
    • void write(int c)写出单个字符
    • void write(char[] ch)写出字符数组
    • void write(char[] ch,int off,int len)写出字符数组一部分,开始索引和写出的个数
    • void write(String s)写入字符串
    • void flush()`刷新该流的缓冲,字符流写数据会先写在内存中,刷新后才会到达目的文件

 

/**
 * 字符输出流 java.io.OutputStreamWriter 继承Writer类
 * Writer类: 具备写入数据的方法 write
 * write(int c)写入单个字符
 * write(char[] c)写入字符数组
 * write(char[] c,int off,int len)写入字节数组一部分,开始索引,写入的个数
 * write(String str) 写入字符串
 * OutputStreamWriter类称为转换流: 字符流通向字节流的桥梁,字符转成字节
 *转换: 字符,查询编码表,得到字节,交给字节流处理
 * 注意: 字符流写入数据: 数据写入到内存中,而不是目的文件
 * 字符输出流父类 Writer,提供方法 flush()刷新,数据从内存中刷新到目的文件
 */
public class Demo {
    public static void main(String[] args) throws IOException {
        //writeUTF();
        writeGBK();
    }
    /*
        使用转换流OutputStreamWriter,将汉字写入文本文件
        采用编码表是UTF-8
        构造方法:OutputStreamWriter(OutputStream out) 传递字节输出流 new FileOutputStream
     */
    public static void writeUTF()throws IOException {
        //创建字节输出流
        FileOutputStream fos=new FileOutputStream("d:\\sp\\utf.txt");
        //创建转换流对象,构造方法中,传递字节输出流
        OutputStreamWriter osw=new OutputStreamWriter(fos);
        //转换流方法write写入数据
        osw.write("你好");
        //osw.flush();
        osw.close();//关闭流,刷新
    }
    /*
      使用转换流OutputStreamWriter,将汉字写入文本文件
      采用编码表是GBK
      构造方法:
      OutputStreamWriter(OutputStream out,String 编码表名字) 传递字节输出流 new FileOutputStream
     */
    public static void writeGBK()throws IOException{
        //创建字节输出流
        FileOutputStream fos=new FileOutputStream("d:\\sp\\gbk.txt");
        //创建转换流对象,构造方法传递字节输出流,传递字符串编码表
        OutputStreamWriter osw=new OutputStreamWriter(fos,"GBK");
        osw.write("你好");
        osw.close();
    }
}

二.转换流InputStreamReader

java.io.InputStreamReader类,继承Reader类,他是字符输入流,只能操作文本文件,不能操作其他类型文件。InputStreamReader是字节流通向字符流的桥梁(字节流转成字符流),使用指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。 

  • InputStreamReader构造方法
    • InputStreamReader(InputStream in): 创建一个使用默认字符集的字符流
    • InputStreamReader(InputStream in, String charsetName): 创建一个指定字符集的字符流
InputStreamReader isr = new InputStreamReader(new FileInputStream("in.txt"));
InputStreamReader isr2 = new InputStreamReader(new FileInputStream("in.txt") , "GBK");
  • InputStreamReader读取数据方法
    • int read()读取单个字符,读取到文件末尾时返回-1
    • int read(char[] ch)读取字符存储到数组中个,返回读取到的字符个数,读取到文件末尾时返回-1
/**
 * @create 2022-02-19 14:57
 *  java.io.InputStreamReader 继承Reader 字符输入流
 *  InputStreamReader字符输入流,父类Reader定义好的读取的方法
 *  int read()读取单个字符
 *  int read(char[] c)读取字符,存储在数组中
 *  InputStreamReader是转换流, 字节流通向字符流的桥梁,字节转成字符
 */
public class Demo {
    public static void main(String[] args) throws IOException {
        //readUTF();
        writeGBK();
    }
    /*
      InputStreamReader转换流,读取文本文件
      使用编码表UTF-8
      构造方法:InputStreamReader(InputStream in) 传递字节输入流,new FileInputStream
     */
    public static void readUTF()throws IOException {
        //创建字节输入流
        FileInputStream fis=new FileInputStream("d:\\sp\\utf.txt");
        //创建转换流对象
        InputStreamReader isr=new InputStreamReader(fis);
        char[] ch=new char[1024];
        int len=0;
        while((len=isr.read(ch))!=-1){
            //数组转成字符串打印
            System.out.println(new String(ch,0,len));
        }
        isr.close();
    }
    /**
      InputStreamReader转换流,读取文本文件
      使用编码表GBK
      构造方法:InputStreamReader(InputStream in,String 编码表名) 传递字节输入流new FileInputStream
     */
    public static void writeGBK()throws IOException{
        //创建字节输入流对象
        FileInputStream fis=new FileInputStream("d:\\sp\\gbk.txt");
        //创建转换流对象,构造方法传递字节输入流,指定使用编码表
        InputStreamReader isr=new InputStreamReader(fis,"gbk");
        char[] ch=new char[1024];
        int len=0;
        while( (len = isr.read(ch)) !=-1){
            //数组转成字符串打印
            System.out.println(new String(ch,0,len));
        }
    }
}

 

三.字符流便捷类

使用转换流进行文本文件的读写可以进行编码表的设置,但是我们经常使用的是平台默认的编码表进行文本文件操作的,因此可以选择字符流的便捷类来使用。

FileWriter继承OutputStreamWriter,使用平台默认编码表写出数据。

FileReader继承InputStreamReader,使用平台默认编码表读取数据。

  • FileWriter类构造方法
    • FileWriter(File file): 创建一个新的 FileWriter,给定要读取的File对象  
    • FileWriter(String fileName): 创建一个新的 FileWriter,给定要读取的文件的名称
/**
 *  字符输出流使用的便捷类
 *  java.io.FileWriter 写入文本文件  继承Writer
 *  FileWriter继承转换流OutputStreamWriter
 *  OutputStreamWriter父类,可以指定编码表
 *  FileWriter子类,只能使用默认的编码表
 *  write写入数据的方法:
 *    写入单个字符,字符数组,字符串
 *    构造方法,传递字符串的文件名
 */
public class Demo {
    public static void main(String[] args) throws IOException {
        //创建字符输出流的便捷流
        FileWriter fw=new FileWriter("d:\\sp\\123.txt");
        //写入数据
        fw.write(97);//单个字符
        char[] ch="helloWorld".toCharArray();
        fw.write(ch);
        fw.write("呵呵哈哈");
        fw.close();
    }
}

 

/**
 * 字节流写入数据: 追加和换行
 * 流对象构造方法,第二个参数true
 * 换行问题:
 *   Windows:  \r\n
 *   Linux:    \n
 *    Mac:      \r
 */
public class FileWriterDemo02 {
    public static void main(String[] args) throws IOException{
        //追加写入
        FileWriter fw = new FileWriter("e:/456.txt",true);
        fw.write("第一行\r\n");
        fw.write("第二行");
        fw.close();
    }
}

 

  • FileReader类的构造方法
    • FileWriter(File file): 创建一个新的 FileWriter,给定要读取的File对象。   
    • FileWriter(String fileName): 创建一个新的 FileWriter,给定要读取的文件的名称。
/**
 *  java.io.FileReader 读取字符文件的便捷类
 *  继承 InputStreamReader ,继承Reader
 *  FileReader读取文本文件,不能改变编码表的,使用默认的UTT-8
 *  构造方法:FileReader(String 文件名)
 */
public class Demo {
    public static void main(String[] args) throws IOException {
       //创建字符输入流的便捷流类对象
        FileReader fr=new FileReader("d:\\sp\\utf.txt");
        char[] ch=new char[1024];
        int len=0;
        while((len=fr.read(ch)) !=-1){
            System.out.println(new String(ch,0,len));
        }
        fr.close();
    }
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值