一、二进制
I/O
- 文件输入输出类:文本I/O类和二进制I/O类
- 抽象类InputStream:是读取二进制数据的根类
- 方法:
read()
|
从输入流中读取下一个字节数据
|
read(byte[] b)
|
从输入流中读取
b.length
个字节到数组
b
中
|
read(byte[] b,int off,int len)
|
从输入流读取字节并且将它们保存在
b[off],b[off+1],…,b[off+len-1]
中
|
available()
|
返回可从输入流中读取的字节数的估计值
|
close()
|
关闭输入流
|
skip(long n)
|
从输入流中跳过并且丢弃
n
字节的数据
|
markSupported()
|
测试该输入流是否支持
mark
和
reset
方法
|
mark(int readlimit)
|
在该输入流中标记当前位置
|
reset()
|
将该流重新定位到最后一次调用
mark
方法的位置
|
- 抽象类OutputStream:是写入二进制数据的根类
- 方法
write(int b)
|
将指定字节写入到该输出流中
|
write(byte[] b)
|
将数组
b
中的所有字节写入到输出流中
|
write(byte[] b,int off,int len)
|
将
b[off],b[off+1],…,b[off+len-1]
写入到输出流中
|
close()
|
关闭输出流
|
flush()
|
清掉输出流,强制写出任何缓冲的输出字节
|
- FileInputStream类
- 方法:
FileInputStream(File file)
|
从一个
File
对象创建一个
FileInputStream
|
FileInputStream(String filename)
|
从一个文件名创建一个
FileInputStream
|
- 从文件读取字节
- 若为一个不存在的文件创建FileInputStream对象,将发生java.io.FileNotFoundException异常
- FileOutputStream类
- 文件不存在,则创建文件
- 方法:
FileOutputStream(File file)
|
从一个
File
对象构建一个
FileOutputStream
|
FileOutputStream(String filename)
|
从一个文件名创建一个
FileOutputStream
|
FileOutputStream(File file,boolean append)
|
如果
append
为
true
,数据将追加到已经存在的文件中
|
FileOutputStream(String filename,boolean append
|
如果
append
为
true
,数据将追加到已经存在的文件中
|
- InputStream和OutputStream实现了AutoClosable接口。AutoClosable接口定义了close()方法,所以任何AutoClosable类型的对象都可以用于try-with-resources(JDK1.8)
- FileInputStream类的实例可以作为参数去构造一个Scanner对象,而FileOutputStream类的实例可以作为参数去构造一个PrinterWriter对象
- Scanner c=new Scanner(fileInputStream);
- 过滤器数据流是为某种目的过滤字节的数据流;FilterInputStream类和FilterOutputStream类是过滤数据的基类。
- DataInputStream类
- 从数据流读取字节,并且将它们转换为合适的基本类型值或字符串
- DataOutputStream类继承FilterInputStream类,并实现DataInput接口
- DataInputStream接口的方法:
readBoolean()
|
从输入流中读取一个
boolean
值
|
readByte()
|
从输入流中读取一个
byte
值
|
readChar()
|
从输入流中读取一个字符
|
readFloat()
|
从输入流中读取一个
float
值
|
readDouble()
|
从输入流中读取一个
double
值
|
readInt()
|
从输入流中读取一个
int
值
|
readLong()
|
从输入流中读取一个
long
值
|
readShort()
|
从输入流中读取一个
short
值
|
readLine()
|
从输入流中读取一行字符
|
readUTF()
|
以
UTF
格式读取一个字符串
|
- DataOutputStream类
- 将基本类型的值获字符串转换为字节,并且将字节输出到数据流
- DataOutputStream类继承FilterOutputStream类,并实现DataOutput接口
- DataOutput接口的方法:
writeBoolean(boolean b)
|
向输出流中写入
boolean
值
|
writeByte(int v)
|
向输出流中写参数
v
的
8
位低位比特
|
writeBytes(String s)
|
向输出流中写一个字符串中字符的低位字节
|
writeChar(char c)
|
向输出流中写一个字符(由两个字节组成)
|
writeChars(String s)
|
向输出流中依次写一个字符串
s
中的每个字符,每个字符
2
个字节
|
writeFloat(float v)
|
向输出流中写入
float
值
|
writeDouble(double v)
|
向输出流中写入
double
值
|
writeInt(Int v)
|
向输出流中写入
int
值
|
writeLong(long v)
|
向输出流中写入
long
值
|
writeShort(short v)
|
向输出流中写入
short
值
|
writeUTF(String s)
|
以
UTF
格式写一个字符串
s
|
- 二进制I/O中的字符与字符串
- 一个统一码由两个字节构成
- UTF-8字符之前的两个字节用来存储表明字符串中字符个数的信息
- 如果一个长字符串的大多数字符都是普通的ASCII字符,采用UTF-8格式存储更高效
- DataInputStream类和DataOutputStream类以同机器平台无关的方式读写Java基本类型值和字符串
- 如果到达InputStream的末尾之后还继续从中读取数据,就会发生EOFException异常;该异常可用来检查是否到达文件末尾
- 使用BufferedInputStream类和BufferedOutputStream类可通过减少磁盘读写次数来提高输入和输出速度。
- BufferedInputStream类:磁盘上的整块数据一次性地读入到内存中的缓冲区,然后从缓冲区将个别的数据传递到程序
- BufferedOutputStream类:个别的数据首先写入到内存中的缓冲区,当缓冲区已满时,一次性写入磁盘
二、对象
I/O
- ObjectInputStream类和ObjectOutputStream类可以用于读/写可序列化的对象;即处理可实现基本数据类型与字符串的输入和输出外,还可实现对象的输入和输出
- 可序列化的对象:可有格式地写入输入流的对象
- Serializable接口
- 可序列化的对象的类必须实现java.io.Serializable接口
- Java提供一个内在机制自动完成写对象的过程,该过程称为对象序列化;它是在ObjectOutputStream中实现的
- 对象反序列化:读取对象的过程;它是在ObjectInputStream类中实现的
- 当储存一个一个可序列化对象时,会对该对象的类进行编码。编码包括类名、类的签名、对象实例的值以及该对象引用的任何其他对象的闭包,但不存储对象的静态变量
- 当对象是Serializable的实例,但包含了非序列化的实例数据域;要使其可序列化,需给这些数据域加上关键字transient,告诉Java虚拟机将对象写入对象流时忽略这些数据域。
- 对象写入时,会为它创建一个序列号,以后写入它时,只存储序列号
- 可序列化数组:所有元素都是可序列化的
三、随机访问文件
- RandomAccessFile类:允许从文件的任何位置进行数据的读写
- 方法:
RandomAccessFile(File file,String mode)
|
使用指定的
File
对象和模式创建
RandomAccessFile
流
|
RandomAccessFile(String name,String mode)
|
使用指定的文件名和模式创建
RandomAccessFile
流
|
close()
|
关闭流
|
getFilePointer()
|
返回以字节计算的从文件开始的偏移量,下一个
read
或
write
从该位置开始
|
length()
|
文件的字节数
|
read()
|
从文件中读取一个字节数据
|
read(byte[] b)
|
从该文件中读取
b.length
个字节数据到一个字节数组
|
read(byte[] b,int off,int len)
|
从该文件中读取
len
个字节数据到一个字节数组
|
seek(long pos)
|
设置从流开始位置计算的偏移量
(pos
个字节
)
,下一个
read
或
write
从该位置开始
|
setLength(long newLength)
|
为该文件设置一个新长度
|
skipBytes(int n)
|
跳过
n
个字节的输入
|
write(byte[] b)
|
从指定的字节数组中写
b.length
个字节到该文件中
|
write(byte[] b,int off,int len)
|
从偏移量
off
开始,从指定的字节数组中写
len
个字节到该文件中
|
- 当创建一个RandomAccessFile时,可以指定两种模式("r”或”rw”)
- 不存在,则创建文件
- 顺序流:只读或只写的流
- 顺序访问文件:使用顺序流打开的文件
- 随机访问文件:使用RandomAccessFile类打开的文件