`
=死神=
  • 浏览: 57987 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java 位流处理2

    博客分类:
  • Java
阅读更多

 ObjectInputStream和ObjectOutputStream

      Java程序执行的过程中,很多数据都是以对 象的方式存在于内存中。有时会希望直接将内存中整个对象存储至文件,而不是只存储对象中的某些基本类型成员信息,而在下一次程序运行时,希望可以从文件中 读出数据并还原为对象。这时可以使用java.io.ObjectInputStream和java.io.ObjectOutputStream来进行 这项工作

 

      如果要直接存储对象,定义该对象的类必须实现java.io.Serializable接口,不过Serializable接口中并没有规范任何必须实现的方法,所以这里所谓实现的意义,其实像是对对象贴上一个标志,代表该对象是可序列化的(Serializable)。

 

      为了说明如何直接存储对象,先来实现一个User类

 

import java.io.Serializable;

public class User implements Serializable {

	private static final long serialVersionUID = 1L;

	private String name;

	private int number;

	public User() {

	}

	public User(String name, int number) {
		this.name = name;
		this.number = number;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getNumber() {
		return number;
	}

	public void setNumber(int number) {
		this.number = number;
	}

}

 

注意到serialVersionUID,它代 表了可序列化对象的版本。如果没有提供这个版本信息,则实现Serializable接口的类会自动依类名称、实现的接口、成员等来产生。如果是自动产生 的,则下次更改User类,自动产生的serialVersionUID也会跟着变更,从文件读回对象时若两个对象的serialVersionUID不 相同,就会丢出java.io.InvalidClassException。如果想要维持版本信息的一致,则要明确声明 serialVersionUID。

ObjectInputStream和 ObjectOutputStream为InputStream、OutputStream的实例加上了可以让用户写入对象与读出对象的功能。在写入对象 时,要使用writeObject()方法,读出对象时则使用readObject()方法,被读出的对象都是以Object的类型返回。所以必须将之转 换为对象原来的类型,才能正确地实现被读回的对象。示范了如何存储User对象至文件中,然后再将它读回并还原为User实例

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;

public class ObjectStreamDemo {

	public static void main(String args[]) {
		User[] users = { new User("cater", 101), new User("justin", 102) };
		// 写入新文件
		writeObjectsToFile(users, args[0]);
		try {
			// 读取文件数据
			users = readObjectsFromFile(args[0]);
			// 显示读回的对象
			for (User user : users) {
				System.out.printf("%s\t%d%n", user.getName(), user.getNumber());
			}
			System.out.println();

			users = new User[2];
			users[0] = new User("momor", 103);
			users[1] = new User("becky", 104);

			// 附加新对象至文件
			appendObjectsToFile(users, args[0]);

			// 读取文件数据
			users = readObjectsFromFile(args[0]);
			// 显示读回的对象
			for (User user : users) {
				System.out.printf("%s\t%d\n", user.getName(), user.getNumber());
			}

		} catch (ArrayIndexOutOfBoundsException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}

	public static void writeObjectsToFile(Object[] objs, String filename) {
		File file = new File(filename);
		try {
			ObjectOutputStream objectOutputStream = new ObjectOutputStream(
					new FileOutputStream(file));
			for (Object obj : objs) {
				// 将对象写入文件
				objectOutputStream.writeObject(obj);
			}
			objectOutputStream.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static User[] readObjectsFromFile(String fileName)
			throws FileNotFoundException {
		File file = new File(fileName);
		// 如果文件不存在就丢出异常
		if (!file.exists())
			throw new FileNotFoundException("未找到文件" + fileName);
		// 使用List先读取出对象
		List<User> list = new ArrayList();
		try {
			FileInputStream fileInputStream = new FileInputStream(file);
			ObjectInputStream objectInputStream = new ObjectInputStream(
					fileInputStream);
			while (fileInputStream.available() > 0) {
				list.add((User) objectInputStream.readObject());
			}
			objectInputStream.close();

		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		User[] users = new User[list.size()];
		return list.toArray(users);
	}

	public static void appendObjectsToFile(Object[] objs, String fileName)
			throws FileNotFoundException {
		File file = new File(fileName);
		if (!file.exists())
			throw new FileNotFoundException("未发现文件" + fileName);
		try {
			ObjectOutputStream objectOutputStream = new ObjectOutputStream(
					new FileOutputStream(fileName, true)) {
				// 如果要附加对象到文件后
				// 必须重新定义这个方法
				protected void writeStreamHeader() throws IOException {
				}
			};
			for (Object obj : objs) {
				objectOutputStream.writeObject(obj);
			}
			objectOutputStream.close();

		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}

 

 

范例中必要的地方都已加上注释,虽然程序很长,但范例中已经将写入对象至文件、从文件读出对象、附加对象至文件的程序逻辑集中在writeObjectsToFile()、readObjectsFromFile()与appendObjectsToFile() 3个方法中

 

ObjectOutputStream objOutputStream =
     new ObjectOutputStream(
         new FileOutputStream(file, true)) {
             protected void writeStreamHeader()
                                  throws IOException {}
         }; 

 

 

源文件地址:http://hi.baidu.com/mdbing/blog/item/4612cb13decfc4075aaf53fa.html

 

 

 

分享到:
评论

相关推荐

    基于Java的视频流处理(原创)

    在本项目中,"基于Java的视频流处理(原创)"是一个使用Java技术进行实时视频流处理的应用。这个项目的核心是实现一个基本的哈哈镜效果,并结合了第三方库来完成人脸检测以及对人脸的图像遮挡功能。在创新实践项目课...

    java零基础自学 之 JavaIO流处理

    字节流处理8位的字节,适用于二进制文件,如图片、音频等。 2. **IO类的分类** Java的IO类主要分为两大类:字符流(Reader和Writer)和字节流(InputStream和OutputStream)。Reader和Writer是字符流的基类,...

    Java的异常处理和IO流

    Java的异常处理与IO流是Java编程中两个重要的概念,它们在软件开发中扮演着至关重要的角色。本文将深入探讨这两个主题,以便更好地理解和应用它们。 ### 一、Java异常处理 #### 1.1 什么是异常 异常是指在程序...

    java实现流媒体播放

    最后,Java流媒体播放程序应具备良好的错误处理机制,如网络中断后的恢复、媒体文件格式不支持时的提示等。同时,考虑到不同的操作系统和硬件环境,程序还需要考虑跨平台的兼容性。 总的来说,Java 实现流媒体播放...

    基于red5 dsj 的java 处理视频流和一些疑问

    标题 "基于red5 dsj 的java 处理视频流和一些疑问" 提示我们讨论的是一个使用Red5和DSJ(可能是指“Digital Signal Jockey”或某种特定工具)进行Java视频流处理的项目。Red5是一个开源的流媒体服务器,能够处理音频...

    java数据流总结

    java数据流总结,java io流总结,节点流和处理流 java数据流总结,java io流总结,节点流和处理流 java数据流总结,java io流总结,节点流和处理流

    java_io流的处理

    ### Java IO流处理详解 #### I/O流概述 在Java编程中,输入/输出(I/O)处理是一项核心技能,涉及从键盘读取数据、向屏幕输出数据、从文件读写数据以及在网络连接上进行读写操作。Java将这些不同的输入输出源抽象...

    Java中文件IO流.pdf

    Java 中文件 IO 流 Java 中文件 IO 流是指 Java 语言中对文件的输入输出操作,通过定义文件流来实现文件的读写...在 Java 中,文件 IO 流操作是非常重要的,掌握文件 IO 流操作可以帮助我们更好地处理文件相关的任务。

    java 视频流读写

    Java 视频流读写是Java编程中涉及多媒体处理的一部分,主要目的是为了在应用程序中处理、播放或存储视频数据。Java Media Framework (JMF) 是Java平台上的一个关键组件,用于处理音频、视频和流媒体内容。在这个"JMF...

    Java字符流和字节流

    字节流处理的是8位的字节数据,而字符流处理的是16位的Unicode字符。这两种流都有各自的特点和应用场景。 #### 二、字节流 字节流是最基本的数据传输方式,适用于任何类型的数据传输。在Java中,所有字节流类都是`...

    IO流 javaio java 流

    字符流处理单个字符,而字节流处理8位的字节序列。它们又可以进一步细分为输入流(InputStream/Reader)和输出流(OutputStream/Writer),分别用于数据的读取和写入。 1. 字节流: - 字节输入流(InputStream):...

    Java流(文件读写操作)

    ### Java流(文件读写操作) #### 一、流的分类 Java中处理文件和数据时,使用流的概念来进行操作。根据不同的标准,流可以分为几种类型。 ##### 1. 按数据流动方向 - **输入流**:主要用于从数据源读取数据。输入...

    JAVA对音频文件处理程序

    在Java编程语言中,处理音频文件是一项常见的任务,特别是在多媒体应用、游戏开发或者音视频处理系统中。本项目“JAVA对音频文件处理程序”聚焦于读取音频文件,执行降分贝操作,然后将处理后的音频保存为新的文件。...

    JAVA IO流技术

    4. Java流的细分: - 流的方向:输入流用于从数据源读取数据,输出流用于向目标写入数据。 - 处理数据单元:字节流按字节进行读取(InputStream、OutputStream),字符流按字符进行读取(Reader、Writer)。 - ...

    java_IO流的处理.ppt

    Java IO流处理是Java编程中一个非常重要的概念,它用于在不同数据源之间传输数据,如文件、网络、内存等。在Java中,IO流分为两大类:输入流(Input Stream)和输出流(Output Stream),它们分别用于数据的读取和...

    java实现工作流

    在实际应用中,Java工作流解决方案可以广泛应用于各种业务场景,如审批流程、订单处理、客户服务等。通过Java工作流,企业可以优化业务流程,减少人为错误,提高工作效率,同时增强业务流程的透明度和可追溯性。 ...

    java数据流的概述

    字节流处理的是8位的字节数据,适用于所有类型的数据,包括图像、音频等二进制文件。而字符流处理的是16位的Unicode字符,更适合文本数据的处理。在Java.io包中,这两类流都提供了输入流和输出流接口,用于读取和...

    基于Java的流媒体视频直播服务器设计与实现

    本项目聚焦于“基于Java的流媒体视频直播服务器设计与实现”,这涉及到多个IT领域的知识,包括音视频处理、服务器架构、Java编程以及运维等。 首先,我们要理解流媒体的概念。流媒体是指在互联网上传输的连续多媒体...

    java 输入输出流

    2. **字符流**:字符流处理Unicode字符数据,分为字符输入流(Reader)和字符输出流(Writer)。Reader的基类是`java.io.Reader`,Writer的基类是`java.io.Writer`。比如,`FileReader`用于读取字符文件,`...

Global site tag (gtag.js) - Google Analytics