4.BufferedInputStream和BufferedOutputStream
BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。
在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。
在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。
mark 操作记录输入流中的某个点,reset 操作使得在从包含的输入流中获取新字节之前,再次读取自最后一次 mark 操作后读取的所有字节。
BufferedOutputStream 该类实现缓冲的输出流。
通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。
下面讲一个例子:
package com.chen.test;
import Java.io.*;
/**
*
* @author 陈家小帅
*
*/
public class Test4 {
public static void main(String[] args) throws Exception {
String path1 = "E:/WorkSpace/Mouth/bin/Dest.txt";
String path2 = "E:/WorkSpace/Mouth/bin/D.txt";
ReadByBIS(path1, path2);
}
/**
* 使用BufferInputStream将一个文件的内容写入到另一个文件中,并在控制台输出
*
* @param path1
* @param path2
* @throws Exception
*/
public static void ReadByBIS(String path1, String path2) throws Exception {
InputStream in = new BufferedInputStream(new FileInputStream(path1)); //创建文件输入流
OutputStream out = new BufferedOutputStream(new FileOutputStream(path2)); //创建文件输出流
byte[] buffer = new byte[1024]; //定义字节数组
int len = 0;
while ((len = in.read(buffer)) > 0) { //将最多buffer.lenth个字节的数据读入byte数组中
out.write(buffer, 0, len); //将读取到的信息写入到文件中
out.flush(); // 刷新此缓冲的输出流
String s = new String(buffer, 0, len); //将读入的字节转换成String类型
System.out.println(s); //输出读取到的信息
}
in.close(); //关闭输入输出流
out.close();
}
}
输出结果:
如果大家学过设计模式中的装饰者模式,会很容易发现BufferedinputStreamBufferedOutputStream其实是对FileInputStream和FileOutputStream进行了包装。
为它创建一个内部缓冲区数组,应用程序就可以将各个字节读/写入底层输出流中,而不必针对每次字节读/写入调用底层系统。
5.读写对象:ObjectInputStream 和ObjectOutputStream
该流允许读取或写入用户自定义的类,但是要实现这种功能,被读取和写入的类必须实现Serializable接口,
其实该接口并没有什么方法,可能相当 于一个标记而已,但是确实不合缺少的。
例子如下:
package com.chen.test;
import java.io.*;
/**
*
* @author 陈家小帅
*
*/
public class Test4 {
public static void main(String[] args) throws Exception {
String path1 = "E:/WorkSpace/Mouth/bin/Dest.txt";
String path2 = "E:/WorkSpace/Mouth/bin/D.txt";
ReadbyOnjiect(path2);
}
public static void ReadbyOnjiect(String path2){
ObjectInputStream oibs = null;
ObjectOutputStream oobs = null;
try {
oobs = new ObjectOutputStream(new FileOutputStream(path2));
oobs.writeObject(new Student("张三", 18));
oobs.writeObject(new Student("李四", 18));
oibs = new ObjectInputStream( new FileInputStream(path2));
for(int i=0;i<2;i++){
System.out.println(oibs.readObject());
}
} catch (Exception e) {
// TODO: handle exception
}
oibs.close();
oobs.close();
}
}
//自定义的类实现了Serializable接口,可序列化
class Student implements Serializable{
private String name;
private int age;
public Student(String name,int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student[name="+name+",age="+age+"]";
}
}
6.读写对象:DataInputStream和DataOutputStream
DataInputStream、DataOutputStream来写入或读出数据。DataInputStream的好处在于在从文件读出数据时,不用费心地自行判断读入字符串时或读入int类型时何时将停止,使用对应的readUTF()和readInt()方法就可以正确地读入完整的类型数据。
下面是一个例 子:
package com.chen.test;
import java.io.*;
/**
*
* @author 陈家小帅
*
*/
public class Test4 {
public static void main(String[] args) throws Exception {
String path1 = "E:/WorkSpace/Mouth/bin/Dest.txt";
String path2 = "E:/WorkSpace/Mouth/bin/D.txt";
DataReader(path2);
}
/**
* 用DataOutputStream和DataInputStream将类写入到文件中,然后读出
* @param path1
*/
public static void DataReader(String path1){
Student[] student = {
new Student("zs", 18),
new Student("ls", 20)};
try {
DataOutputStream oups = new DataOutputStream(new FileOutputStream(path1));
DataInputStream dips = new DataInputStream(new FileInputStream(path1));
for (Student s : student) {
//写入数据
oups.writeUTF(s.getName());
oups.writeInt(s.getAge());
}
oups.flush();
oups.close();
for(int i = 0 ; i<student.length;i++){
String name = dips.readUTF();
int age = dips.readInt();
student[i] = new Student(name, age);
}
for (Student student2 : student) {
System.out.println(student2.getName()+" "+student2.getAge());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Student implements Serializable {
private String name;
private int 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;
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student[name=" + name + ",age=" + age + "]";
}
}