美文网首页java
堆,栈内存分析

堆,栈内存分析

作者: _narcissus | 来源:发表于2018-12-05 22:00 被阅读13次
    • 这是一个数据流,将李白这个对象写入到文件中。
    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();
        }
      

    然后是读文件操作

    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();
                }
            }
        }
    }
    
    

    相关文章

      网友评论

        本文标题:堆,栈内存分析

        本文链接:https://www.haomeiwen.com/subject/iohgcqtx.html