java15

RandomAccessFile

随机访问文件,支持随机读写

  1. seek(long pos)绝对定位
  2. skipBytes(int num) 相对值
  3. read()
  4. write()
  5. RandomAccessFile(String str, String mode)
    1. r
    2. rw
    3. rws
    4. rwd

多线程复制文件

存储对象

流的关闭

 1 import java.io.FileInputStream;
 2 import java.io.FileOutputStream;
 3 import java.io.ObjectInputStream;
 4 import java.io.ObjectOutputStream;
 5
 6 import org.junit.Test;
 7
 8 public class ObjectSerializeDemo {
 9
10     public static void main(String[] args) throws Exception {
11         //serialize();
12         //deSerialize();
13         serializePerson();
14         deSerializePerson();
15     }
16
17     /**
18      * 串行化方法
19      * @throws Exception
20      */
21     private static void serialize() throws Exception {
22         // 一个对象
23         Integer i = new Integer(100);
24         FileOutputStream fos = new FileOutputStream("h:/a.data");
25
26
27         // 通过文件输出流构造对象输出流
28         ObjectOutputStream oos = new ObjectOutputStream(fos);
29         oos.writeObject(i);
30
31         //关闭流
32
33         oos.close();
34         //fos.close();
35         System.out.println("over");
36     }
37
38     /**
39      * 反串行化方法
40      * @throws Exception
41      */
42     private static void deSerialize() throws Exception {
43         ObjectInputStream ois = new ObjectInputStream(new FileInputStream("h:/a.data"));
44         Integer i = (Integer) ois.readObject();
45         ois.close();
46
47         System.out.println(i);
48     }
49
50     /**
51      * 串行化javabean方法
52      * @throws Exception
53      */
54     @Test
55     private static void serializePerson() throws Exception {
56         Person p = new Person("tom", 21);
57         FileOutputStream fos = new FileOutputStream("h:/p.data");
58         ObjectOutputStream oos = new ObjectOutputStream(fos);
59         oos.writeObject(p);
60         oos.close();
61         //fos.close();
62         System.out.println("over");
63     }
64
65     /**
66      * 反串行化javabean方法
67      * @throws Exception
68      */
69     private static void deSerializePerson() throws Exception {
70         ObjectInputStream ois = new ObjectInputStream(new FileInputStream("h:/p.data"));
71         Person p = (Person) ois.readObject();
72         ois.close();
73
74         System.out.println(p.getName());
75     }
76 }
 1 import java.io.Serializable;
 2 // 实现对象串行化接口
 3 public class Person implements Serializable{
 4     private static final long serialVersionUID = -5854465328288308968L;
 5     private String name;
 6     private int age;
 7     public Person() {
 8
 9     }
10     public Person(String name, int age) {
11         this.name = name;
12         this.age = age;
13     }
14     public String getName() {
15         return name;
16     }
17     public void setName(String name) {
18         this.name = name;
19     }
20     public int getAge() {
21         return age;
22     }
23     public void setAge(int age) {
24         this.age = age;
25     }
26
27 }

串行化(序列化)

将java对象转换成某种格式(JVM定义的)的字节数组

反串行化(序列化)

将字节数组恢复成java对象

java.io.Serializable

可串行接口  标志性接口

串行化应用场景

将对象用于网络间传输或本地化存储

深度复制

  1 import java.io.FileInputStream;
  2 import java.io.FileOutputStream;
  3 import java.io.ObjectInputStream;
  4 import java.io.ObjectOutputStream;
  5 import java.io.Serializable;
  6
  7 import org.junit.Test;
  8
  9 /**
 10  * 深度复制
 11  * @author zhengguohuang
 12  *
 13  */
 14 public class DeepCopyDemo {
 15     /**
 16      * 串行化过程
 17      * @throws Exception
 18      */
 19     @Test
 20     public void seria() throws Exception {
 21         Person p = new Person();
 22         Son s = new Son();
 23         Dog d = new Dog();
 24         //设置关联关系
 25         s.setPerson(p);
 26         d.setPerson(p);
 27         d.setSon(s);
 28         //串行化
 29         ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("h://kkk.data"));
 30         oos.writeObject(d);
 31         oos.close();
 32     }
 33
 34     /**
 35      * 反串行化过程
 36      * @throws Exception
 37      */
 38     @Test
 39     public void deSeria() throws Exception {
 40         ObjectInputStream ois = new ObjectInputStream(new FileInputStream("h:/kkk.data"));
 41         Dog d = (Dog) ois.readObject();
 42         ois.close();
 43         //System.out.println("son link:" + d.getSon().getPerson().getName());//NullPointException
 44         System.out.println("dog link:" + d.getPerson().getName());
 45     }
 46 }
 47
 48 class Person implements Serializable{
 49
 50     /**
 51      *
 52      */
 53     private static final long serialVersionUID = -149817064278073579L;
 54     private String name = "pName...";
 55
 56     public String getName() {
 57         return name;
 58     }
 59
 60     public void setName(String name) {
 61         this.name = name;
 62     }
 63
 64 }
 65
 66 class Son implements Serializable{
 67     /**
 68      *
 69      */
 70     private static final long serialVersionUID = -2553176111008776359L;
 71     // transient:临时的,穿行化链中断
 72     private transient Person person;
 73     private String name = "dogkkk";
 74
 75     public Person getPerson() {
 76         return person;
 77     }
 78     public void setPerson(Person person) {
 79         this.person = person;
 80     }
 81     public String getName() {
 82         return name;
 83     }
 84     public void setName(String name) {
 85         this.name = name;
 86     }
 87
 88 }
 89
 90 class Dog implements Serializable{
 91     /**
 92      *
 93      */
 94     private static final long serialVersionUID = -4168869841460181681L;
 95     private Son son;
 96     private String name;
 97     private Person person;
 98     public Son getSon() {
 99         return son;
100     }
101     public void setSon(Son son) {
102         this.son = son;
103     }
104     public String getName() {
105         return name;
106     }
107     public void setName(String name) {
108         this.name = name;
109     }
110     public Person getPerson() {
111         return person;
112     }
113     public void setPerson(Person person) {
114         this.person = person;
115     }
116
117 }

反序列化对象时,是否经过构造函数,为什么
没有必要
成员变量中存储数据,成员函数只是行为,对象存在于堆区(对象的成员变量),串行化时抓取整个对象的状态,然后写到文件中去,反串行化时把属性值放在对应的位置,开辟空间放上对应值,不需要调用任何过程

ByteArrayInputStream&ByteArrayOutputStream


字节数组输入输出流,串行化到内存中

 1 /**
 2      * 使用ByteArrayInputStream + ByteArrayOutputStream实现对象图的复制
 3      * @throws Exception
 4      */
 5     public static void deeplyCopyInBAOS() throws Exception {
 6         Person p = new Person();
 7         Son s = new Son();
 8         Dog d = new Dog();
 9         // 设置关联关系
10         s.setPerson(p);
11         d.setSon(s);
12         d.setPerson(p);
13         // 串行化
14         ByteArrayOutputStream baos = new ByteArrayOutputStream();
15         ObjectOutputStream oos = new ObjectOutputStream(baos);
16         oos.writeObject(d);
17         oos.close();
18         baos.close();
19
20         //
21         byte[] byteArray = baos.toByteArray();
22
23         // 反串行化
24         ByteArrayInputStream bais = new ByteArrayInputStream(byteArray);
25         ObjectInputStream ois = new ObjectInputStream(bais);
26         Dog d1 = (Dog) ois.readObject();
27         ois.close();
28         bais.close();
29         System.out.println("dog link:" + d1.getPerson().getName());
30     }

DataInputStream&DataOutputStream

 1 import java.io.ByteArrayInputStream;
 2 import java.io.ByteArrayOutputStream;
 3 import java.io.DataInputStream;
 4 import java.io.DataOutputStream;
 5
 6 import org.junit.Test;
 7
 8 public class DataIOStreamDemo {
 9
10     /**
11      * DataArrayOutputStream
12      * @throws Exception
13      */
14     @Test
15     public void write() throws Exception{
16         ByteArrayOutputStream baos = new ByteArrayOutputStream();
17         DataOutputStream dos = new DataOutputStream(baos);
18         dos.writeByte(-1);            //1
19         dos.writeShort(5);            //2
20         dos.writeInt(10);            //4
21         dos.writeLong(12L);            //8
22         dos.writeFloat(0.5f);        //4
23         dos.writeDouble(0.6);        //8
24         dos.writeChar(‘a‘);            //2
25         dos.writeBoolean(true);        //1
26         dos.close();
27         baos.close();
28         byte[] bytes = baos.toByteArray();
29         System.out.println(bytes.length);
30
31         //反序列化
32         ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
33         DataInputStream dis = new DataInputStream(bais);
34         System.out.println(dis.readByte());
35         System.out.println(dis.readShort());
36         dis.close();
37         bais.close();
38     }
39 }
  • Reader
  • writer
  • BufferedReader
  • BufferedWriter
  • LineNumberReader
  • InputStream
  • FileInputStream
  • ByteArrayInputStream
  • ObjectInputStream
  • DataInputStream
  • FilterInputStream
  • OutputStreamWriter
时间: 2024-12-22 15:48:40

java15的相关文章

从头认识java-15.2 Collection的常用方法

这一章节我们来介绍一下Collection的常用方法. 我们下面以ArrayList为例. package com.ray.ch14; import java.util.ArrayList; import java.util.Iterator; public class Test { public static void main(String[] args) { ArrayList<Integer> rtnList = new ArrayList<Integer>(); rtnL

从头认识java-15.7 Map(4)-介绍HashMap的工作原理-hash碰撞(经常作为面试题)

这一章节我们来讨论一下hash碰撞. 1.什么是hash碰撞? 就是两个对象的key的hashcode是一样的,这个时候怎么get他的value呢? 答案是通过equals遍历table那个位置上面的Entry链表. 2.例子 正常的例子: package com.ray.ch14; import java.util.HashMap; public class Test { public static void main(String[] args) { HashMap<Person, Dog>

从头认识java-15.7 Map(2)-介绍HashMap的工作原理-put方法

这一章节我们来介绍HashMap的工作原理. 1.HashMap的工作原理图 下图引用自:http://www.admin10000.com/document/3322.html 2.HashMap初始化的时候我们可以这样理解:一个数组,每一个位置存储的是一个链表,链表里面的每一个元素才是我们记录的元素 3.下面我们来看put的源码: public V put(K key, V value) { if (key == null) return putForNullKey(value); int

从头认识java-15.7 Map(3)-介绍HashMap的工作原理-get方法

接着上一章节,我们来讨论一下get方法. 1.还是利用上一章节的图 下图引用自:http://www.admin10000.com/document/3322.html 我们简单说一下步骤,就是通过hashcode先找到table上面的位置,然后遍历位置上的链表 2.get方法的源码: public V get(Object key) { if (key == null) return getForNullKey(); int hash = hash(key.hashCode()); for (

java15:面向对象

类             对象 class         object(按照 英文就是东西,但是专家说是对象 so 我们就学对象) 类 class 就是 类型 因为 对象  object  ==> 东西 啥都是东西 ==> 啥都是对象 <== 专家的说法  一切皆对象 是结构化数据 类是对象的分类 类是对象的数据结构定义==> 对象有什么数据由类定义 创建对象,需要有类型, 用类型创建对象 类是对象的结构模板 对象创建后,成员变量可以按照默认的方式初始化 数值类型     0

从头认识java-15.6 队列(Queue)

这一章节我们来讨论一下队列(Queue). 1.什么是队列? 队列是一种特殊的线性表,特殊之处在于它仅仅同意在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样.队列是一种操作受限制的线性表. 2.特性 (1)元素是有序的 (2)元素是先进先出 3.java里面的实现类:Linkedlist和PriorityQueue,两者之间性能不存在区别,区别的地方是排序的行为. package com.ray.ch14; import java.util.LinkedLis

java15.集合

数组和集合的区别: 区别1:数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值:集合只能存储引用数据类型(对象)集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象 区别2:数组长度是固定的,不能自动增长:集合的长度的是可变的,可以根据元素的增加而增长适用环境:如果元素个数是固定的推荐用数组,如果元素个数不是固定的推荐用集合集合的遍历:1.把集合转成数组,可以实现集合的遍历,用toArray()注意需要向下转型!:2.迭代器 :It

从头认识java-15.7 Map(7)-TreeMap与LinkedHashMap

这一章节我们来讨论一下Map两个比较常用的实现:TreeMap与LinkedHashMap. 1.TreeMap 特性:按照key来排序 package com.ray.ch14; import java.util.Comparator; import java.util.TreeMap; public class Test { public static void main(String[] args) { TreeMap<Integer, String> map = new TreeMap

从头认识java-15.3 使用HashSet需要注意的地方

这一章节我们来讨论一下使用Set的各种实现需要注意的地方. Set接口的常用实现类有:HashSet,TreeSet,LinkedHashSet 1.HashSet 大家对于HashSet的印象都是它可以去除重复的元素,每一个元素都是唯一的,但是这里面有一个前提,就是必须重写equals和hashcode方法. 大家的印象大都是下面这个: package com.ray.ch15; import java.util.HashSet; public class Test { public stat