『Java』IO--对象序列化-管道流

直接操作对象的流(对象的持久化,序列化,可串行性)

ObjectInputStream与ObjectOutputStream成对使用.

被操作的对象,需要实现Serializable (标记接口,通常没有方法)

实现Serializable其就是自动给对象标识一个序列号.

序列号:是,根据类中的成员的数字标识算出来的.不是随机的.

ObjectOutputStream搞出去的对象的序列号必须和相对应类生成的序列号相同才能被识别;

[自定义序列号:]

自己写一个固定的UID如下:

 

被序列化,意思就是,把堆上所存储的成员转到本地存储.

注意:只能把堆上的成员序列化…在方法区的静态成员是不可以序列化的.

如果非静态被transient修饰的堆上成员也不能被序列化.

 

 

 

 

管道流(IO流中设计到多线程的对象)可以对接到一起的对象.不用中转站.
类 PipedInputStream

public class PipedInputStream  extends InputStream

 

管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。

通常,数据由某个线程从 PipedInputStream 对象读取,并由其他线程将其写入到相应的 PipedOutputStream。

不建议对这两个对象尝试使用个线程,因为这样可能死锁线程。管道输入流包含一个缓冲区,

可在缓冲区限定的范围内将读操作和写操作分离开。如果向连接管道输出流提供数据字节的线程不再存在,

则认为该管道已损坏。

 

 

类 PipedOutputStream

 

public class PipedOutputStream  extends OutputStream

可以将管道输出流连接到管道输入流来创建通信管道。管道输出流是管道的发送端。通常,数据由某个线程写入 PipedOutputStream 对象,并由其他线程从连接的 PipedInputStream 读取。不建议对这两个对象尝试使用单个线程,因为这样可能会造成该线程死锁。如果某个线程正从连接的管道输入流中读取数据字节,但该线程不再处于活动状态,则该管道被视为处于 毁坏 状态。 

 

 

实例:

 

 

 

import java.io.*;
//建立Read读取类,实现Runnable抒写被多线成执行的代码
class Read implements Runnable{
	private PipedInputStream in;
	//一初始化就有一个管道进来.
	Read(PipedInputStream in){
		this.in=in;
	}
	public void run(){
		try{
			//创建一个byte数组.....
			byte[] buf =new byte[1024];
			System.out.println("读取前没有数据,阻塞");
			int len=in.read(buf);
			System.out.println("读到数据,阻塞结束");
			//将读取到的buf中的数组变成数组打印出来
			String s=new String(buf,0,len);
			System.out.println(s);
			in.close();
		}catch(IOException e){
				throw new RuntimeException("管道流读取流失败");
		}
	}
}
//建立Write写入类,实现Runnable抒写多线程执行的代码.
class Write implements Runnable{
	private PipedOutputStream out;
	Write(PipedOutputStream out){
		this.out=out;
	}
	public void run(){
			try{
				System.out.println("开始写入数据,等待6秒后");
				Thread.sleep(6000);
				//写入数据,参数为byte[],所以,这里用到了String转byte数组的方法
				out.write("piped lai la".getBytes());
				out.close();
			}
			catch(Exception e){
				throw new RuntimeException("管道输出流失败");
			}
	}
}
public class Demo{
	public static void main(String[] args)throws IOException{
				//创立两个管道流
				PipedInputStream in =new PipedInputStream();
				PipedOutputStream out =new PipedOutputStream();
				in.connect(out);//将两个管道对接
				
				//创立对象
				Read r=new Read(in);
				Write w=new Write(out);
				
				//建立两个线程,并打开调用run中的代码.
				new Thread(r).start();
				new Thread(w).start();	
	}
}
Result:
读取前没有数据,阻塞
开始写入数据,等待6秒后
读到数据,阻塞结束
piped lai la

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 序列化数组是将数组对象转换为字节的过程,以便在网络上传输或保存到文件中。Java提供了对象IO流来实现序列化和反序列化操作。要序列化数组,需要将数组对象包装在一个对象中,然后使用ObjectOutputStream将对象写入字节。反序列化时,使用ObjectInputStream将字节读取为对象,然后从对象中获取数组。需要注意的是,数组中的每个元素都必须是可序列化对象。 ### 回答2: Java输入输出(IOJava应用程序中非常重要的一部分,它可以基于二进制或字符来输入或输出数据。对象IO流Java IO流中的一种重要形式,可以用来处理Java对象Java对象可以被序列化并写入文件中,以便在需要时读取。 序列化是将对象转换为字节序列的过程,以便可以将它们存储在磁盘上或在网络上传输。反序列化是将字节序列转换回对象的过程。使用Java序列化,可以将对象保存在文件中,然后在以后读取它们,或者在不同的机器之间传递对象序列化数组是将数组的所有元素序列化到文件中或者在网络上传输的过程。Java提供了多种序列化方法来序列化数组。以下是使用对象IO流进行序列化数组的步骤: 1. 创建一个需要序列化对象数组。例如,int[] array = {1, 2, 3, 4, 5}。 2. 创建一个输出,可以使用文件输出或套接字输出,以便将字节数据写入文件或通过网络传输。 3. 创建序列化对象,将输出对象作为参数传入。例如,ObjectOutputStream oos = new ObjectOutputStream(fos)。 4. 调用序列化对象的writeObject()方法来将数组对象序列化并写入输出中。例如,oos.writeObject(array)。 5. 使用flush方法刷新缓冲区。 6. 关闭序列化和输出。例如,oos.close()和fos.close()。 7. 创建一个输入,可以使用文件输入或套接字输入,以便从文件或网络接收字节数据。 8. 创建反序列化对象,将输入对象作为参数传入。例如,ObjectInputStream ois = new ObjectInputStream(fis)。 9. 调用反序列化对象的readObject()方法,将字节数据读取为数组对象。例如,int[] newArray = (int[]) ois.readObject()。 10. 使用读取的数组对象进行必要的操作。 11. 关闭反序列化和输入。例如,ois.close()和fis.close()。 在使用Java对象IO流进行序列化和反序列化时,需要注意以下事项: 1. 需要序列化对象必须实现Serializable接口,该接口没有任何具体方法,只是将您的类标记为可序列化的类。 2. 如果不希望某些类的某些实例序列化,可以使用transient关键字。 3. 在序列化和反序列化时,需要确保使用相同的序列化序列。如果序列化序列不同,反序列化将失败。 4. 序列化和反序列化可能会引起性能问题,因此需要在性能需求和数据安全性之间进行权衡。 ### 回答3: 在Java编程中,I/O是非常重要的概念,它可以将数据从硬盘或网络读取到内存中,或将内存中的数据写入到硬盘或网络中,从而实现数据的交换。I/O非常灵活,无论是读取文件、网络数据,还是处理用户输入等,都必不可少。而序列化则是I/O的一种特殊形式,可以将Java对象转换成二进制的形式,以便在网络上进行传输或存储到硬盘中保存,同时也可以将二进制数据转换回Java对象Java序列化的过程中,我们可以将一个对象的所有属性都存储在一个数组中,这就是数组序列化。数组序列化非常灵活,我们可以将多个不同类型的对象存储在同一个数组中,在需要的时候从数组中读出来进行处理。数组序列化也非常适合用来存储表格、矩阵、图像等数据。 Java中的数组序列化可以通过使用ObjectOutputStream和ObjectInputStream类来实现。ObjectOutputStream类可以将Java对象序列化为二进制数据输出,而ObjectInputStream类可以将输入中的二进制数据反序列化Java对象。在进行序列化之前,必须保证对象中的所有成员变量都是可序列化的,否则将会抛出NotSerializableException异常。 实现数组序列化的步骤如下: 1. 创建数组对象,并初始化数组; 2. 创建ObjectOutputStream对象,并调用writeObject()方法将数组序列化到输出中; 3. 创建ObjectInputStream对象,从输入中读取二进制数据,并调用readObject()方法将数据反序列化Java对象; 4. 关闭。 下面是一个简单的数组序列化的样例代码: ```java import java.io.*; public class ArraySerialization { public static void main(String[] args) { int[] arr = {1, 2, 3, 4, 5}; try { // 创建ObjectOutputStream对象 ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("array.ser")); // 序列化数组对象到输出中 out.writeObject(arr); out.close(); // 创建ObjectInputStream对象 ObjectInputStream in = new ObjectInputStream(new FileInputStream("array.ser")); // 从输入中反序列化Java对象 int[] newArr = (int[]) in.readObject(); for (int i = 0; i < newArr.length; i++) { System.out.print(newArr[i] + " "); } in.close(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } ``` 以上是一个数组序列化的简单样例,实际应用中还需要针对具体情况做调整,并且要注意处理可能出现的异常。总之,数组序列化Java I/O的一个重要方面,它可以方便地将多个数据存储到一个数组中,并在需要的时候进行读取和处理,同时也是Java数据持久化的一个重要手段。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值