天天看点

JavaSE@拓展补遗@笔记[email protected]流@字符流介绍及常用方法一、字符流

一、字符流

所有的文件都是字节文件,而只有文本文件的数据可以称为字符。

1、字符输入流父类Reader

方法 说明
close() 关闭流资源
read() 读取一个字符
read(char[] chs) 读取一个字符数组的内容

2、FileReader类

构造方法

方法 说明
FileReader(File file) 使用File对象的路径创建输入流
FileReader(String fileName) 使用字符串路径创建输入流
  • 代码演示

构造方法演示:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
​
public class Test01 {
    public static void main(String[] args) throws FileNotFoundException {
        //字符输入流构造方法
        /*
            注意事项:
                1.如果文件不存在,输入流会报错(系统找不到指定的文件。)
                2.如果写的是文件夹,流对象都会报错(拒绝访问。)
         */
        //FileReader(File file)
        //使用File对象的路径创建输入流
        //FileReader fr = new FileReader(new File("day10\\123.txt"));
​
        //FileReader(String fileName)
        //使用字符串路径创建输入流
        FileReader fr2 = new FileReader("day10\\123.txt");
    }
}
           

常用读取方法演示(一次读取一个字符和一次读取字符数组):

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
​
public class Test02 {
    public static void main(String[] args) throws IOException {
        //字符输入流的常用方法
        FileReader fr = new FileReader("C:\\Users\\jin\\Desktop\\文件复制.java");
//        FileInputStream fr = new FileInputStream("C:\\Users\\jin\\Desktop\\文件复制.java");
​
        //read() :读取一个字符
        //返回的是字符对应的数值
        //如果读到了文件的末尾会返回-1
        //int i;
        //while((i=fr.read()) != -1){
        //    System.out.println((char)i);
        //}
​
        //read(char[] chs): 读取一个字符数组的内容
        //读取返回的是读取到的字符个数,如果读到了末尾会返回-1
        char[] chs = new char[5];
        int len;
        while((len=fr.read(chs)) != -1){
            System.out.println(new String(chs,0,len));
        }
​
​
        //close()
        //关闭流资源
        fr.close();
    }
}
           

3、字符输出流父类Writer

常用方法

方法 说明
close() 关闭流资源
flush() 刷新
write(int c) 写出一个字符
write(char[] cbuf) 写出一个字符数组的内容
write(char[] b, int off, int len) 写出一个字符数组的一部分
write(String str) 写出一个字符串

4、FileWriter类

构造方法

方法 说明
FileWriter(File file) 用File对象所表示的路径创建输出流对象
FileWriter(String fileName) File字符串所表示的路径创建输出流对象
FileWriter(File file,boolean b) 用File对象所表示的路径创建输出流对象,true表示续写
FileWriter(String fileName,boolean b) File字符串所表示的路径创建输出流对象,true表示续写
  • 代码演示

构造方法演示:

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
​
public class Test03 {
    public static void main(String[] args) throws IOException {
        //字符输出流构造方法
        /*
            注意事项:
                1.如果文件不存在,输出流会创建文件
                2.如果文件已存在,输出流会覆盖文件
                3.所有流只能操作文件,不能操作文件夹(拒绝访问。)
                4.如果构造加了参数true 表示不清空文件 续写
         */
        //FileWriter(File file)
        //用File对象所表示的路径创建输出流对象
        //FileWriter fw = new FileWriter(new File("day10\\123.txt"));
​
​
        //FileWriter(String fileName)
        //File字符串所表示的路径创建输出流对象
        //FileWriter fw2 = new FileWriter("day10\\123.txt");
​
        //FileWriter(File file,boolean b)
        //用File对象所表示的路径创建输出流对象,true表示续写
        //FileWriter fw = new FileWriter(new File("day10\\123.txt"),true);
​
        //FileWriter(String fileName,boolean b)
        //File字符串所表示的路径创建输出流对象,true表示续写
        FileWriter fw2 = new FileWriter("day10\\123.txt",true);
    }
}
           
  • 常用方法演示

常用方法:

import java.io.FileWriter;
import java.io.IOException;
​
public class Test05 {
    public static void main(String[] args) throws IOException {
        //创建对象
        FileWriter fw = new FileWriter("day10\\123.txt");
​
        //write(int c)
        //写出一个字符
        fw.write(97);
        fw.write('a');
        fw.write('我');
​
        //write(char[] cbuf)
        //写出一个字符数组的内容
        char[] chs = {'a','b','c','我','爱','你'};
        fw.write(chs);
​
        //write(char[] b, int off, int len)
        //写出一个字符数组的一部分
        //输出“我爱你”这部分,3索引开始输出3个
        fw.write(chs,3,3);
​
        //write(String str)
        //写出一个字符串
        fw.write("石原里美");
        
        //关闭资源
        fw.close();
    }
}
           
  • 关闭和刷新

字符输出流底层有一个缓冲区,输出的字符会被先放在缓冲区。

当调用刷新或者是缓冲区放满时才会真正的输出到文件中。

close()方法自带刷新功能,只要最后记得关流,中间可以不做刷新。

import java.io.FileWriter;
import java.io.IOException;
​
public class Test04 {
    public static void main(String[] args) throws IOException {
        //字符输出流的常用方法
        FileWriter fw = new FileWriter("day10\\123.txt");
​
        //输出
        fw.write(97);
        fw.write(97);
​
        //flush()
        //刷新(可以把缓冲区的数据刷新到文件中)
        //close()
        //关闭方法其实自带了刷新功能
        //在最后只要调用了关闭就可以把缓冲区的内容全部放到文件中
        //关闭流资源
        fw.close();
    }
}
           

常见错误:

//要求:给文件输出123456789
​
//-------使用字节输出流不好做------------------------
//创建字节输出流
FileOutputStream fos = new FileOutputStream("day10\\123.txt");
//循环
for (int i = 1; i < 10; i++) {
    fos.write(i);
}
//关流
fos.close();
​
​
​
-------使用字符输出流好做------------------------
//创建字符输出流
FileWriter fos = new FileWriter("day10\\123.txt");
//循环
for (int i = 1; i < 10; i++) {
    fos.write(i+"");
}
//关流
fos.close();
           

简单结论:

字节流:
    用于操作非文本数据(也可以操作文本数据但是我们不用)
字符流:
    用于操作文本数据(不能操作非文本数据)