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

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都有应用。对象序列化问题在网络编程中并不是最激动人心的课题,但却相当重要,具有许多实用意义。

时间: 2024-10-24 23:17:15

Java基础第十五天_IO串行化/深度复制的相关文章

IT十八掌作业_java基础第十五天_IO串行化/深度复制

1.使用RandomAccessFile实现文件合成. 2.使用java中的串行化技术实现对象图(100只猫Cat集合,但是Cat的owner不需要串行化)的深度复制. 3.阐述串行化的过程,应用场景,串行ID的用途. 1. package com.it18zhang; /** * 将分割的文件进行合成 */ import java.io.File; import java.io.FileInputStream; import java.io.RandomAccessFile; public c

串行化--深度复制

package day; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import org.junit.jupiter.api.Test; /** * DataInputStream+DataOutputStream * @author ASUS * */ public class DataIOStreamDemo { /** * 写入 * @

Java基础第十五天总结

RandomAccessFile ----------------------- 随机访问文件 1)Object-->RandomAccessFile 2)实现DataInput DataOutput接口 3)seek(int byte) 4) 使用RandomAccessFile实现文件合成 自己定义的JavaBean实现串行化需要实现Serializable接口,这个接口是用来标识性接口,没有任务方法,是给Java虚拟机看的. 网络间传输或者本地化存储需要串行化 将Java对象转换成二进制数

Java基础--第二十五天

TCP协议: Socket类 构造方法: TCP程序,必须先开服务器端 成员方法 服务器端程序: 创建服务器端Socket对象: 监听连接: 获取输入流,并显示: 释放资源 ServerSocket类 网络编程 网络编程+反馈 大融合[所有的Java基础融合为一个实例] 正则表达式: 符合某种规则的字符串,常用于校验 规则: Pattern类 A:字符 x:任意字符表示任意字符本身 \\:反斜线字符[转义字符] \r:回车 \n:换行 B:字符类 [abc]:表示a,b,c任意字符一次 [^ab

Java基础(十五):Java 中的内部类

问:什么是内部类呢? 答:内部类( Inner Class )就是定义在另外一个类里面的类.与之对应,包含内部类的类被称为外部类. 问:那为什么要将一个类定义在另一个类里面呢?清清爽爽的独立的一个类多好啊!! 答:内部类的主要作用如下: 1. 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类 2. 内部类的方法可以直接访问外部类的所有数据,包括私有的数据 3. 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便 问:内部类有几种呢? 答:内部

java基础(十五章)

一.字符串类String 1.String是一个类,位于java.lang包中 2.创建一个字符串对象的2种方式: String 变量名="值"; String 对象名=new String("值"); 3.字符串的常用方法 3.1 字符串长度--length() 3.2 判断值是否相等 equals() 3.3 判断字符串对象地址是否相同 == 3.4 忽略 大小写 判断 equalsIgnoreCase() 3.5 大小写转换 toLowerCase()--小写

大数据Java基础第十五天作业

第一题:实现文件拆分.合并. import java.io.File; import java.io.RandomAccessFile; import java.io.FileOutputStream; import java.io.FileInputStream; import java.io.BufferedOutputStream; import java.io.BufferedInputStream; import java.util.List; import java.util.Arr

大数据Java基础第十五天、第十六天作业

使用Socket编写类似QQ通讯工具,显示屏幕的历史聊天记录待优化. import javax.swing.JFrame; import javax.swing.JButton; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableModel; import java.awt.event

Java基础--第十五天

一.Date类 构造方法[2] Date -- Long 互换 Date d = new Date(); Date d1 = new Date(); d1.getTime(); d1.setTime(); 二.DateFormat类 格式化:Date -- String 解析:  String -- Date SimpleDateFormat类 [extends DateFormat] public final String format(Date date):Date -- String 时间