IO流的学习

IO流

流的类别
1).按照流向区分:
输入流/输出流
2).按照数据单位区分
a.字节流
b.字符流
3)按照层次区分
a.底层流
b.高级流(缓冲流)

字节流:InputStream/OutputStream

作用: 做文件的复制
子类:
1.FileInputStream©
(1).构造方法:
new FileInputStream(File)
new FileInputStream(“相对路径”)

(2)常用API:
int read() -> 读一个字节
注意:
a.读一个字节= 8位,读的是低8位,其他24位全补0,所以永远是正数
b.读到末尾返回-1
int read(byte[]) -> 读字节数组

2.FileOutputStream©
(1).构造方法:
new FileOutputStream(File)
new FileOutputStream(File,true) ->询问是否在原文件上进行追加内容

new FileOutputStream(“相对路径”)
new FileOutputStream(“相对路径”,true)

(2).常用API:
void write(int i) -> 写入一个字节(写入低8位)

void write(byte[] bs) -> 写一个字节数组

void write(byte[], int off, int len) -> 写入一个字节数组,从字节数组的第几位下标开始,写入长度为多少

缓冲字节流(高级流):

作用: 提高效率
子类/实现类:
1.缓冲字节输入流:BufferedInputStream
1).创建:
new BufferedInputStream(底层流)

2.缓冲字节输出流:BufferedOutputStream
1).创建:
new :BufferedOutputStream(底层流)
2)常用API:
void flush() - 手动刷新缓冲区

字符流:Reader/Writer

作用: 做文件的读写
子类/实现类:
1.字符输入流:InputStreamReader()
(1)创建:
a.InputStreamReader(底层流) - 默认字符集
底层流:可以决定文件是否进行追加
b.InputStreamReader(底层流,字符集) - 指定字符集
字符集:
UFT-8 1字符 = 3字节
GBK 1字符 = 2字节

(2)常用API
int read() - 读取单个字符。
注意: 读到末尾返回-1

2.字符输出流:OutputStreamWriter
(1)创建:
OutputStreamWriter(底层流) - 默认字符集
OutputStreamWriter(底层流,字符集) - 指定字符集

(2)常用API:
void flush() 刷新该流的缓冲。
void write(char[] cbuf, int off, int len) - 写入字符数组的某一部分。
void write(int c) -写入单个字符。
void write(String str, int off, int len) - 写入字符串的某一部分。

缓冲字符流(高级流/包装流):

1.缓冲字符输入流:BufferedReader
1)创建:
BufferedReader(底层字符流)
2)常用API:
String readLine() - 读一整行
主要:注意返回null,标记读到末尾

2.缓冲字符输出流:PrintWriter
1)创建:
PrintWriter(OutputStream out, boolean autoFlush)
作用:
a.OutputStream,字节输出流,可以指定是否进行追加
b.是否刷新缓冲区

PrintWriter(fileName, 字符集) -指定字符集
作用:
a.可以指定字符集

PrintWriter(Writer, boolean autoFlush)
作用:
a.Writer需要使用底层字符流进行构建
底层字符流可以指定字符集
b.底层字符流使用底层字节流进行构建
底层字节流可以指定是否进行追加
c.是否进行自动刷新缓冲区

2)常用API:
void print() - 写出内容,打印不换行
注意: 使用print()结束,必须手动调用刷新缓冲区
pw.flush()
void println() - 写出内容,打印并且换行
注意: 要设置了自动刷新缓冲区,只要遇到println()才会进行自动刷新

对象流:

1.父类:InputStream/OutputStream
2.序列化
1).对象 -> 文件[字节]
2).Serializable - 接口
a.接口中没有常量,也没有抽象方法,是个空接口
b.作用:用于标记是可序列化的
3).关键词:
a.serialVersionUID: 给类添加固定的序列版本号
①.变量必须是long类型修饰
②.必须是public static final修饰
③.序列化后的版本编号,不指定的话,会自动生成一串新的序列号,是随着类的内容改变而改变

b.transient:
①.用于修饰变量,在序列化的时候,值会被忽略
②.使用场景:在传输的过程中,不想别人看到的属性值就是用transient

反序列化
文件[字节] -> 对象

3.子类/实现类:
1).ObjectInputStream
(1)创建:
new ObjectInputStream(底层字节流)
(2)常用API:
Object readObject()

2).ObjectOutputStream
(1)创建
new ObjectOutputStream(底层字节流)
(2)常用API:
void writeObject(Object obj)

RandomAccessFile - 文件的[随机]访问

1.随机:操作文件的位置 -> pointer
1).获取当前指针位置
2).跳过对应的字节数 -> 顺序
3).跳转到指定的指针位置
2.特点:
a.基于文件指针的操作,是一个可读可写的类
b.文件指针停留在哪儿,就可以操作文件的那个位置
c.也可以手动指定文件指针的位置

3.创建:
new RandomAccessFile(“文件路径”,“模式”)
模式:
r - 读
w - 写
rw - 可读可写

4.指针位置的操作:
void skipBytes(跳过字节个数)
long getFilePointer() - 获取当前指针位置
void seek() - 定位到文件指定的位置

5.读写特定字节:
readInt()/readLong()
writeInt()/writeLong()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值