Java中常见的IO流及其使用(3)

Person类

import java.io.Serializable; public class Person implements Serializable { private String name = ""; private int age = 0; public Person(String name, int age){ this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } }

測试代码

private static void testObjectInputOutputStream(){ try{ String fileName = "D:\\iWork\\file.tmp"; //将内存中的对象序列化到物理文件里 FileOutputStream fos = new FileOutputStream(fileName); ObjectOutputStream oos = new ObjectOutputStream(fos); String description = "下面是人员数组"; Person[] persons = new Person[]{ new Person("iSpring", 26), new Person("Mr.Sun", 27), new Person("Miss.Zhou", 27) }; oos.writeObject(description); oos.writeInt(persons.length); for(Person person : persons){ oos.writeObject(person); } oos.close(); //从物理文件里反序列化读取对象信息 FileInputStream fis = new FileInputStream(fileName); ObjectInputStream ois = new ObjectInputStream(fis); String str = (String)ois.readObject(); System.out.println(str); int personCount = ois.readInt(); for(int i = 0; i < personCount; i++){ Person person = (Person)ois.readObject(); StringBuilder sb = new StringBuilder(); sb.append("姓名: ").append(person.getName()).append(", 年龄: ").append(person.getAge()); System.out.println(sb); } }catch (FileNotFoundException e){ e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); }catch (ClassNotFoundException e){ e.printStackTrace(); } }

输出结果例如以下:

測试结果


Person实现了Serializable接口,须要注意的是,Serializable接口是一个标识接口,并不须要实现不论什么方法。我们首先通过ObjectOutputStream。将Person等数组信息序列化成流。然后通过调用writeObject等方法将其写入到FileOutputStream中,从而实现了将内存中的基本类型和对象序列化保存到硬盘的物理文件里。

然后通过FileInputStream读取文件,将文件的输入流传入到到ObjectInputStream的构造函数中。这样ObjectInputStream就能够通过运行相应的readXXX操作读取基本类型或对象。当运行readObject操作时。返回的是Object类型,须要强制转换为相应的实际类型。须要注意的是,ObjectInputStream运行readXXX操作的方法顺序须要与ObjectOutputStream运行writeXXX操作的方法顺序一致。否则就会读到错误的数据或抛出异常。比方一開始向FileOutputStream中运行writeFloat。而在FileInputStream中首先运行了readInt操作,不会报错,由于writeFloat写入了4个字节的数据。readInt读入了4个字节的数据,尽管能够将该Float转换为相应的int,可是事实上已经不是我们想要的数据了,所以要注意readXXX操作与writeXXX操作运行顺序的相应。

SequenceInputStream

SequenceInputStream 主要是将两个(或多个)InputStream在逻辑上合并为一个InputStream,比方在构造函数中传入两个InputStream。分别为in1和in2,那么SequenceInputStream在读取操作时会先读取in1,假设in1读取完成。就会接着读取in2。在我们理解了SequenceInputStream 的作用是将两个输入流合并为一个输入流之后,我们就能理解为什么不存在相应的SequenceOutputStream 类了。由于将一个输出流拆分为多个输出流是没有意义的。
下面是关于SequenceInputStream的演示样例代码:

private static void testSequenceInputOutputStream(){ String inputFileName1 = "D:\\iWork\\file1.txt"; String inputFileName2 = "D:\\iWork\\file2.txt"; String outputFileName = "D:\\iWork\\file3.txt"; try{ FileInputStream fis1 = new FileInputStream(inputFileName1); FileInputStream fis2 = new FileInputStream(inputFileName2); SequenceInputStream sis = new SequenceInputStream(fis1, fis2); FileOutputStream fos = new FileOutputStream(outputFileName); byte[] buf = new byte[1024]; int length = 0; while((length = sis.read(buf)) > 0){ fos.write(buf, 0, length); } sis.close(); fos.close(); }catch (FileNotFoundException e){ e.printStackTrace(); }catch (IOException e){ e.printStackTrace(); } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/63c32dad80932cb22e19ef26dec9a435.html