java编程自学记录(day17)

I/O流:可以类比管道,流动的是字节。
FileInputStream和FileOutputStream是低级流,数据源是明确的。


缓冲字节输入输出流BIS/BOS
 1)BufferedInputStream:缓冲字节输入流
 2)BufferedOutputStream:缓冲字节输出流
 3)他们内部维护者一个缓冲区,可以提高读写效率。是基于低级流的高级流。
 4)缓冲字节输入输出流是高级流,不能独立存在,必须依靠于低级流。
BufferedInputStream
 1)创建时需要传入一个流对象,Buffered流实际上就是基于传入的流进行性能优化或功能拓展。
 2)在读取文件时,BufferedInputStream是一次性读取一块数据缓存在内存中,在调用时它就从自己的缓存区中给出数据。
BufferedInputStream和FileinputStreram的区别
 BufferedInputStream是一次性读取一块数据缓存在内存中,在调用时它就从自己的缓存区中给出数据。
 FileInputStream是每次从磁盘上读取一个字节数据到内存,调用它时它只能提供这个字节
 因此在程序中调用单字节读取方法时,BufferedInputStream就是从缓存区中给出数据,明显快于FileInputStream
BufferedOutputStream和BufferedInputStream实现机制类似,此处不再赘述。

数据输入输出流DIS/DOS
 1)DataInputStream:可以直接读取基本类型数据的流
 2)DataOutputStream:可以直接写基本数据的流
  他们简化了对基本数据类型的读写操作。
 3)是高级流,构造时需要传入一个流,可以嵌套流
DataInputStream
 常用方法:
 int readInt(); double readDouble(); long readLong(); ...
 String readUTF();
DataOutputStream
 常用方法:
 writeInt(int i); writeLong(long l); writeUTF(String str);


字符流:
 以字符为单位读写数据,一次出一个字符(unicode),即一个char。可以以指定字符编码集进行写。
 字符流底层还是基于字节流形式读写的。
 所有的字符流都是高级流。
InputStreamReader:字符输入流
 1)构造方法
  InputStreamReader(InputStream in)  以系统的编码集进行输入
  InputStreamReader(InputStream in,
                         String charsetName) 以指定的编码集进行输入
 2)读只能一个一个字符地读取。
OutputStreamWriter:字符输出流,先将字符按照编码集转换成字节,再写入文件
 1)构造方法:
  OutputStreamWriter(OutputStream out) 以系统的编码集进行输出
  OutputStreamWriter(OutputStream out,
                          String charsetName) 以指定的编码集进行输出
 2)可以一次写入一个字符串,这是与该流的读取流不一样的。


缓冲字符输入流和缓冲字符输出流:以行或字符串为单位读写数据
BufferedReader:缓冲字符输入流
 1)构造方法:
  要求传入构造方法的是一个字符流,不能是字节流
 2)reader可以使用readLine()方法读取一行数据。
BufferedWriter:缓冲字符输出流,可以将一个字符串转换成一个一个字符,但是不能转换为字节
 1)构造方法
  要求传入构造方法的是一个字符流,而不能是字节流。
 2)要求按照指定的编码集进行读写时,应该在创建字符流时指定编码集,因为编码是在字符转换成字节时进行的。
 3)Writer可以写入一个字符串,也可以通过writeLine()方法写字符
 对于readLine(),若返回数据为null,则标明已经读到了文件末尾。若某行内容为空,读取回来的字符串是不为空的,但是
 字符串长度为0.

文本文件输入输出流:用于读写文本文件的字符输入流和输出流。读取单位也是字符
FileReader
 1)构造方法
  类似FileWriter
 2)FileReader的效果等效于 FileInputStream+InputStreaReader
  因此,也不支持一次读一个字符串,只能一次读取一个字符
FileWriter
 1)构造方法
  FileWriter(File file)
  FileWriter(String filepath)
  这两个够构造方法的参数跟FileOutputStream的参数意义是一样的。可以直接套在文件上。
 2)FileWriter的效果等效于 FileOutputStream+OutputStreamReader

字符输出流(没有输入,只有输出)
PrintWriter
 可以理解为另一种缓冲字符输出流,其内部也维护了一个缓冲区
 应用场景:servlet(运行在服务器端的小程序)。给客户端发送相应使用的输出流就是PrintWriter
 1)构造方法:
  PrintWriter(File file): 以行为单位向文件写数据
  PrintWriter(OutputStream out):以行为单位向字节输出流写数据
  PrintWriter(Writer writer):以行为单位向字符输出流写数据
  PrintWriter(String fileName):以行为单位向指定路径的文件写数据
 2)写方法:
  PrintWriter有非常丰富的写方法,但是其写方法是print开头的。

其他方面的知识:
 1)try-catch执行时,catch语句块中的throw关键字执行之后就会退出try语句,因此在throw后面的内容就不会执行。
 2)辨别高级流的简单方法:
  看构造方法,若构造方法要求传入另一个流,那么这个流就是高级流。
 3)ctrl+shift+O:自动导包,自动将多余的包删除
 4)高级流可以嵌套使用,但是最终还是会包含一个低级流。
 5)所有的输出流在使用完毕之后都要调用flush()方法。flush的作用是将缓冲区中未写出的数据一次性写出。
 为什么呢?
  输出流在调用写方法时,缓冲区不一定会去执行从内存到磁盘的写操作,输出流的工作机制是,当缓冲区数据写满之后会自动
 传到磁盘,但是当写到最后几个数据时,缓冲区没满但是写操作已经结束,缓冲区不会自动将尚未满的数据写入磁盘,此时需要我们
 手动调flush()方法,将最后没有装满的缓冲区的数据全都写入磁盘,否则最后的几个字节就会消失。
 6)在使用高级流时,使用完毕后我们只需要关闭最外层的高级流,高级流中包含的流会自动关闭。第三方的流除外。
 7)这里注意一点,不能自己写一个文件然后调用DataOutputStream的readUTF方法,因为我们自己写的文件的编码方式可能
 跟writeUTF方法写的格式不一致,会导致出错。
 8)流关闭之后,不能再通过被关闭的流读写数据
 9)流的读取,一般都只能按照流的最小单位来读取,比如FileInputStream只能支持字节读取,InputStreamReader只能
 支持字符读取,BufferedReader可以支持字符串读取
 10)文本文件的特殊性:
  文本文件的基础单位是字符,而一般文件的基础单位为字节,比如txt文件是以字符为单位的,但是.zip文件是以字节为单位
 的
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值