码迷,mamicode.com
首页 > 编程语言 > 详细

Java基础第十五天_IO串行化/深度复制

时间:2016-07-11 19:20:49      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:串行   深度复制   

1.使用RandomAccessFile实现文件切割。

答:

package app_作业;

import java.io.File;
import java.io.FileOutputStream;
import java.io.RandomAccessFile;

public class app15_使用RandomAccessFile实现文件切割 {

	public static void main(String[] args) throws Exception {
		// 源文件
		File srcFile = new File("D:/foo.txt");
		// 随机访问
		RandomAccessFile raf = new RandomAccessFile(srcFile, "r");
		// 文件总长度
		long totalLength = srcFile.length();
		// 文件的分割份数
		int number = 3;
		// 计算平均每个文件的长度,最后一份
		int fileLength = (int) totalLength / number;

		// 循环份数,读写文件
		for (int i = 0; i < number; i++) {
			System.out.println("循环:" + i);
			// 开始指针
			int startIndex = i * fileLength;
			// 处理结束指针
			int endIndex = 0;
			if (i == (number - 1)) {
				endIndex = (int) totalLength - 1;
			} else {
				endIndex = ((i + 1) * fileLength) - 1;
			}
			// 创建文件输出流
			FileOutputStream fos = new FileOutputStream(
					srcFile.getAbsolutePath() + "_" + i);
			raf.seek(startIndex);
			// 定义缓冲区
			byte[] buf = new byte[2];
			while (true) {
				// 得到当前文件指针
				int currPointer = (int) raf.getFilePointer();
				int remain = endIndex - currPointer + 1;
				if (remain >= buf.length) {
					raf.read(buf);
					fos.write(buf);
				} else {
					raf.read(buf,0,remain);
					fos.write(buf, 0, remain);
				}
				if (raf.getFilePointer() > endIndex) {
					break;
				}
			}
			fos.close();
			System.out.println("结束");
		}
		raf.close();
	}
}


2.使用java中的串行化技术实现对象图(100只猫Cat集合,但是Cat的owner不需要串行化)的深度复制。

package com.it8zhang_15job.demo;

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

public class AppCatList {

	public static void main(String[] args) throws Exception {
		List<Cat> list = new ArrayList<Cat>();
		for(int i = 0 ; i < 100 ; i ++){
			list.add(new Cat());
		}
		
		/******************** 写入(串行) **********************/
		//对象输出流
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d:/cats.dat"));
		oos.writeObject(list);
		oos.close();
		
		/******************** 读取(反串行) **********************/
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:/cats.dat"));
		list = (List<Cat>)ois.readObject();
		ois.close();
		
		for(Cat c : list){
			System.out.println(c.getName() + " - " + c.getAge() + "-"+ c.getXx());
		}
	}
}

package com.it8zhang_15job.demo;

import java.io.Serializable;

/**
 * javaBean
 */
public class Cat implements Serializable {
	private static final long serialVersionUID = 1861516170581376793L;
	private String name;
	private int age;
	private String color ;
	private int xx ;
	//临时的
	private transient Person owner ;
	
	private Dog neibor ;
	
	public Dog getNeibor() {
		return neibor;
	}
	public void setNeibor(Dog neibor) {
		this.neibor = neibor;
	}
	public Person getOwner() {
		return owner;
	}
	public void setOwner(Person owner) {
		this.owner = owner;
	}
	public int getXx() {
		return xx;
	}
	public void setXx(int xx) {
		this.xx = xx;
	}
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	public Cat() {
		System.out.println("()");
	}
	public Cat(String name, int age) {
		super();
		System.out.println("(1)");
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

package com.it8zhang_15job.demo;

import java.io.Serializable;

public class Dog implements Serializable{
	
	private static final long serialVersionUID = 264736816365982588L;
	
	private String name;

	public String getName() {
		return name;
	}

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

}

package com.it8zhang_15job.demo;

import java.io.Serializable;

public class Person implements Serializable{
	
	private static final long serialVersionUID = -3860831553852022224L;
	
	private String name ;

	public String getName() {
		return name;
	}

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

3.阐述串行化的过程,应用场景,串行ID的用途。

答:串行化(Serialization)是计算机科学中的一个概念,它是指对象存储到介质(如文件、内存缓冲区等)中或是以二进制方式通过网络传输。之后可以通过反串行化从这些连续的字节(byte)数据重新构建一个与原始对象相同的对象,因此在特定情况下也可以说是得到一个副本,但并不是所有情况都是这样。

1、该对象的类必须实现Serializable接口。

2、该对象的串行化成员必须是非静态成员变量,即不能保存任何的成员方法和静态的成员变量,而且串行化保存的是变量的值,对于变量的任何修饰符,都不能保存。

3、要串行化一个对象,必须与一定的对象输入/输出流联系起来,通过对象输出流将对象状态保存下来,再通过对象输入流将对象状态恢复。

对象序列化功能非常简单、强大,在RMI、Socket、JMS、EJB都有应用。对象序列化问题在网络编程中并不是最激动人心的课题,但却相当重要,具有许多实用意义。


Java基础第十五天_IO串行化/深度复制

标签:串行   深度复制   

原文地址:http://11227677.blog.51cto.com/11217677/1825472

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!