IO流

IO流

流是一个抽象的概念,在java中,数据的输入输出操作都是以流的方式进行。流具有方向性,如果数据的流向是程序至设备,我们称为输出流,如果是设备至程序,我们称为输入流。

流的分类

1.按照流的方向分为输入流和输出流

2.按照处理数据的不同分为字节流和字符流,字节流读取的最小单位是一个字节,而字符流一次可以读取一个字符

3.按照功能的不同可以分为节点流和处理流
节点流是可以直接从一个数据源中读写数据的流,处理流是对节点流进行封装的一种流,封装后可以增加节点流的功能

4.不管流的种类有多么丰富,其根源都是四个基本的父类
字节输入流:InputStream
字节输出流:OutputStream
字符输入流:Reader
字符输出流:Writer

字节中的常用节点流

InputStream
常用方法:
public abstract int read();//从输入流中读取数据的下一个字节,如果到达流的末尾返回-1。
public int read(byte[] b){..}//把读到的字节存到字节数组中,返回本次读到的字节数
public int read(byte[] b,int off,int len){..}//把读到的字节存到字节数组b中,同时指定开始存的位置以及最大字节数,并返回本次读到了多少个字节
public long skip(long n){..}//跳过此输入流中数据的 n 个字节
public void close(){..}//关闭此输入流并释放与该流关联的所有系统资源
public boolean markSupported(){..}//测试此输入流是否支持 mark 和 reset 方法
public void mark(int readlimit){..}//在此输入流中标记当前的位置
public void reset(){..}//将此流重新定位到最后一次对此输入流调用mark方法时的位置

OutputStream
public abstract void write(int b);//将指定的字节写入此输出流
public void write(byte[] b){..}//将字节数组b中的所有字节写入此输出流
public void write(byte[] b,int off,int len){..}//将字节数组b中的字节写入此输出流,指定开始位置及最大字节数
public void flush(){..}//刷新此输出流并强制写出所有缓冲的输出字节
public void close(){..}//关闭此输出流并释放与此流有关的所有系统资源

InputStream的子类和OutputStream的子类几乎都是成对出现的,一个负责读数据的工作,一个负责写数据的工作

ByteArrayInputStream和ByteArrayOutputStream
ByteArrayInputStream可以从数组中读取字节
ByteArrayOutputStream可以把字节写到对象中的缓冲区里面,其实就是一个字节数组

FileInputStream和FileOutputStream
FileInputStream可以读取文件中的字节
FileOutputStream可以向文件中写进去字节

ObjectInputStream和ObjectOutputStream
在序列化中要使用的对象输入流和对象输出流

字节流中的常用处理流

处理流也可以称为是功能流或者包装流,因为它是对节点流进行包装的一种流,包装后增加了功能,但是处理流本身并不能读写数据。
1)BufferedInputStream和BufferedOutputStream
可以给字节流中的节点流提供代码缓冲区的输入/输出流
2)DataInputStream和DataOutputStream
可以给字节流中的节点流提供输入/输出java中不同类型的数据
3)PrintStream
PrintStream为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式

BufferedInputStream Bis = new BufferedInputStream(new FileInputStream("C:\\Users\\Administrator\\Desktop\\java\\corejava.txt"));
		BufferedOutputStream Bos = new BufferedOutputStream(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\corejava.txt")); 
		while((t=Bis.read())!=-1) {
			Bos.write(Bis.read());
		}
		Bos.flush();

这是使用包装流进行文件读写的部分代码,使用完流之后一定要close。

字符流

Reader常用方法

public int read(){..}
public int read(char[] cbuf){..}
public abstract int read(char[] cbuf, int off,int len){..}
public int read(CharBuffer target){..}
abstract public void close();
public long skip(long n){..}
public boolean markSupported(){..}
public void mark(int readAheadLimit){..}
public void reset(){..}
public boolean ready(){..}

Writer

public void write(int c){..}
public void write(char cbuf[]){..}
abstract public void write(char cbuf[], int off, int len);
public void write(String str){..}
public void write(String str, int off, int len){..}
abstract public void flush();
abstract public void close();
public Writer append(char c){..}
public Writer append(CharSequence csq){..}
public Writer append(CharSequence csq, int start, int end){..}

CharArrayReader和CharArrayWriter
CharArrayReader可以读取字符数组中的内容
CharArrayWriter可以向字符数组中写内容

FileReader和FileWriter
FileReader读取文件内容的便捷类,InputStreamReader的子类
FileWriter写入文件内容的便捷类,OutputStreamWriter的子类

PipedReader和PipedWriter
PipedReader管道字符输入流
PipedWriter管道字符输出流

BufferedReader和BufferedWriter
这个俩个流属于处理流/包装流,它们本身并不能读取数据,它们的作用是包装在其他节点流上面,为其提供额外的功能

PrintWriter
一般会把BufferedReader和PrintWriter配合在一起使用,因为BufferedReader可以一次读一行字符串,而PrintWriter可以一次写一行字符串(自动换行)。

转换流

InputStreamReader和OutputStreamWriter是一对名字中既有Stream,又有Reader或Writer的流,因为它们是转换流,负责把一个字节流转换为字符流。所以它们是字节流和字符串之间的桥梁.
注:在把字节流转换为字符流的过程中,还可以指定字符编码,避免乱码的出现。

对象流

序列化和反序列化
java中的序列化是把java对象转换称为字节序列的过程
反序列化是把字节序列恢复成Java对象的过程

如何实现序列化和反序列化
使用对象流即可实现对象的序列化和反序列化
ObjectOutputStream类中的方法可以完成对象的序列化:
public final void writeObject(Object obj){..}
ObjectInputStream类中的方法可以完成对象的反序列化:
public final Object readObject(){..}
注:这俩个对象流都属于字节流

序列化的要求
只有实现了java.io.Serializable接口的类的对象才可以被序列化,否则序列化时会报错

transient关键字
在对象序列化的时候,被transient修饰的属性的值,在序列化过程中是会被忽略掉的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值