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 class App {

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

// 定义分割的小文件类

File[] srcFile = new File[3];

// 合成文件路径

File desFile = new File("d:/file.txt");

RandomAccessFile raf = new RandomAccessFile(desFile, "rw");

for (int i = 0; i < 3; i++) {

srcFile[i] = new File("d:/bb.txt" + "_" + i);

FileInputStream fis = new FileInputStream(srcFile[i]);

byte[] buf = new byte[2];

int len = 0;

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

raf.write(buf, 0, len);

}

fis.close();

}

raf.close();

System.out.println("over");

}

}

package com.it18zhang;

/**

* 文件分割器

*/

import java.io.File;

import java.io.FileOutputStream;

import java.io.RandomAccessFile;

public class FileSplitter {

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

// 源文件

File srcFile = new File("D:\\bb.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.

package com.it18zhang.deepcopy;

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("tom"+i,i+2,i));

}

//写入(串行化)

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.it18zhang.deepcopy;

import java.io.Serializable;

public class Cat implements Serializable{

private static final long serialVersionUID = 2781643003919236664L;

private String name;

private int age;

private String color;

private int xx;

public Cat(String name, int age, int xx) {

super();

this.name = name;

this.age = age;

this.xx = xx;

}

//临时的

private transient Person owner;

private Dog neibor;

public Dog getNeibor() {

return neibor;

}

public void setNeibor(Dog neibor) {

this.neibor = neibor;

}

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;

}

public String getColor() {

return color;

}

public void setColor(String color) {

this.color = color;

}

public int getXx() {

return xx;

}

public void setXx(int xx) {

this.xx = xx;

}

}

package com.it18zhang.deepcopy;

import java.io.Serializable;

public class Person implements Serializable{

private static final long serialVersionUID = 1513592729849839686L;

private String name;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

package com.it18zhang.deepcopy;

import java.io.Serializable;

public class Dog implements Serializable{

private static final long serialVersionUID = -6027249953977477940L;

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-12-28 11:47:01

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

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 

IT十八掌作业_java基础第十四天_IO

1.定义函数,输出一个byte的二进制字符串. 2.定义工具类,完成int数和byte[]之间的相互转换. 3.阐述IO流. 输入输出流 字符字节流 缓冲和非缓冲流 转换流. 4.通过File对象打印输出指定路径下的整个目录树结构. 5.完成文件夹复制. --------------------------------------------- 1. package com.it18zhang.day14; public class ByteToBin { public static void

IT十八掌作业_java基础第十六天_GUI/socket

参照视频,编写出聊天程序. 知识点分析: Socket + GUI  + IO =  简版QQ ------------------------------ 1.GUI 2.Socket ServerSocket : port + accept Socket sock  = accept(); //更新窗口 //接收client的数据 new Thread(){ run(){ sock..getInputStream(); .... //更新窗口 } }.start() 3.在分线程中完成Ser

IT十八掌作业_java基础第十天_集合

1.remove(int index); //删除指定位置的元素 2.remove(Object o); //删除指定对象,考查删除对象的规则是什么? 3.removeAll(Collection col);//删除指定集合中的所有元素. 4.contains(Object o); //是否包含 5.contains(Collection col);//是否包含集合. ----------------------------------------------------------------

IT十八掌作业_java基础第26天_Java基础总结/虚拟机基础

感谢大家对IT十八掌大数据的支持,今天的作业如下: 巩固java基础知识,安装虚拟机! --------------------------------------------------------------------------------------------------------答案略,自行练习

IT十八掌作业_java基础第八天_多线程

感觉大家对IT十八掌大数据的支持,今天的作业如下 1. 5辆汽车过山洞,依次经过山洞.每辆车通过山洞花费10秒,使用多线程实现. 2. 用多线程模拟蜜蜂和熊的关系. 蜜蜂是生产者,熊是消费者.蜜蜂生产蜂蜜是累加的过程,熊吃蜂蜜是批量(满100吃掉)的过程. 生产者和消费者之间使用通知方式告知对方.注意不能出现死锁的现象.

IT十八掌作业_java基础第25天_NIO

感谢大家对IT十八掌大数据的支持,今天的作业如下: 1.将NIO中的Socket通信过程使用图形进行描述和说明. 2.画图说明Runtime data area的内部结构. 3.阐述class的类加载过程. 4.反射和内省的异同,以及各自的优缺点. 5.阐述jvm中从堆和非堆的角度阐述jvm的内存结构.

IT十八掌作业_java基础第十七天_QQ案例

感谢大家对IT十八掌大数据的支持,今天的作业如下: 按照老师讲的,自己练习项目

IT十八掌作业_java基础第23天_数据库连接池\反射

感谢大家对IT十八掌大数据的支持,今天的作业如下: 1.属性赋值 ------------- 1.Man{50+ } Man man = new Man(); man.setXxx1(...); man.setXxx2(...); ... 50 Man copy = new Man(); copy = man ; copy.setXxx1(man.getXxx1()); copy.setXxx1(man.getXxx1()); copy.setXxx1(man.getXxx1()); copy.