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都有应用。对象序列化问题在网络编程中并不是最激动人心的课题,但却相当重要,具有许多实用意义。
原文地址:http://11227677.blog.51cto.com/11217677/1825472