Java I/O原理
- 数据源(Data Source)/数据宿(Data Sink)
- I/O流(Stream)分类:
- 输入流(Input Stream)/输出流(Output Stream)
- 输入流:InputStream
特例:java.io.RandomAccessFile类
- 输入流:InputStream
- 节点流(Node Stream)/处理流(Processing Stream)
- 节点流:FileReader
- 处理流:BufferedReader
- 字符流(Character Stream)/字节流(Byte Stream)
- InputStream/OutputStream结尾:字节流
- Reader/Writer:字符流
- 输入流(Input Stream)/输出流(Output Stream)
InputStream
方法 | 说明 |
---|---|
int read() | 返回int,低8位有效,高八位为0 |
int read(byte[] buffer) | |
int read(byte[] buffer, int offset, int length) | 返回实际读取长度 |
void close() | |
int available() | 后面还有多少字节可读取 |
skip(long n) | |
boolean markSupported() | 测试是否支持mark和reset方法 |
void mark(int readlimit)) | |
void reset() | 重新定位到最后一次调用mark方法的位置 |
OutputStream
方法 | 说明 |
---|---|
void write(int c) | 写1个字节,入参的低8位数据 |
void write(byte[] buffer) | |
void write(byte[] buffer,int offset,int length | |
void close() | |
void flush() | 刷新此输出流并强制写出所有缓冲的输出字节 |
Reader
方法 | 说明 |
---|---|
int read() | 处理的是字符,低16为有效 |
int read(char[] cbuf) | |
int read(char[] cbuf, int offset, int length) | |
void close() | |
boolean ready() | |
long skip(long n) | |
boolean markSupported() | |
void mark(int readAheadLimit) | |
void reset() |
Writer
方法 | 说明 |
---|---|
void write(int c) | 写1个字符,入参的低16位数据 |
void write(byte[] cbuf) | |
void write(byte[] cbuf,int offset,int length | |
void write(String string) | |
void write(String string, int offset, int length) | |
void close() | |
void flush() | 刷新此输出流并强制写出所有缓冲的输出字节 |
常用I/O流类型
FileInputStream/FileOutputStream
- 字节
FileReader/FileWriter
- 字符
BufferedReader/BufferedWriter‘
- 缓冲区
写操作 - 换行:BufferedWriter.newLine()
- 缓冲区
InputStreamReader/OutputStreamWriter
- 字节转换为字符,是FileReader/FileWriter的父类
PrintStream
- OutputStream基础上增强,输出各种类型数据(不仅限于byte类型)
- 典型:System.out.println()方法
- 从不抛出IOException,内部已捕获
PrintWriter
- PrintStream基础上增强
- 从不抛出IOException,内部已捕获
- 与PrintStream区别:作为处理流使用时,PrintStream只能封装OutputStream类型的字节流;而PrintWriter既可以封装OutputStream的字节流,还能够封装Writer的字符流
DataInputStream/DataOutputStream
- 实现了DataInput/DataOutput接口,用于平台无关
DataInputStream:
方法 说明 DataInputStream(InputStream in) boolean readBoolean() byte readByte() char readChar() double readDouble() float readFloat() int readInt() long readLong() short readShort() String readUTF() 读入utf-8编码的字符串 DataOutputStream
方法 说明 … … int writeInt() … … String writeUTF() 写入utf-8编码的字符串
CharArrayReader
CharArrayWriter
I/O应用专题
标准I/O重定向
标准输入重定向:
System.setIn()
FileInputStream fis = new FileInputStream("src.txt"); System.setIn(fis);
标准输出重定向:
System.setOut()
- 标准错误输出重定向:
System.setErr()
属性信息导入/导出
- 属性导出:
Properties.store()
Properties.list()
Properties ps = new Properties();
ps.setProperty("name", "rayluoluo");
ps.setProperty("password", "123456");
FileWriter fw;
try {
fw = new FileWriter("TestProperties.txt");
ps.store(fw, "LogInfo");
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
- 属性导入:
Properties.load()
随机存取文件
特定位置读取文件数据
创建文件:File.createNewFile()
- java.io.RandomAccessFile
获取文件指针:getFilePointer()
跳过字节数:skipBytes(int i)
临时文件
File.createTempFile(String prefix, String suffix, File directory)
File.delete()
File.deleteOnExit()
File.getAbsoluteFile()
对象序列化
对象持久性(Oject Persistance)
- 长久保存一个对象的状态,并在需要时获取该对象的信息,以重新构造一个状态完全相同的对象
对象序列化(ObjectSerialization)
- 通过写出对象的状态数据来记录一个对象
对象序列化的主要任务
- 写出对象的状态信息,并遍历该对象对其他对象的引用,递归的序列化所有被引用到的其他对象,从而建立一个完整的序列化流
两个接口:
- java.io.Serializable
- java.io.Externalizable
两个类:
- java.io.ObjectOutputStream:序列化
- java.io.ObjectInputStream:反序列化
Serializable/Externalizable
- 以对象为单位进行IO操作
- 要实现序列化操作,必须实现Serializable或Externalizable接口其中之一,否则将报出
NotSerializableException
异常
java.io.DataOutput | ObjectOutput | ObjectOutputStream |
java.io.OutputStream | ||
ObjectStreamConstants | ||
java.io.DataInput | ObjectInput | ObjectInputStream |
java.io.InputStream | ||
ObjectStreamConstants | ||
java.io.Serializable | ←java.io.Externalizable |
数据保护
- 对象序列化过程中的数据保护
- 标记性接口Serializable
- 避免类在对象序列化后被破解,敏感信息泄露
- 对象序列化过程中,类的
static
属性和方法,不会被序列化处理。
因此,在反序列化时,static
属性和方法要看类定义 - 个别不希望被序列化的非static属性,可以声明
transient
进行标明,如敏感信息
因此,在反序列化时,transient
变量被设为初始值
NIO(待补充)
New I/O,Non-blocking IO,JDK 1.4引入,高速、面向non-blocking IO**块的IO操作,能对数据进行打包传输,直接调用了操作系统的块式IO功能,不完全由java实现**
NIO基础
- 缓存区(Buffer)
- 一定数据规模后传输
- 通道(Channel)
- 双向
- 字符集(Charset)
- 字节和unicode转换,编码器CharsetEncode、解码器CharsetDecode
- 缓存区(Buffer)
高级NIO技术
- 子缓冲区和数据共享
- 只读缓冲区
- 内存映射文件
- 文件锁定
- 独占锁定、共享锁定