【IO】IO常用方法

1.IS和OS常用方法


InputStream是所有字节输入流的父类,其定义了基础的读取方法,常用的方法如下:
— int read() 读取一个字节,以int形式返回(“低8位”有效),若返回值为-1,则表示EOF
— int read(byte[] d) 尝试读取给指定数组的length个字节并存入该数组,返回值为实际读取到的字节量
OutputStream是所有字节输出流的父类,其定义了基础的写出方法,常用的方法如下:
— void wiret(int d) 写出一个字节,写的是给定的int的“低八位”
— void write(byte[] d) 将给定的字节数组中的所有字节全部写出

2.文件流


创建FOS对象(重写模式)
FileOutputStream是文件的字节输出流,我们使用该流可以以字节为单位将数据写入文件。
— FileOutputStream(File file) 创建一个向指定File对象表示的文件中写出数据的文件输出流
— FileOutputStream(String filename) 创建一个向指定名称的文件中写出数据的文件输出流
需要注意:若指定的文件已经包含内容,那么当使用FOS对其写入数据时,会将该文件中原有数据全部清除。

创建FOS对象(追加模式)
通过上一种的构造方法创建的FOS对文件进行写操作时会覆盖文件中原有数据。若想在文件的原有数据之后追加新数据则需要以下构造方法创建FOS。
— FileOutputStream(File file, boolean append) 创建一个向指定File对象表示的文件中写出数据的文件输出流
— FileOutputStream(String filename, boolean append) 创建一个向指定名称的文件中写出数据的文件输出流
以上两个构造方法中,第二个参数若为true,那么通过该FOS写出的数据都是在文件末尾追加的。

创建FIS对象
FileInputStream是文件的字节输入流,我们使用该流可以以字节为单位从文件中读取数据。
— FileInputStream(File file) 创建一个从指定File对象表示的文件中读取数据的文件输入流
— FileInputStream(String filename) 创建用于读取指定名称为name的文件的文件输入流

单字节
read() 和write(int d) 方法
FileInputStream继承自InputStream,其提供了以字节为单位读取文件数据的方法read。
— int read() 从此输入流中读取一个数据字节,若返回-1则表示EOF(End Of File)
FileOutputStream继承自OutputStream,其提供了以字节为单位向文件写数据的方法write。
— void write(int d) 将指定字节写入此文件输出流,这里只写给定的int值的“低八位”

字节数组
read(byte[] d) 和write(byte[] d) 方法
FileInputStream也支持批量读取字节数据的方法:
— int read(byte[] b) 从此输入流中将最多b.length个字节的数据读入到字节数组b中
FileOutputStream也支持批量写出字节数据的方法:
— void write(byte[] b) 将b.length个字节从b数组写入此文件输出流中
— void write(byte[] b, int offset, int len) 将b数组中从偏移量off开始的len个字节写入此文件输出流

3.缓冲流


BOS基本工作原理
在向硬件设备做写出操作时,增大写出次数无疑会降低写出效率,为此我们可以使用缓冲输出流来一次性批量写出若干数据减少写出次数来提高写出效率。
BufferedOutputStream缓冲输出流内部维护着一个缓冲区,每当我们向该流写数据时,都会先将数据存入缓冲区,当缓冲区已满时,缓冲流会将数据一次性全部写出。

BIS基本工作原理
在读取数据时若以字节为单位读取数据,会导致读取次数过于频繁从而大大的降低读取效率。为此我们可以通过提高一次读取的字节数量减少读写次数来提高读取的效率。
BufferedInputStream是缓冲字节输入流。其内部维护着一个缓冲区(字节数组),使用该流在读取一个字节时,该流会尽可能多的一次性读取若干字节并存入缓冲区,然后逐一的将字节返回,直到缓冲区中的数据被全部读取完毕,会再次读取若干字节从而反复。这样就减少了读取的次数,从而提高了读取效率。
BIS是一个处理流,该流为我们提供了缓冲功能。

4.对象流


对象序列化概念
对象是存在于内存中的。有时候我们需要将对象保存到硬盘上,又有时我们需要将对象传输到另一台计算机上等等这样的操作。这时我们需要将对象转换为一个字节序列,而这个过程就称为对象序列化。相反,我们有这样一个字节序列需要将其转换为对应的对象,这个过程就称为对象的反序列化。

使用OOS实现对象序列化
ObjectOutputStream是用来对对象进行序列化的输出流。其实现对象序列化的方法为:
— void writeObject(Object o) 该方法可以将给定的对象转换为一个字节序列后写出

使用OIS实现对象反序列化
ObjectInputStream是用来对对象进行反序列化的输入流。其实现对象反序列化的方法为:
— Object readObject() 该方法可以从流中读取字节并转换为对应的对象。

Serializable接口:
ObjectOutputStream在对对象进行序列化时有一个要求,就是需要序列化的对象所属的类必须实现Serializable接口。实现该接口不需要重写任何方法。其只是作为可序列化的标志。
通常实现该接口的类需要提供一个常量serialVersionUID,表明该类的版本。若不显式的声明,在对象序列化时也会根据当前类的各个方面计算该类的默认serialVersionUID,但不同平台编译器实现有所不同,所以若想跨平台,都应显式的声明版本号。
如果声明的类的对象序列化存到硬盘上面,之后随着需求的变化更改了类的属性(增加或减少或改名),那么当反序列化时,就会出现InvalidClassException,这样就会造成不兼容的问题。
但当serialVersionUID相同时,它就会将不一样的field以type的预设值反序列化,可避开不兼容问题。

5.字符流


Reader和Writer
Reader是字符输入流的父类;Writer是字符输出流的父类。
字符流是以字符(char)为单位读写数据的。一次处理一个unicode。字符流的底层仍然是基本的字节流。

Reader的常用方法:
— int read() 读取一个字符,返回的int值“低16”位有效
— int read(char[] chs) 读取chs字符数组的length个字符并存入chs数组,返回值为实际读取到的字符量

Writer的常用方法:
— void write(int c) 写出一个字符,写出给定int值“低16位”表示的字符
— void write(char[] chs) 将给定chs数组中所有字符写出
— void write(String str) 将给定str字符串写出
— void write(char[] chs, int offset, int len) 将chs数组中从offset处开始连续的len个字符写出

6.转换流

字符编码 Character Encoding Character Encoding :就是⼀套⾃然语⾔的字符与⼆进制数之间的对应规则。 编码表:⽣活中⽂字和计算机中⼆进制的对应规则

字符集 Charset Charset :也叫编码表。是⼀个系统⽀持的所有字符的集合,包括各国家⽂字、标 点符号、图形符号、数字等。


字符转换流原理:
InputStreamReader字符输入流,使用该流可以设置字符集,并按照指定的字符集从流中按照该编码将字节数据转换为字符并读取。
OutputStreamWriter字符输出流,使用该流可以设置字符集,并按照指定的字符集将字符转换为对应字节后通过该流写出。

7.缓冲流

1.字节缓冲流

BufferedInputStream

public BufferedInputStream(InputStream in) :创建⼀个 新的缓冲输⼊流。

例:// 创建字节缓冲输⼊流

BufferedInputStream bis = new BufferedInputStream(new FileInputStream("bis.txt"));

BufferedOutputStream

public BufferedOutputStream(OutputStream out) :创建⼀个新的缓冲输出流。

例:// 创建字节缓冲输出流

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bos.txt"));

2.字符缓冲流

BufferedReader
BufferedReader是缓冲字符输入流,其内部提供了缓冲区,可以提高读取效率。常用构造方法:
— BufferedReader(Reader reader)
例:
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filename)));

Bufferedwriter
Bufferedwriter是缓冲字符输入流,其内部提供了缓冲区,可以提高读取效率。常用构造方法:
— BufferedWriter(Writer writer)
例:
BufferedWriter bw = new BufferedWriter(new outputStreamWriter(new FileOutputStream(filename)));

字符缓冲流特有⽅法:

BufferedReader: public String readLine() :读⼀⾏⽂字。

BufferedWriter: public void newLine() :写⼀⾏⾏分隔符,由系统属性定义符号。

8. 序列化

序列

       Java 提供了⼀种对象序列化的机制。⽤⼀个字节序列可以表示⼀个对象,该字节序列包含该 对象的数据 、 对象的类型 和 对象中存储的属性 等信息。字节序列写出到⽂件之后,相当于⽂件中持久 保存了⼀个对象的信息。 反之,该字节序列还可以从⽂件中读取回来,重构对象,对它进⾏反序列化。 对象的数据 、对象的类型和对象中存储的数据信息,都可以⽤来在内存中创建对象。

ObjectOutputStream类

构造⽅法

public ObjectOutputStream(OutputStream out) :创建⼀个指定OutputStream的 ObjectOutputStream。

java.io.ObjectOutputStream 类,将Java对象的原始数据类型写出到⽂件,实现对象的持久存储。

序列化操作

⼀个对象要想序列化,必须满⾜两个条件:

该类必须实现 java.io.Serializable 接⼝, Serializable 是⼀个标记接⼝,不实现此接⼝ 的类将不会使任何状态序列化或反序列化,会抛出 NotSerializableException 。

该类的所有属性必须是可序列化的。如果有⼀个属性不需要可序列化的,则该属性必须注明是瞬态的,使⽤ transient 关键字修饰。

ObjectInputStream类

构造⽅法:

public ObjectInputStream(InputStream in) :创建⼀个指定InputStream的 ObjectInputStream。

ObjectInputStream反序列化流,将之前使⽤ObjectOutputStream序列化的原始数据恢复为对象。

对于JVM可以反序列化对象,它必须是能够找到class⽂件的类。如果找不到该类的class⽂件, 则抛出⼀个 ClassNotFoundException 异常。

另外,当JVM反序列化对象时,能找到class⽂件,但是class⽂件在序列化对象之后发⽣了修 改,那么反序列化操作也会失败,抛出⼀个InvalidClassException 异常。发⽣这个异常的 原因如下:

该类的序列版本号与从流中读取的类描述符的版本号不匹配

该类包含未知数据类型

该类没有可访问的⽆参数构造⽅法

Serializable 接⼝给需要序列化的类,提供了⼀个序列版本号。 serialVersionUID 该版本号的 ⽬的在于验证序列化的对象和对应类是否版本匹配。

9.打印流

平时我们在控制台打印输出,是调⽤ print ⽅法和 println ⽅法完成的,这两个⽅法都来⾃于 java.io.PrintStream 类,该类能够⽅便地打印各种数据类型的值,是⼀种便捷的输出⽅式。

PrintStream类

构造⽅法

public PrintStream(String fileName) :使⽤指定的⽂件名创建⼀个新的打印流。

PrintStream ps = new PrintStream("ps.txt");

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值