高效流介绍和使用

高效流

1.1序列流(也称合并流)

可以将多个输入流合并为一个流进行统一读取

构造方法

SequenceInputStream(InputStream s1,InputStream s2)把流s1和流s2合并成一个输入流对象。(只能合并两个流)

SequenceInputStream s1 = new SequenceInputStream(fis1, fis2);
int len = 0;
byte[] byt = new byte[1024];
FileOutputStream fos = new FileOutputStream("c:\\z.txt");
while ((len = s1.read(byt)) != -1) {
	fos.write(byt, 0, len);

合并多个流

  1. 用Enumeration,可以当成一个容器,装多个输入流
  2. 把多个流与Enumeration()整合起来,把流放到集合中(看需求,读取地址重复用List集合,不重复用Set集合 )
  3. 迭代器实现原理是判断里面是否有元素,有就往外取。与Enumeration()一样。
  4. 使用next()获得序列中的下一个元素。
  5. 使用hasNext()检查序列中是否还有元素。
FileInputStream is1 = new FileInputStream("d:/aaa.txt");
FileInputStream is2 = new FileInputStream("d:/bbb.txt");
FileInputStream is3 = new FileInputStream("d:/ccc.txt");

HashSet<InputStream> set = new HashSet<>();
set.add(is1);
set.add(is2);
set.add(is3);
Iterator<InputStream> it = set.iterator();
SequenceInputStream sq = new SequenceInputStream(new Enumeration<InputStream>() {

    @Override
    public boolean hasMoreElements() {
        // TODO Auto-generated method stub
        //用Enumeration操作迭代器
        return it.hasNext();
    }

    @Override
    public InputStream nextElement() {
        // TODO Auto-generated method stub
        return it.next();
    }
});

FileOutputStream os = new FileOutputStream("e:/bbb.txt");

int len = 0;
byte[] b = new byte[1024];
while((len=sq.read(b))!=-1) {
    os.write(b, 0, len);
}
1.2数据流
  • 数据流支持二进制的IO–基本数据类型的值(bolean,char,byte,double等)以及String值。所有的数据流,实现了DataInput/DataOutput接口。
    数据输出流:DataOutputStream

  • writeInt(int):一次写入四个字节。注意和write不同。writeInt(int)只将该整数的最低一个8位写入。剩三个8位丢弃。
    在这里插入图片描述

  • writeBoolean(boolean);

  • writeShort(short);

  • writeLong(long);

  • writeUTF(String):按照utf-8将字符数据进行输出。只能通过readUTF读取。
    数据输入流:DataInOutputStream

  • int readInt():一次读取四个字节,并将其转成int值。

  • boolean readBoolean():一次读取一个字节。

  • short readShort();

  • long readLong();

  • String readUTF-8():按照utf-8修改版读取字符。注意,它只能读writeUTF()写入的字符数据。

什么方式存就按照什么方式取,存的时候和取得时候,顺序是一致的,否则会产生数据错乱的情况。

1.3序列化流

对象转换为字节。该字节序列包含该对象的数据、对象的类型和对象中存储的数据等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象信息。
反序列化是从文件中读取出来,重构对象

1.4ObjectOutputStream类
  • 将Java对象的原始数据类型写出到文件,实现对象的持久存储。
构造方法

public objectOutputStream(OutputStream out):创建一个指定OutputStream的ObjectOutputStream。

FileOutputStream fileOut = new FileOutputStream(“employee.txt”);
ObjectOutputStream out = new ObjectOutputStream(fileOut);

序列化操作
  1. 一个对象想要序列化,必须满足两个条件:
  • 该类必须实现java.io.Serialiazable接口,Serializable是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出NotSerializableException。
  • 该类的所有属性必须是序列化的。如果有一个属性不需要可序列化的,则该属性必须使用transient关键字标明是瞬态的。
1.5ObjectInputStream类
  • ObjectInputStream反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象。

  • 把硬盘文件中的对象数据 还原成内存中的对象状态

构造方法

public objectInputStream(InputStream in):创建一个指定InputStream的ObjectInputStream。

对象的序列化和反序列化都是依靠于对象的class进行操作的,class文件必须存在

反序列化操作1

如果能找到一个对象的class文件,我们可以进行反序列化操作,调用objectInputStream读取对象:

public final object readObject();
反序列化操作2
  • 当连续两次序列化同一对象引用时,并不会有两个对象被序列化。即使当第一序列化完成后,修改了对象的值,再次进行序列化,被序列化对象的值也不会发生变化。
  • EOFException :反序列化的次数不能超过序列化的次数
反序列化操作3
  • 反序列化之前 修改了class的数据是会失败的
  • 造成版本号问题的原因:序列化的时候会使用当前类的版本号进行序列化,但是在反序列化之前修改了本地类,那么本地类的版本号发生了改变,这样在反序列化的时候找不到这个版本号的class了,所以反序列化失败。
  • 解决方案:只要程序员在编写代码的时候给出一个版本号声明,那么以后序列化和反序列化的时候,就算修改了本地class的内容,也不会导致版本号发生变化。
  private static final long serialVersionUID = 1L;
1.6字节缓冲流
构造方法

创建一个新的缓冲输入流:public BufferedInputStream(InputStream in)

BufferedInputStream bis = new BufferedInputStreamFileInputStream"bis.txt"))

创建一个新的缓冲输出流:public BufferedOutputStream(OutputStream in)

BufferedOutputStream bos = new BufferedOutputStreamFileOutputStream"bos.txt"))
1.7字符缓冲流

创建一个新的缓冲输入流:public BufferedReader(Reader in)

BufferedReader br = new BufferedReadernew FileReader"br.txt"))

创建一个新的缓冲输出流:public BufferedWriter(Writer out)

BufferedWriter bw = new BufferedWriternew FileWriter"bw.txt"))
特有方法

字符缓冲流的基本方法与普通字符流调用方式不一致
BufferedReader:public String readLine():读一行文字
BufferedWriter:public void newLine():写一个行分隔符

1.8字节打印流
  • 字节流打印:system,out就是这个类型的流对象
  • 在该类型中,提供了很多的print和println的方法,可以将各种数据类型转换成字符串进行输出。
注意事项:

如果直接使用system.out的方式来获取PrintStream的对象,这个对象默认关联的输出目的地就是控制台;如果手动创建PrintStream的对象,那么关联的就是指定的设备。

构造方法:

PrintStream(File f):通过file对象构建字节打印流对象
PrintStream(String path):通过String路径构建字节打印流对象
PrintStream(OutPutStream os):将一个普通的字节输出流,包装成打印流,就可以使用print和println等方法了。

1.9字符打印流

该类中除了有write方法外,用提供了print方法和println方法,用来写数据。

2.0转换流

字节流转换为字符流。

有时,需要将字节流转换为字符流,使用InputStreamReader和OutputStreamWriter。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_不吃香菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值