IO流小结

Io流

Io流按操作数据可以分为字节流和字符流,按数据传输对象分为输入流和输出流。

字节流

Io流中的输入输出都是相对于程序而言。字节流有两个顶级父类(抽象类),inputstream和outputstream。

字节流读写文件

从文件中读取数据并将数据写入文件即文件的读写。

Jdk提供了两个类,FileInputStream和FileOutputStream。

FileinputStream是InputStream的子类,它是操作文件的字节输入流,用于读取文件中的数据。因为硬盘上的文件是以字节形式存在的,所以读取操作显示的是字节。

FileOutputStream是OutputStream的子类,它是操作文件的字节输出流,用于把数据写入文件。

若希望在已存在的文件中追加内容,可以使用FileOutputStream的构造函数FileOutputStream(String fileName,boolean append)来创建文件输出流对象,把append参数设置为true。

Io流在进行数据读写操作时易发生异常,在程序中用throws关键字抛出。一旦遇到io异常,io流的close()方法无法得到执行,流对象占用的系统资源无法得到释放,所以把io流的close()方法放在finally代码块中,确保close()方法的执行。

文件拷贝

实现文件拷贝可以通过while循环将字节逐个进行拷贝。每循环一次就通过FileInputStream的read()方法读取一个字节,并通过FileOutputStream的write()方法将该字节写入指定文件,直到文件末尾。

单个字节读取文件效率低下,可以定义一个字节数组作为缓冲区,一次性读取多字节数据。

(程序中的缓冲区就是一块内存,用于存放暂时输入输出的数据,使用缓冲区可以减少对文件操作次数,提高读写数据的效率。)

字节缓冲流

在Io包中提供了两个带缓冲的字节流,分别是BufferedInputStream和BufferedOutputStream,这两个流都使用了装饰设计模式。它们的构造方法中分别接收InputStream和OutputStream类型的参数作为被包装对象,在读写数据时提供缓冲功能。

字符流

字符流也有两个抽象的顶级父类,Reader和Writer。Reader是字符输入流,用于从源设备读取字符,Writer是字符输出流,用于向某个目标设备写入字符。

字符流操作文件

从文件中直接读取字符便可以使用字符输入流FileReader,通过此流可以从关联的文件中读取一个或一组字符。

(注意:字符输入流的read()方法返回的是int类型的值,如果想获得字符就要进行强制类型转换。)

FileWriter是Writer的子类,同FileOutputStream一样,如果指定的文件不存在,就会先创建文件,如果指定的文件存在,会首先清空文件中的 内容,再进行写入。

包装流可以对一个已经存在的流进行包装来实现数据读写功能。字符流提供了带缓冲区的包装流,BufferedReader和BufferedWriter,其中BufferedReader用于对字符输入流进行包装,BufferedWriter用于对输出流进行包装。

(BufferReader中有一个方法readLine(),用于一次读取一行文本。)

(包装流内部使用了缓冲区,再循环使用BufferedWriter的writer()方法是,这些字符会首先被写入缓冲区,当缓冲区满或调用close()方法时,缓冲区的字符才会被写入目标文件。在循环结束时如果没有调用close()方法,可能会导致部分存在缓冲区的数据没有被写入目标文件。)

转换流

转换流也是一种包装流,当字节流和字符流间转换的时候,提供了两个类InputStreamReader和OutputStreamWriter.

OutputStream时Writer的子类,它可以将一个字节输出流包装成字符输出流,而InputStreamReader是Reader的子类,它可以将一个字节输入流包装成字符输入流,方便读取字符。

(使用转换流时,操作对象只能是文本,如果字节流操作的是图片,转换为字符流会造成数据丢失)

对象序列化

程序运行时会在内存中创建多个对象,然而程序结束后,这些对象就会被当做垃圾回收。如果希望永久保存这些对象,可以将对象转换为字节数据写入到硬盘上,这个过程称为对象序列化。当对象序列化时,必须保证实现Serializable接口。

PrintStream

Writer()方法写数据时,只能输出字节或字符类型的数据,如果输出int类型或者对象类型的数据,要将数据先转化为字符串再输出。Io中提供了一个PrintStream类,它提供了一系列用于打印数据的print()和println()方法,被称为打印流。它可以将基本类型或者是引用类型的数据对象格式化为字符串后再输出。

System类中定义了三个常量:in、out、err。In为InputStream类型,用于读取键盘输入;out为PrintStream类型,用于将数据输出到命令行窗口;err也是PrintStream类型,也是将数据输出到命令行窗口,err通常输出的是应用程序运行的错误信息。

PipedInputStream和PipedOutputStream

多线程之间也可以使用IO流实现数据传输,jdk提供了管道流PipedInputStream(向管道写入数据)和PipedOutputStream(从管道中读取写入的数据),必须建立连接才能彼此通信。

ByteArrayInputStream和ByteArrayOutputStream

有时我们不希望文件直接存储到硬盘,把文件临时存储到缓冲区,方便读取。Jdk提供了ByteArrayInputStream和ByteArrayOutputStream。

ByteArrayOutputStream类会在创建对象时就创建一个byte型数组的缓冲区,当向数组中写数据时,该对象会把所有的数据写入缓冲区,最后一次性写入文件

之前在读取数据时,通常会定义一个1024字节的数组,但是如果文件太大,数组不能一次性读完,需要多次向文件中写入数据,效率低下。用ByteArrayOutputStream创建一个缓冲区,该缓冲区会根据存入数据多少而变化,因此可以减少写数据的次数,提高效率。如果读取的文件很大,就不行了,会造成内存溢出。

RandomAccessFile

Io流只能按照数据顺序读取、写入数据。RandomAccessFile不属于流,但具有读写文件的功能,可以随机从文件的位置执行读写数据的操作,还可以将文件以只读或读写的方式打开。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值