堆,栈内存分析

  • 这是一个数据流,将李白这个对象写入到文件中。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    package fileOperatiion.fileSerializable;

    import java.io.*;

    public class WriteWithSerialize {
    public static void main(String[] args) {
    StudenInfo stu=new StudenInfo();
    stu.setName("李白");
    stu.setAge(18);
    stu.setGender("男");

    File file=new File("/home/narcissus/Desktop/studentinfo");

    FileOutputStream fs= null;
    ObjectOutputStream oos=null;
    try {
    file.createNewFile();
    fs = new FileOutputStream(file);
    oos= new ObjectOutputStream(fs);
    oos.writeObject(stu);
    } catch (Exception e) {
    e.printStackTrace();
    }
    finally {
    try {
    if(oos!=null){
    oos.close();
    }
    if(fs!=null){
    oos.close();
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
    }

    整个抄写下来也是懵的,不知道是啥意思,为什么是这样写的。然后也是找了许多资料才明白了一丢丢:)
    看下图:
    内存分析

  • 内存分析是很重要的。

    StudenInfo stu = new StudenInfo();

    这句话做了啥呢?三件事

    • 1变量stu前面的不仅仅可以放数据类型(int ,string等),还可以放类,对象等。其实是在栈中声明了一个局部变量,这个变量是对前面的引用。比如这里就是定义了一个stu的变量,这个变量是对StudenInfo类的引用。

    • 2 new StudenInfo 在堆中创建了一个StudentInfo类的对象。

    • 3 将创建的对象地址给到变量stu。

      然后下面的这段也就不那么难理解了,只不过是把这些拆开了写,目的是什么呢?因为作用域的关系,为了后面写close()方法,所以只能把初始化变量和实例化对象分开写。

      FileOutputStream fs= null; //变量fs对类的引用,并赋初值。
      ObjectOutputStream oos=null;
      try {
          file.createNewFile();
          fs = new FileOutputStream(file);  //实例化对象,并将地址给到变量fs
          oos= new ObjectOutputStream(fs);
          oos.writeObject(stu);  //oos的地址是对象ObjeOutpuStream,这里调用对象的writeObject()方法。
      } catch (Exception e) {
          e.printStackTrace();
      }

然后是读文件操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package fileOperatiion.fileSerializable;

import java.io.File;
import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class ReadWithSerialize {
public static void main(String[] args){
File file =new File("/home/narcissus/Desktop/studentinfo");
FileInputStream fis=null;
ObjectInputStream ois=null;
try{
fis = new FileInputStream(file);
ois = new ObjectInputStream(fis);
//怎么读一个Object?
StudenInfo stu=(StudenInfo)ois.readObject();
System.out.println(stu.getName()+stu.getAge()+stu.getGender());

}catch(Exception e){
e.printStackTrace();
}
finally {
try {
if(oos!=null){
oos.close();
}
if(fs!=null){
oos.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}