Java拾贝第十一天——IO流之字符流

Java拾贝不建议作为0基础学习,都是本人想到什么写什么

字符流

字符流是专门针对字符的IO。在字符流中:

输出流主要使用Writer类,输入流主要使用Reader类

字符输出流

Writer类定义如下:

public abstract class Writer implements Appendable, Closeable, Flushable

也是一个抽象类,想要操作文件需要使用其子类FileWriter。FileWriter构造方法如下:

public FileWriter(File file) throws IOException
public FileWriter(String fileName, boolean append) throws IOException

与FileOutputStream相同的,末尾追加内容需要使用第二个有参构造并传入布尔值。

FileWriter类常用方法如下:

方法 类型 描述
public void close() throws IOException 普通方法 关闭流
public void write(String str) throws IOException 普通方法 输出字符
public void write(char cbuf[]) throws IOException 普通方法 输出字符数组
public void flush() throws IOException 普通方法 刷新缓冲区

write(String str)

D:\IOtest\text.txt内:

//空

栗子:

    public static void main(String[] args) {
        File file = new File("D:" + File.separator + "IOtest" + File.separator + "text.txt");
        try {
            FileWriter writer = new FileWriter(file);
            writer.write("Hello world!");
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

程序运行后,D:\IOtest\text.txt内:

Hello world!

与OutputStream操作流程没有什么太大区别,唯一好处就是可以直接输出字符串。不用转为byte数组之后再输出。

flush()

这里是与OutputStream最大的不同之处。依旧是上述栗子,但这次不关闭流。
D:\IOtest\text.txt内:

Hello world!

栗子:

    public static void main(String[] args) {
        File file = new File("D:" + File.separator + "IOtest" + File.separator + "text.txt");
        try {
            FileWriter writer = new FileWriter(file,true);//追加输出
            writer.write("Hello world!");
            //注意这里没有关闭流
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

程序运行后,D:\IOtest\text.txt内:

Hello world!

从结果上看,文件内并没有成功追加内容,这是因为字符流操作时使用了缓冲区。

而在关闭字符流时会强制刷新缓冲区,如果没有关闭流,则缓冲区的内容会直接丢失

建议字符流手动调用flush()方法,人为地刷新缓冲区。

至此,修改栗子如下:

    public static void main(String[] args) {
        File file = new File("D:" + File.separator + "IOtest" + File.separator + "text.txt");
        try {
            FileWriter writer = new FileWriter(file, true);
            writer.write("Hello world!");

            writer.flush();//人为地刷新缓冲区
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

D:\IOtest\text.txt内:

Hello world!Hello world!

为什么有缓冲区?
:缓冲区可以理解为一段内存,因为读取内存的速度比较快,所以这么做可以提升性能。

字符输入流

Reader类定义如下:

public abstract class Reader implements Readable, Closeable

又双叒叕是抽象类。FileReader构造方法如下:

public FileReader(File file) throws FileNotFoundException

FileReader类常用方法如下:

方法 类型 描述
public void close() throws IOException 普通方法 关闭流
public int read() throws IOException 普通方法 读取一个字符
public int read(char cbuf[]) throws IOException 普通方法 将内容读取到字符数组中,返回读取的长度

public int read(char cbuf[]) throws IOException

将内容读取到字符数组,返回读取的长度。

D:\IOtest\text.txt内:

任意的字符askdjsa123124@!#**!@¥
asdasfs sdafasdfjsadjfsdahgio12312
124124 124123123人riufisdf
 123214 !!@#FDSAFSDAGSDG
23
1241武器的飒!

栗子:

    public static void main(String[] args) {
        File file = new File("D:" + File.separator + "IOtest" + File.separator + "text.txt");
        try {
            FileReader reader = new FileReader(file);
            char[] chars = new char[1024];
            int i;
            while ( (i=reader.read(chars)) != -1 ){
               System.out.println(new String(chars,0,temp));
            }
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

程序运行结果:

任意的字符askdjsa123124@!#**!@¥
asdasfs sdafasdfjsadjfsdahgio12312
124124 124123123人riufisdf
 123214 !!@#FDSAFSDAGSDG
23
1241武器的飒!

使用字符流好还是字节流好?

在硬盘或传输时都是以字节的形式进行读写,包括图片和音频等。

而字符流只有内存中才会形成。(存疑,我在Java开发实战经典读到的这句话)

在开发中,字节流使用较为广泛。

posted @ 2023-10-25 21:16  rowbed  阅读(8)  评论(0编辑  收藏  举报