管道流与对象序列化

今天老师给讲的是管道流和对象序列化这一块,有以下几点:

管道流

 PipedInputStream

 PipedOutputStream

      特点

           读取管道流流和写入管道流可以进行连接。

           连接方式:

           1,通过两个流对象的构造函数。

           2,通过两个对象的connect方法。

           通常两个流在使用时,需要加入多线程技术,也就是让读写同时运行。

           注意;对于read方法。该方法是阻塞式的,也就是没有数据的情况,该方法会等待。

 

//sender.java

 

import java.io.*;

import java.util.*;

 

public class Sender extends Thread {

   PipedOutputStream out = new PipedOutputStream();

 

   public PipedOutputStream getOut() {

     return out;

   }

 

   public void run() {

     String str = "Hello,receiver   !   I`m   sender\n ";

     try {

        for(int i=0; i<10; i++)

          out.write(str.getBytes());

        out.close();

     } catch (Exception e) {

        e.printStackTrace();

     }

   }

}

 

//Receiver.java

import java.io.PipedInputStream;

import java.util.*;

 

public class Receiver extends Thread {

   PipedInputStream in = new PipedInputStream();

 

   public PipedInputStream getIn() {

     return in;

   }

 

   public void run() {

     byte[] buf = new byte[1024];

     try {

        int len = in.read(buf);

        System.out.println("the   following   is   from   sender:\n "

             + new String(buf, 0, len));

        in.close();

     } catch (Exception e) {

        e.printStackTrace();

     }

   }

}

 

//TestPiped

import java.io.PipedInputStream;

import java.io.PipedOutputStream;

 

class TestPiped {

   public static void main(String[] args) {

     Sender s = new Sender();

     Receiver r = new Receiver();

    

     PipedOutputStream out = s.getOut();

     PipedInputStream in = r.getIn();

    

     try {

        in.connect(out);

        s.start();

        r.start();

     } catch (Exception e) {

        e.printStackTrace();

     }

   }

}

 

序列流,也称为合并流——SequenceInputStream:

      特点:可以将多个读取流合并成一个流。这样操作起来很方便。

      原理:其实就是将每一个读取流对象存储到一个集合中。最后一个流对象结尾作为这个流的结尾。

      两个构造函数:

      1,SequenceInputStream(InputStreamin1,InputStream in2)

           可以将两个读取流合并成一个流。

      2,SequenceInputStream(Enumeration<?extends InputStream> en)

           可以将枚举中的多个流合并成一个流。

      作用:可以用于多个数据的合并。

//将两个文件拼接为一个流进行依次读取

import java.io.*;

 

public class DataIODemo1 {

   public static void main(String[] args) throws IOException {

     FileInputStream fis1 = new FileInputStream("res/a.txt");

     FileInputStream fis2 = new FileInputStream("res/number.txt");

    

     SequenceInputStream sis = new SequenceInputStream(fis1, fis2);

    

     int ch;

     while((ch = sis.read()) != -1){

        System.out.print((char)ch);

     }

    

     sis.close();

     fis1.close();

     fis2.close();

   }

}

 

 

      注意:因为Enumeration是Vector中特有的取出方式。而Vector被ArrayList取代。

      所以要使用ArrayList集合效率更高一些。那么如何获取Enumeration呢?

 

      ArrayList<FileInputStream > al = new ArrayList<FileInputStream>();

 

      for(int x=1; x<4; x++)

           al.add(new FileInputStream(x+".txt"));

     

//返回按适当顺序在列表的元素上进行迭代的迭代器。

      final Iterator<FileInputStream> it = al.iterator();

      Enumeration<FileInputStream> en = new Enumeration<FileInputStream>() {

           public boolean hasMoreElements()          {

                 return it.hasNext();

           }

           public FileInputStream nextElement()      {

                 return it.next();

           }

      };

          

      //多个流就变成了一个流,这就是数据源。

      SequenceInputStream sis = new SequenceInputStream(en);

     

      //创建数据目的。

      FileOutputStream fos = new FileOutputStream("4.txt");

 

      byte[] buf = new byte[1024*4];

     

      int len = 0;

 

      while((len=sis.read(buf))!=-1)

      {

           fos.write(buf,0,len);

      }

 

      fos.close();

      sis.close();

 

 

      //如果要一个对文件数据切割。

 

      一个读取对应多了输出。

      FileInputStream fis = new FileInputStream("1.mp3");

 

      FileOutputStream fos  = null;

 

      byte[] buf = new byte[1024*1024];//是一个1m的缓冲区。

 

      int len = 0;

      int count = 1;

 

      while((len=fis.read(buf))!=-1)

      {

           fos = new FileOutputStream((count++)+".part");

           fos.write(buf,0,len);

 

           fos.close();

      }

      fis.close();

 

      //这样就是将1.mp3文件切割成多个碎片文件。

 

      想要合并使用SequenceInputStream即可。

      对于切割后,合并是需要的一些源文件的信息。

      可以通过配置文件进行存储。该配置可以通过键=值的形式存在。

      然后通过Properties对象进行数据的加载和获取。

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 对象序列化是将对象的状态转换为字节,以便将其存储在文件中或通过网络进行传输。而反序列化则是将字节重新转换为对象,以便在程序中重新使用。 对象序列化主要涉及到两个接口,即 Serializable 和 Externalizable。Serializable 接口是 Java 标准序列化机制的简单版本,所有需要序列化的类都需要实现这个接口。而 Externalizable 接口则需要自己实现序列化和反序列化的方法。 在进行对象序列化时,可以使用 ObjectOutputStream 类来实现。通过这个类的 writeObject() 方法,可以将对象写入到输出中。而在进行反序列化时,可以使用 ObjectInputStream 类来实现。通过这个类的 readObject() 方法,可以将字节重新转换为对象对象序列化的主要用途包括: 1. 对象的持久化:通过将对象序列化后存储在文件中,可以实现对象的持久化,当程序再次启动时,可以反序列化读取文件并重新获取对象的状态。 2. 对象的传输:通过将对象序列化后通过网络传输,可以实现在不同计算机之间的对象传递。 在进行对象序列化时,需要注意以下几点: 1. 需要被序列化对象和其引用的对象,都需要实现 Serializable 接口。 2. 对于不希望被序列化的属性,可以使用 transient 关键字进行标记。 3. 如果序列化的是一个对象的成员变量,而不是整个对象,那么成员变量对应的类也需要实现 Serializable 接口。 总之,Java 对象序列化和反序列化是一种非常有用的机制,它可以将对象的状态转换为字节进行存储或传输,以便在需要时重新获取对象。通过使用序列化机制,我们可以实现对象的持久化和传输,使得编程更加灵活和便捷。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值