字符流

1.为什么要用字符流

因为使用字节流操作文字时容易出现乱码问题
所以使用字符流读取中文,字符流以字符为单位操作数据,这样就可以解决中文乱码问题

2.字符输入流

顶层父类: Reader(抽象类)

共性方法:
public void close();//释放资源
public int read();//一次读一个字符
public int read(char[] chs);//一次读取一堆字符,实际读取的字符个数

3.FileReader类的使用

文件的字符输入流: 以字符为单位从文件中读取数据

  • a.构造方法

public FileReader(String filepath);//指定文件路径
public FileReader(File file);//指定File对象

public class FileReaderDemo01 {
    public static void main(String[] args) throws Exception {
        //1.创建一个FileReader对象
        FileReader fr = new FileReader("1.txt");
//        FileReader fr = new FileReader(new File("1.txt"));
        /**
         * 以上构造干了三件事!!
         * a.创建对象 fr
         * b.判断文件是否存在
         *      如果存在,就存在,不清空内容
         *      如果不存在,直接抛出FileNotFoundException异常
         * c.绑定fr和文件1.txt
         */
    }
}
  • b.读取一个字符
/**
 * FileReader的read方法
 */
public class FileReaderDemo02 {
    public static void main(String[] args) throws Exception {
        //1.创建一个FileReader对象
        FileReader fr = new FileReader("1.txt");
        //2.一次读一个字符
        //int ch = fr.read();
        //System.out.println((char) ch);
        //============一次读取一个字符的标准循环============
        int ch = 0; //用于保证读取到的字符
        /**
         * (ch = fr.read()) != -1
         * 以上代码干了三件事!
         * a.先读 fr.read()
         * b.赋值 ch = 读取到的字符
         * c.判断 ch != -1
         */
        while ((ch = fr.read()) != -1) {
            System.out.print((char) ch);
        }
        //3.释放资源
        fr.close();
    }
}
  • c.读取一个字符数组
/**
 * FileReader的read方法
 */
public class FileReaderDemo03 {
    public static void main(String[] args) throws Exception {
        //1.创建一个FileReader对象
        FileReader fr = new FileReader("1.txt");
        //2.一次读一个字符数组
        //char[] chs = new char[4];
        //int len = fr.read(chs);
        //System.out.println("实际读取"+len+"个字符!");
        //System.out.println(new String(chs,0,len));
        //=========一次读取一个字符数组的标准循环==========
        char[] chs = new char[4];
        int len = 0;
        /**
         * (len = fr.read(chs)) != -1
         * 以上代码干了三件事!!
         * a.先读 fr.read(chs)
         * b.赋值 len = 实际读取的字符个数
         * c.判断 len != -1
         */
        while ((len = fr.read(chs)) != -1) {
            System.out.print(new String(chs,0,len));
        }

        //3.释放资源
        fr.close();
    }
}
4.字符输出流

顶层父类:Writer(抽象类)

共性方法:
public void close();//释放资源
public void flush();//刷新缓冲区(对于字符流有用!!)
public void write(int ch);//写一个字符
public void write(char[] ch);//写一堆字符
public void write(char[] ch,int startIndex,int len);//写一堆字符的一部分
public void write(String str);//写一个字符串
public void write(String str,int startIndex,int len);//写一个字符串的一部分

5.FileWriter类的使用

文件的字符输出流:向文件中以字符为单位写数据

  • a.构造方法

public FileWriter(String filepath);指定文件路径
public FileWriter(File file);指定文件对象

/**
 * FileWriter的构造方法
 */
public class FileWriterDemo01 {
    public static void main(String[] args) throws Exception {
        //1.创建一个FileWriter对象
        FileWriter fw = new FileWriter("1.txt");
//        FileWriter fw = new FileWriter(new File("1.txt"));
        /***
         * 以上构造干了三件事!
         * a.创建对象fw
         * b.判断文件是否存在
         *      如果存在,清空文件内容
         *      如果不存在,创建一个新文件
         * c.绑定fw和1.txt
         */
    }
}  
  • b.写出字符数据的三组方法

public void write(int ch);//写一个字符
public void write(char[] ch);//写一堆字符
public void write(char[] ch,int startIndex,int len);//写一堆字符的一部分
public void write(String str);//写一个字符串
public void write(String str,int startIndex,int len);//写一个字符串的一部分

/**
 * FileWriter的write方法
 */
public class FileWriterDemo02 {
    public static void main(String[] args) throws Exception {
        //1.创建一个FileWriter对象
        FileWriter fw = new FileWriter("1.txt");
        //2.以字符写数据
        //a.一次写一个字符
        fw.write('中');
        //b.一次写一个字符数组
        char[] chs = {'中','国','我','爱','你'};
        fw.write(chs);
        //c.一次写一个字符数组中的一部分
        fw.write(chs,2,3);
        //d.一次写一个串
        fw.write("中国我爱你,你爱我吗?");
        //e.一次写一个串的一部分
        fw.write("中国我爱你,你爱我吗?",4,3);
        //3.释放资源
        fw.close();
    }
}
  • c.关闭和刷新的区别
/**
 * FileWriter的flush和close方法
 */
public class FileWriterDemo03 {
    public static void main(String[] args) throws Exception {
        //1.创建一个FileWriter对象
        FileWriter fw = new FileWriter("1.txt");
        //2.写数据
        fw.write("Java");
        //调用刷新缓冲区
        //fw.flush();
        //3.释放资源
        fw.close();
        //再次写数据
        fw.write("PHP"); //报错!!
    }
}

close方法和flush方法的区别:
a.flush用于刷新缓冲区,流并不关闭,可以继续写数据!
b.close也有刷新的功能,同时流也会关闭,不能继续使用该流写数据了!

  • d.续写和换行

如何续写呢?? 非常简单,只要使用以下两个构造即可
public FileWriter(String filepath,boolean append);指定文件路径
public FileWriter(File file,boolean append);指定文件对象

/**
 * FileWriter的续写
 */
public class FileWriterDemo04 {
    public static void main(String[] args) throws Exception {
        //1.创建一个FileWriter对象
        FileWriter fw = new FileWriter("1.txt", true);//true表示续写
        //2.写数据
        for (int i = 0; i < 10; i++) {
            fw.write("java");
        }
        //3.释放资源
        fw.close();
    }
} 

如何换行??非常简单,只要写入一个代码换行符号即可
windows: \r\n
Linux: \n
Mac: \r

/**
 * FileWriter的换行
 */
public class FileWriterDemo05 {
    public static void main(String[] args) throws Exception {
        //1.创建一个FileWriter对象
        FileWriter fw = new FileWriter("1.txt");
        //2.写数据
        for (int i = 0; i < 10; i++) {
            fw.write("php\r\n");
//            fw.write("\r\n");
        }
        //3.释放资源
        fw.close();
    }
}  

字符流和字节流我们什么时候采用哪些流??
如果读写文本文件(.txt .java): 字符流
如果其他文件(.png .avi .mp3 .ppt .doc .xlsx):字节流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lemon20120331

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值