zoukankan      html  css  js  c++  java
  • Java基础

    一、File

    二、字节流

    OutputStream(字节输出流)

    FileOutputStream(文件字节输出流)

    InputStream(字节输入流)

    FileInputStream(文件字节输入流)

    三、字符流

    Reader

    Writer

    FileReader

    FileWriter

    BufferedReader

    BufferedWriter

    四、总结

    字符流和字节流最大的区别

    在于,字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流操作时使用了缓冲区,通过缓冲区再操作文件。

    这也解释了为什么字符流不对资源进行close()就无法写入文件的原因。

    因为在关闭字符流时会强制性地将缓冲区中的内容进行输出,但是如果没有关闭,缓冲区中的内容是无法输出的。

    什么是缓冲区

    简单理解,缓冲区就是一块特殊的内存区域。为什么要使用缓冲区?

    因为如果一个程序频繁操作一个资源(文件或数据库),则性能会很低,为了提升性能,就可以将一部分数据暂时读入到内存的一块区域之中,

    以后直接从此区域读取数据即可,因为读取内存的速度要快于读取磁盘中文件内容的速度。

    在字符流的操作中,所有的字符都是在内存中形成的,在输出前会将所有的内容暂时保存在内存之中,所以使用了缓冲区。

    如果不想在关闭时再输出字符流的内容也行,使用Writer的flush()方法就可以了。

    字符流的原理

    Java支持字符流和字节流,字符流本身就是一种特殊的字节流,之所以要专门有字符流,是因为Java中有大量对于字符的操作,所以专门有字符流。

    字节流和字符流的转换是以InputStreamReader和OutputStreamWriter为媒介的,

    InputStreamReader可以将一个字节流中的字节解码成字符,OutputStreamWriter可以将写入的字符编码成字节后写入一个字节流。

    效率

    为了达到最高的效率,避免频繁地进行字符与字节之间的相互转换,最好不要直接使用FileReader和FileWriter这两个类进行读写,

    而使用BufferedWriter包装OutputStreamWriter,使用BufferedReader包装InputStreamReader。

    注意两点:

    1、利用BufferedWriter进行写操作,写入的内容会放在缓冲区内,直到遇到close()、flush()的时候才会将内容一次性写入文件。

    另外注意close()的顺序,一定要先关闭BufferedWriter,再关闭Writer,不可以倒过来,因为BufferedWriter的写操作是通过Writer的write方法写的,

    如果先关闭Writer的话,就无法将缓冲区内的数据写入文件了,会抛出异常。

    2、利用BufferedReader进行读操作,不可以用父类Reader指向它,因为readLine()这个方法是BufferedReader独有的,readLine()的作用是逐行读取文件中的内容。

    参考资料:

    Java IO

    Java IO(一):IO和File

    Java IO(二)——RandomAccessFile

    Java IO(三)——字节流

    Java IO(四)——字符流

    Java IO(五)——字符流进阶及BufferedWriter、BufferedReader

  • 相关阅读:
    2019.6.20刷题统计
    36 线程 队列 守护线程 互斥锁 死锁 可重入锁 信号量
    35 守护进程 互斥锁 IPC 共享内存 的方式 生产者消费者模型
    34 进程 pid ppid 并发与并行,阻塞与非阻塞 join函数 process对象 孤儿进程与僵尸进程
    33 udp 域名 进程
    32 粘包 文件传输
    31 socket客户端. 服务器 异常 语法
    30 网络编程
    29 元类 异常
    26 封装 反射 常用内置函数
  • 原文地址:https://www.cnblogs.com/wangwangfei/p/13225450.html
Copyright © 2011-2022 走看看