Java学习14 高级I/O编程

Java I/O原理

  • 数据源(Data Source)/数据宿(Data Sink)
  • I/O流(Stream)分类:
    • 输入流(Input Stream)/输出流(Output Stream)
      • 输入流:InputStream
        特例:java.io.RandomAccessFile类
    • 节点流(Node Stream)/处理流(Processing Stream)
      • 节点流:FileReader
      • 处理流:BufferedReader
    • 字符流(Character Stream)/字节流(Byte Stream)
      • InputStream/OutputStream结尾:字节流
      • Reader/Writer:字符流

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.DataOutputObjectOutputObjectOutputStream
java.io.OutputStream
ObjectStreamConstants
java.io.DataInputObjectInputObjectInputStream
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
  • 高级NIO技术

    • 子缓冲区和数据共享
    • 只读缓冲区
    • 内存映射文件
    • 文件锁定
      • 独占锁定、共享锁定
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值