堆,栈内存分析
这是一个数据流,将李白这个对象写入到文件中。
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
37package 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 | package fileOperatiion.fileSerializable; |