30 IO流再回顾,深入理解序列化和反序列化

简介: IO流再回顾,深入理解序列化和反序列化

8.png

1 InputStream

10.png

代码示例:

public class FileInputStreamDemo {
    public static void main(String[] args) throws Exception {
//        定义文件路径
        String str = "E:\\Codes\\myProject\\fileInputStreamTest.txt";
//        创建FileInputStream对象
        FileInputStream fileInputStream = new FileInputStream(str);
//        创建一个8个字节的缓冲空间
        byte buffer [] = new byte[8];
        int length = 0;
        while ((length = fileInputStream.read(buffer)) != -1){
            System.out.println(new String(buffer,0,length));
        }
    }
}


2 OutputStream

代码示例:

此种方式数据写入文件,是覆盖源文件;
public class FileOutputSteamDemo {
    public static void main(String[] args) throws IOException {
        String str = "E:\\Codes\\myProject\\fileInputStreamTest.txt";
        OutputStream outputStream = new FileOutputStream(str);
        byte [] buffer = "gym.IverryverryLoveyou".getBytes();
        try {
            outputStream.write(buffer);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            outputStream.close();
        }
        System.out.println("完成写入");
    }
}

如果想实现数据写入文件,追加而不是覆盖则可以采用以下构造器:

public FileOutputStream( filesrc, boolean append)

参数append为true时则,追加数据,不覆盖,


3 文件拷贝(字节流)


拷贝代码示例

public class IOCopyDemo {
    public static void main(String[] args) throws IOException {
        String str = "E:\\Codes\\myProject\\copyTest.txt";
        String str2 = "E:\\Codes\\myProject\\coptTest2.txt";
//        创建输入流对象
        FileInputStream fileInputStreamDemo = new FileInputStream(str);
//        创建输出流对象
        FileOutputStream fileOutputStream = new FileOutputStream(str2);
//        创建缓冲
        byte buffer [] = new byte[8];
        int leng = 0;
//        用循环实现拷贝
        try {
            while ((leng = fileInputStreamDemo.read(buffer))!=-1){
                fileOutputStream.write(buffer,0,leng);
            }
        } finally {
            if (fileOutputStream != null || fileInputStreamDemo != null){
                fileInputStreamDemo.close();
                fileOutputStream.close();
            }
        }
        System.out.println("拷贝完成");
    }
}


4 FileReader、 FileWriter


12.png

FileWriter同样有两种模式,覆盖模式,和追加模式;

覆盖模式;使用以下构造器

public FileWriter( fileName)

使用下面构造器append 设置为true是是追加模式;

public FileWriter( fileName, boolean append)

注意事项:FileWriter使用之后必须关闭(close)或者刷新(flush),否则写不到文件中;


5 文件拷贝(字符流)


public class CopyDemo2 {
    public static void main(String[] args) throws FileNotFoundException {
        String  str = "E:\\Codes\\myProject\\fileWriter.txt";
        String str2 = "E:\\Codes\\myProject\\fileCopy.txt";
//        创建字符输入流
        FileReader fileReader = new FileReader(str);
        char [] array = new char[10];
        int leng=0;
//        创建字符输出流
        try {
            FileWriter fileWriter = new FileWriter(str2);
            while ((leng = fileReader.read(array)) !=-1){
                String s =new String(array,0,leng);
                fileWriter.write(s);
//                刷新字符输出流
                fileWriter.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
        }
    }
}


6 节点流和处理流


节点流是针对某个特定的数据源读写,如FileWriter、FileReader;处理流也叫包装流,连接已存在的流,为程序提供更强大的功能如BufferWriter、BufferReader;


7 ObjectOutputSteam和ObjectInputStream—序列化和反序列化


此处理流(包装流),提供了对基本类型或者对象类型的序列化和反序列化的方法;

ObjectOutputStream:提供了序列化的方法

ObjectInputStream:提供了反序列化的方法

序列化: 就是将数据与数据类型都保存起来,叫序列化;

反序列化:指将序列化的数据恢复到原来;

注意:如果想让某个对象支持序列化,则必须让其类是可序列化的,也就是必须让类实现两个接口:

Sarializable:标记接口,没有方法(推荐使用)

Externalizable:该接口有方法需要实现

序列化代码示例:

public class SerializableDemo {
    public static void main(String[] args) throws IOException {
//        创建被序列化对象
        Person xiaoM = new Person("小明",18);
//        创建文件路径
        String str = "E:\\Codes\\myProject\\ObjectOut.dat";
//        创建处理流对象
        ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(str));
        outputStream.writeObject(xiaoM);
        outputStream.close();
        System.out.println("序列化完成");
    }
}
class Person implements Serializable {
    private String name;
    private int age;
    public Person() {
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }
    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }
    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }
    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }
    public String toString() {
        return "Person{name = " + name + ", age = " + age + "}";
    }
}

反序列化代码示例:

public class ReSerializableDmeo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
//        定义变量接收,反序列化数据
        Person person = null;
        //        创建文件路径
        String str = "E:\\Codes\\myProject\\ObjectOut.dat";
//        创建ObjectInputStream对象
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(str));
        person = (Person) objectInputStream.readObject();
        objectInputStream.close();
        System.out.println("反序列化完成!");
        System.out.println("姓名:"+person.getName()+"  年龄:"+person.getAge());
    }
}

序列化过程中需要注意的事项:

(1):读写顺序要一致

(2):要实现序列化的的对象,类必须实现Serializable接口

(3):序列化类中建议添加 SerialVersionUID,可以提高版本兼容性

(4):序列化时会默认将里面所有属性都序列化了,但是被static和transient修饰的属性不会被序列化;

(5):序列化时要求里面属性的类型也需要实现序列化接口

(6):序列化具有可继承性


8 转换流


InputStreamReader和OutputStreamWriter

代码示例:

public class InputStreamReaderDemo {
    public static void main(String[] args) throws IOException {
        String str = "E:\\Codes\\myProject\\fileWriter.txt";
        InputStreamReader inputStreamReader = new InputStreamReader(new  FileInputStream(str),"gbk");
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        String s = null;
        while ((s = bufferedReader.readLine()) != null){
            System.out.println(s);
            bufferedReader.lines();
        }
        inputStreamReader.close();
        bufferedReader.close();
    }
}



目录
相关文章
|
3月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
1天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
12天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
2月前
|
存储 Java
序列化流 ObjectInputStream 和 ObjectOutputStream 的基本使用【 File类+IO流知识回顾④】
这篇文章介绍了Java中ObjectInputStream和ObjectOutputStream类的基本使用,这两个类用于实现对象的序列化和反序列化。文章解释了序列化的概念、如何通过实现Serializable接口来实现序列化,以及如何使用transient关键字标记不需要序列化的属性。接着,通过示例代码演示了如何使用ObjectOutputStream进行对象的序列化和ObjectInputStream进行反序列化。
序列化流 ObjectInputStream 和 ObjectOutputStream 的基本使用【 File类+IO流知识回顾④】
|
25天前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第3天】在Java编程的世界里,对象序列化与反序列化是实现数据持久化和网络传输的关键技术。本文将深入探讨Java序列化的原理、应用场景以及如何通过代码示例实现对象的序列化与反序列化过程。从基础概念到实践操作,我们将一步步揭示这一技术的魅力所在。
|
11天前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
8 0
|
2月前
|
存储 XML JSON
用示例说明序列化和反序列化
用示例说明序列化和反序列化
|
2月前
|
JSON fastjson Java
niubility!即使JavaBean没有默认无参构造器,fastjson也可以反序列化。- - - - 阿里Fastjson反序列化源码分析
本文详细分析了 Fastjson 反序列化对象的源码(版本 fastjson-1.2.60),揭示了即使 JavaBean 沲有默认无参构造器,Fastjson 仍能正常反序列化的技术内幕。文章通过案例展示了 Fastjson 在不同构造器情况下的行为,并深入探讨了 `ParserConfig#getDeserializer` 方法的核心逻辑。此外,还介绍了 ASM 字节码技术的应用及其在反序列化过程中的角色。
67 10
|
2月前
|
存储 Java 开发者
Java编程中的对象序列化与反序列化
【9月更文挑战第20天】在本文中,我们将探索Java编程中的一个核心概念——对象序列化与反序列化。通过简单易懂的语言和直观的代码示例,你将学会如何将对象状态保存为字节流,以及如何从字节流恢复对象状态。这不仅有助于理解Java中的I/O机制,还能提升你的数据持久化能力。准备好让你的Java技能更上一层楼了吗?让我们开始吧!