Java中输入输出(续篇)

Posted nuist__NJUPT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中输入输出(续篇)相关的知识,希望对你有一定的参考价值。

Java中输入输出(续篇)

/** * 对象的寿命通常随着创建对象程序的终止而终止,有时候可能需要将对象的状态保存下来

  • 在需要时候将其恢复,对象状态的保存和恢复可以通过对象的I/O流来实现
  • 将程序中的对象输出到外部设备,称为对象序列化,从外部设备将对象读入程序称为对象反序列化
  • ObjectOutputStream类和ObjectOutputStream类,分别称为对象的输入输出流
  • 分别实现将对象写到外部设备和从外部设备上读取对象

import java.io.Serializable;

public class Customer implements Serializable { //实现序列化接口
    public int id ; //客户号
    public String name ; //姓名
    public String address ; //地址
    public Customer(int id, String name, String address){
        this.id = id ;
        this.name = name ;
        this.address = address ;
    }
}
  • 实现将Customer类的序列化和反序列化
  • 注意:序列化对象只能保存对象的非static成员,不能保存任何成员方法和static成员变量,
  • 而且序列化保存的只是变量的值
  • 用transient变量修饰的变量为临时变量,也不能被序列化
  • 对于成员变量为引用类型时,引用的对象也被序列化
import java.io.*;
import java.time.LocalDate;
public class ObjectSerializeDemo {
    public static void main(String[] args){
        Customer customer = new Customer(101,"王国栋", "南京市高淳区");//构造方法创建customer对象
        LocalDate today = LocalDate.now() ; //当前的日期
        //序列化
        try(
                OutputStream output = new FileOutputStream("D:\\\\study\\\\customer.txt");
                ObjectOutputStream oos = new ObjectOutputStream(output);){
            oos.writeObject(customer) ; //写入一个客户对象
            oos.writeObject(today) ; //写入日期对象
        }catch(IOException e){
            System.out.println(e.toString()) ;
        }
        //反序列化
        try(InputStream input = new FileInputStream("D:\\\\study\\\\customer.txt") ;
            ObjectInputStream ois = new ObjectInputStream(input) ;){
            while(true){
                try{
                    customer = (Customer)ois.readObject() ;
                    System.out.println("客户号:" + customer.id) ;
                    System.out.println("姓名:" + customer.name) ;
                    System.out.println("地址:" + customer.address) ;
                    today = (LocalDate)ois.readObject() ;
                    System.out.println("日期:" + today) ;
                }catch(EOFException e){
                    break ;
                }
            }
        }catch(IOException | ClassNotFoundException e){
            System.out.println(e.getMessage()) ;
        }
    }
}
  • 如果数组中的所有元素都是可序列化的,这个数组就是可序列化的
  • 一个完整的数组可以用writeObject()方法写入文件,之后用readObject()方法读取到程序中
import java.io.*;
public class ArraySerialDemo {
    public static void main(String[] args){
            int [] numbers = {1,2,3,4,5} ;
            String [] cities = {"北京","上海","广州"} ;
            //序列化
         try(FileOutputStream output = new FileOutputStream("array.dat",true);
             ObjectOutputStream oos = new ObjectOutputStream(output) ;){
             oos.writeObject(numbers) ; //将numbers数组写入文件
             oos.writeObject(cities) ; //将cities数组写入文件
         }catch(IOException e){
             System.out.println(e.toString()) ;
         }
         //反序列化
        try(FileInputStream input = new FileInputStream("array.dat");
            ObjectInputStream ois = new ObjectInputStream(input);){
            int [] newNumbers = (int [])ois.readObject() ;
            String [] newString = (String [])ois.readObject() ;
            for(int n : newNumbers){
                System.out.print(n + " ") ;
            }
            System.out.println() ;
            for(String s : newString){
                System.out.print(s + " ") ;
            }
        }catch(IOException | ClassNotFoundException e){
            System.out.println(e.getMessage()) ;
        }
    }
}
  • Files类是一个功能非常强大的类,该类定义了大量的静态方法来读、写和操纵文件与目录
  • Files类提供了文件和目录的创建删除以及属性的相关操作
import java.io.IOException;
import java.nio.file.*;
public class FileDemo {
    public static void main(String[] args){
        //声明一个路径和一个文件对象
        Path path = Paths.get("D:\\\\study") ;
        Path file = Paths.get("D:\\\\study\\\\customer.txt") ;
        try{
            if(!Files.exists(path)){
                path = Files.createDirectory(path) ; //创建路径
            }
            if(!Files.exists(file)){
                file = Files.createFile(file) ; //创建文件
                System.out.println(Files.isWritable(file))  ;//文件是否可写
                System.out.println(Files.isExecutable(file))  ; //文件是否可执行
                System.out.println(Files.size(file)) ; //文件的字节大小
                System.out.println(Files.isHidden(file)) ; //是否可隐藏
                System.out.println(Files.getLastModifiedTime(file)) ; //最后一次被修改的时间
            }
        }catch(IOException e){
            System.out.println(e.getMessage()) ;
        }
        System.out.println(Files.exists(file)) ; //输出文件是否存在
        System.out.println(Files.isReadable(file)) ; //输出文件是否可读
        try{
            Files.delete(file) ; //删除文件
            Files.delete(path) ; //删除目录
        }catch(IOException e){
            System.out.println(e.toString()) ;
        }
    }
}

以上是关于Java中输入输出(续篇)的主要内容,如果未能解决你的问题,请参考以下文章

java缓冲字符字节输入输出流:java.io.BufferedReaderjava.io.BufferedWriterjava.io.BufferedInputStreamjava.io.(代码片段

Java中继承与多态(续篇)

WiFi定位劫持·续篇——GPS劫持

(转) Java中的负数及基本类型的转型详解

java代码在片段活动中不起作用

java入门:用jdbc实现宠物商店管理系统续篇