Java 内存输出流、对象操作流、随机访问流、打印流、标准输入输出流
内存输出流
1、名字是输出流,体系也是在IO的体系中,但是其实没有内存和其他设备的交互,仅仅是在内存中做了拷贝。所以没有真正的IO。
2、类名:ByteArrayOutputStream
3、作用:当读取的字节信息不完整时,需要一个容器缓存不完整信息,这个类型就可以充当这个容器,因为这个容器可以自动增长。
4、本质上就是一个可以自动增长的字节数组
5、常用方法:
toByteArray():获取对象中的字节信息,返回一个字节数组
toString():将对象中的字节信息进行解码,返回解码后的字符串
import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.util.Arrays; public class Demo01 { public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream("a.txt"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] b = new byte[3]; int len=0; while((len=fis.read(b))!=-1) { baos.write(b, 0, len); } System.out.println(baos.toString()); byte[] result = baos.toByteArray(); System.out.println(Arrays.toString(result)); } }
对象操作流
1、对象输出流 序列化
1.ObjectOutputStream:是一个字节输出流,是OutputStream的子类,用于将内存中的对象写到其它设备中。
2.是一个包装类,可以将一个没有输出对象功能的字节输出流,包装成有输出对象功能的字节流,包装完成后,就多了一些方法。
3.构造方法
ObjectOutputStream(OutputStream 普通的字节输出流对象);
4.成员方法
writeObject(Object obj):将对象输出到对象流中
5.注意:
要存储到文件中的对象所属类型必须实现Serializable接口,属于java.io包
使用此方法存入的文件无法阅读,只能以对象输入流打开读取
2、对象输入流 反序列化
1.ObjectInputStream:是一个字节输入流,也是一个包装类
2.作用:将文件中的对象读取到内存中进行使用
3.构造方法
ObjectInputStream(InputStream is):将一个普通的字节输入流,包装成对象流
4.特有方法
readObject():将流中的对象读取到内存中
5.对象所属类型必须实现Serializable接口
3、异常:
对象操作流可能会产生一个异常EOFException,End Of File Exception,文件末尾异常 当文件到达末尾时继续读文件会产生这个异常
4、使用方法:
在向文件中写对象时不要直接写出,可以将对象整体写进集合中,然后将集合整体写入文件,相当于只写入一个集合对象。读取时只用读取一个集合对象,遍历集合即可。
5、版本号问题
不要使用自动生成的序列化版本ID,手动写一个,将来可以从版本ID判断是否修改过。
如果修改了,那么文件中的对象类型和本地类型就不兼容,如果没有修改这个版本ID,那么无论怎样修改了类型内容,都可以做到文件对象类型和本地类型兼容。
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.ArrayList; public class Demo02 { public static void main(String[] args) throws IOException, ClassNotFoundException { FileOutputStream fos = new FileOutputStream("b.txt"); ObjectOutputStream oos = new ObjectOutputStream(fos); ArrayList<Person> al = new ArrayList<>(); al.add(new Person("qq",11));//将对象写进集合 al.add(new Person("ww",21)); oos.writeObject(al);//只写入一个集合对象 oos.close(); FileInputStream fis = new FileInputStream("b.txt"); ObjectInputStream ois = new ObjectInputStream(fis); Object obj = ois.readObject(); ArrayList<Person> al1 = (ArrayList<Person>)obj; for(Person p:al1) { System.out.println(p.getName()+"..."+p.getAge()); } ois.close(); } } class Person implements Serializable{ private static final long serialVersionUID = 1L; private String name; private int age; public Person(String name, int age) { super(); this.name = name; this.age = age; } public Person() {} @Override public String toString() { return "name=" + name + ", age=" + age ; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }