io流文件拷贝及序列化对象和反序列化

1.文件拷贝

方式一:字节缓冲流文件拷贝(一般用于拷贝图片,视频, 音频等二进制文件, 文本也可以拷贝但是一般用字符流)

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Test06Buffered {
    public static void main(String[] args) {
        String sourcePath =  "d:/Test.jpg";  //源文件路径 要已经存在 否则会报错
        String targetPath = "d:/Test01.jpg"; //目标文件路径 不需要已经存在 启动程序会自动创建
        copyFile(sourcePath, targetPath);
    }
    public static void  copyFile(String sourcePath, String targetPath){
        FileInputStream fis = null;          // 字节输入流
        FileOutputStream fos = null;        // 字节输出流
        BufferedInputStream bis = null;     //包装流
        BufferedOutputStream bos = null;    //包装流
        try{
            fis = new FileInputStream(sourcePath);
            bis = new BufferedInputStream(fis);
            fos = new FileOutputStream(targetPath);
            bos = new BufferedOutputStream(fos);
            byte[] buff = new byte[1024];
            int temp = 0;
            while((temp = bis.read(buff))!= -1){//从输入缓冲流去读取文件数据
                bos.write(buff, 0, temp);  // 将输出缓冲流中数据写入文件中
            }
            bos.flush(); //将数据从内存中写入到磁盘中
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                //注意:关闭流顺序:"后开的先关闭"
                if(bos != null){
                    bos.close();
                }
                if(bis != null){
                    bis.close();
                }
                if(fos !=null){
                    fos.close();
                }
                if(fis != null){
                    fis.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}

方式二:字符缓冲流文件拷贝(主要用于文本文件拷贝)

import java.io.*;

public class Test08CopyChar {
    public static void main(String[] args) {
        String src = "d:/a.txt"; //源文件路径 要已经存在 否则会报错
        String des = "d:/b.txt"; //目标文件路径 不需要已经存在 启动程序会自动创建
        copyFile(src, des); // 不加行号
    }
    //不加行号拷贝文件
    public static void copyFile(String src,String des){
        BufferedReader br = null;
        BufferedWriter bw = null;
        try{
            br = new BufferedReader(new FileReader(src));
            bw = new BufferedWriter(new FileWriter(des));
            String temp = "";
            while((temp = br.readLine()) != null){
                bw.write(temp);
                bw.newLine();
            }
            bw.flush();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try{
                if(br != null){
                    br.close();
                }
                if(bw != null){
                    bw.close();
                }
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
    // 添加行号拷贝文件
    public static void copyFileAddLine(String src,String des){
        BufferedReader br = null;
        BufferedWriter bw = null;
        try{
            br = new BufferedReader(new FileReader(src));
            bw = new BufferedWriter(new FileWriter(des));
            String temp = "";
            int i = 1;
            while((temp = br.readLine()) != null){
                bw.write(i+":"+temp);
                bw.newLine();
                i++;
            }
            bw.flush();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try{
                if(br != null){
                    br.close();
                }
                if(bw != null){
                    bw.close();
                }
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
}

2.序列化对象:

介绍

当两个进程远程通信时,彼此可以发送各种类型的数据。 无论是何种类型的数据,都
会以二进制序列的形式在网络上传送。比如,我们可以通过 http 协议发送字符串信息;我
们也可以在网络上直接发送 Java 对象。发送方需要把这个 Java 对象转换为字节序列,才能
在网络上传送;接收方则需要把字节序列再恢复为 Java 对象才能正常读取。

使用的方法

利用对象流和字节流

2.1序列化(输出流): (程序)对象------------>文件

把 Java 对象转换为字节序列的过程称为对象的序列化。

核心代码:
oos = new ObjectOutputStream(new FileOutputStream(desPath)); //使用对象输出流创建文件
oos.writeObject(object); //将对象写入文件中

2.2反序列化(输入流): 文件------------>对象(程序)

把字节序列恢复为 Java 对象的过程称为对象的反序列化。

核心代码:
 ois = new ObjectInputStream(new FileInputStream(desPath)); //使用对象输入流从文件中获取文件数据
 Object object = ois.readObject(); //获取对象

以序列化对象User为例子

import java.io.*;

class User implements Serializable{
    private int userId;
    private String userName;
    private int userAge;

    public User(int userId, String userName, int userAge) {
        this.userId = userId;
        this.userName = userName;
        this.userAge = userAge;
    }
    public User(){}

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getUserAge() {
        return userAge;
    }

    public void setUserAge(int userAge) {
        this.userAge = userAge;
    }

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", userName='" + userName + '\'' +
                ", userAge=" + userAge +
                '}';
    }
}

// 序列化和反序列化
public class Test12Serializable {
    public static void main(String[] args) {
        String desPath = "d:/data.txt";  //序列化之后文件的存放地址 可根据需求自行更改 这里是绝对路径 window操作系统
        User user = new User(1, "jordan", 50);
        boolean flag =  serializationObject(user, desPath);
        System.out.println("是否序列化成功: "+flag);

        Object object = Deserialization(desPath);
        User u = (User) object;
        //尝试获取对象的一些属性 用于测试
        System.out.println(u.toString());
        System.out.println(u.getUserAge());
    }

    //序列化方法 将对象存入到文件中 对象-----> 文件
    public static boolean serializationObject(Object object, String desPath){
        ObjectOutputStream oos = null;
        try{
            oos = new ObjectOutputStream(new FileOutputStream(desPath)); //使用对象输出流创建文件
            oos.writeObject(object); //将对象写入文件中
            oos.flush(); //将数据从内存中写入到磁盘中
            return true;
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }finally {
            try {
                if(oos != null){
                    oos.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    //反序列化方法 从文件中读取对象  文件------>对象
    public static Object Deserialization(String desPath){
        ObjectInputStream ois = null;
        try{
            ois = new ObjectInputStream(new FileInputStream(desPath)); //使用对象输入流从文件中获取文件数据
            Object object = ois.readObject(); //获取对象
            return object;
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }finally {
            try {
                if(ois != null){
                    ois.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}

io流详细笔记:链接:https://pan.baidu.com/s/1_2qLob8B7xx_AYSGE1O_Jg
提取码:2022

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#的序列化反序列化是将对象转换为二进制数据或将二进制数据转换为对象的过程。在C#中,可以使用BinaryFormatter、XmlSerializer、DataContractSerializer等多种方式进行序列化反序列化。 深拷贝和浅拷贝用于复制对象。浅拷贝只复制对象的引用,而不会复制对象的实际内容。深拷贝则会完全复制对象的内容,包括引用类型的成员变量。 在C#中,可以通过实现ICloneable接口来实现浅拷贝。对于深拷贝,则需要自己手动实现一个递归复制对象的方法。 下面是一个示例代码,演示了如何进行序列化反序列化以及深拷贝和浅拷贝: ```csharp using System; using System.IO; using System.Runtime.Serialization.Formatters.Binary; using System.Xml.Serialization; [Serializable] public class Person : ICloneable { public string Name { get; set; } public int Age { get; set; } public Address Address { get; set; } public object Clone() { return new Person { Name = Name, Age = Age, Address = (Address)Address?.Clone() }; } } [Serializable] public class Address : ICloneable { public string City { get; set; } public string Street { get; set; } public object Clone() { return new Address { City = City, Street = Street }; } } public static class SerializationHelper { public static byte[] SerializeToBinary(object obj) { using (var ms = new MemoryStream()) { var formatter = new BinaryFormatter(); formatter.Serialize(ms, obj); return ms.ToArray(); } } public static T DeserializeFromBinary<T>(byte[] data) { using (var ms = new MemoryStream(data)) { var formatter = new BinaryFormatter(); return (T)formatter.Deserialize(ms); } } public static string SerializeToXml(object obj) { using (var writer = new StringWriter()) { var serializer = new XmlSerializer(obj.GetType()); serializer.Serialize(writer, obj); return writer.ToString(); } } public static T DeserializeFromXml<T>(string xml) { using (var reader = new StringReader(xml)) { var serializer = new XmlSerializer(typeof(T)); return (T)serializer.Deserialize(reader); } } } public static class ObjectHelper { public static T ShallowCopy<T>(this T obj) { return (T)obj.MemberwiseClone(); } public static T DeepCopy<T>(this T obj) { using (var ms = new MemoryStream()) { var formatter = new BinaryFormatter(); formatter.Serialize(ms, obj); ms.Position = 0; return (T)formatter.Deserialize(ms); } } } // 示例代码 var person1 = new Person { Name = "Tom", Age = 30, Address = new Address { City = "Beijing", Street = "Chang'an Avenue" } }; // 深拷贝 var person2 = person1.DeepCopy(); person2.Name = "Jerry"; person2.Address.City = "Shanghai"; Console.WriteLine($"person1.Name={person1.Name}, person1.Address.City={person1.Address.City}"); Console.WriteLine($"person2.Name={person2.Name}, person2.Address.City={person2.Address.City}"); // 浅拷贝 var person3 = person1.ShallowCopy(); person3.Name = "John"; person3.Address.City = "Guangzhou"; Console.WriteLine($"person1.Name={person1.Name}, person1.Address.City={person1.Address.City}"); Console.WriteLine($"person3.Name={person3.Name}, person3.Address.City={person3.Address.City}"); // 序列化反序列化 var data = SerializationHelper.SerializeToBinary(person1); var person4 = SerializationHelper.DeserializeFromBinary<Person>(data); Console.WriteLine($"person1.Name={person1.Name}, person1.Address.City={person1.Address.City}"); Console.WriteLine($"person4.Name={person4.Name}, person4.Address.City={person4.Address.City}"); var xml = SerializationHelper.SerializeToXml(person1); var person5 = SerializationHelper.DeserializeFromXml<Person>(xml); Console.WriteLine($"person1.Name={person1.Name}, person1.Address.City={person1.Address.City}"); Console.WriteLine($"person5.Name={person5.Name}, person5.Address.City={person5.Address.City}"); ``` 输出结果: ``` person1.Name=Tom, person1.Address.City=Beijing person2.Name=Jerry, person2.Address.City=Shanghai person1.Name=Tom, person1.Address.City=Guangzhou person3.Name=John, person3.Address.City=Guangzhou person1.Name=Tom, person1.Address.City=Beijing person4.Name=Tom, person4.Address.City=Beijing person1.Name=Tom, person1.Address.City=Beijing person5.Name=Tom, person5.Address.City=Beijing ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值