注: 本博客中讲述的其他流包括: 打印流,对象流,字节数组流,字符串流
剩下的几种流在后续Android学习中用到较少,所以我就把他们集中起来放到一篇博客中,所以说得不是特别的详细,或简单一过
打印流
打印流的主要功能是用于输出,在整个IO包中打印流分为两种类型:
字节打印流: PrintStream
字符打印流: PrintWriter
打印流的目的就是让人方便的进行输出
代码示例:
PrintStream
public static void charStreamOut(){
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(PATHB));
PrintWriter pw = new PrintWriter(bw);
pw.println("测试文本1");
pw.println("测试文本2");
pw.println(97);//如果用writer方法会当作字母A
bw.flush();
bw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
PrintWriter
public static void printStream() {
OutputStream out;
try {
out = new FileOutputStream(PATHA);
// 字节输出流具备缓冲功能
BufferedOutputStream bos = new BufferedOutputStream(out);
// 更方便输出, 特别好用奥..!!!, 一般情况下,输出字符串套这三层就可以了!!
PrintStream ps = new PrintStream(bos);
ps.println(123);
ps.println("abc");
ps.println(true);
bos.flush();
bos.close();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
对象流
在说对象流之前需要掌握一个概念:序列化
对象序列化
对象序列化就是指将一个对象转化成二进制的byte流
两种情况:
将对象保存在文件上的操作成为对象的序列化操作
将对象从文件中恢复称为反序列化操作
使用ObjectOutputStream类实现对象的序列化,使用ObjectInputStream类实现反序列。
被序列化对象所在的类必须实现java.io.Serializable接口。
接下来进入正式的对象流的学习:
对象流的两个类
- ObjectOutputStream将Java 对象的基本数据类型和图形写入OutputStream
- ObjectInputStream对以前使用ObjectOutputStream写入的基本数据和对象进行反序列化。
序列化一组对象
在序列化操作中,同时序列化多个对象时,反序列化也必须按顺序操作,如果想要序列化一组对象该如何操作呢?
序列化一组对象可采用:对象数组的形式,因为对象数组可以向Object进行转型操作
transient关键字
如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。
上面的概念大致了解一下,通过下面的Demo就能看明白,而且以后在Android学习时实现序列化会有另外一种方式
实现序列化的类(Cat类),允许该对象以二进制byte流方式进行传输
/**
* 对象可以被序列化,必须实现接口Serializable
* @author zll
*/
public class Cat implements Serializable {
private String name;
private int age;
private transient String color;// 表示该属性不用序列化!
public Cat(String name, int age) {
super();
this.name = name;
this.age = age;
}
//为减少篇幅省略了getter和setter方法!
}
对象的写入
public static void objectOut() {
Cat cat = new Cat("Tom", 3);
try {
OutputStream out = new FileOutputStream(PATHOBJ);
ObjectOutputStream oos = new ObjectOutputStream(out);
oos.writeObject(cat);
oos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
对象的读取
public static void objectIn() {
try {
InputStream in = new FileInputStream(PATHOBJ);
ObjectInputStream ois = new ObjectInputStream(in);
Cat cat = (Cat) ois.readObject();
System.out.println(cat);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
剩下的流在这里不做详细的介绍了, 只是简单的过一下, 参考Api文档完全能够看得明白
字节数组流
- ByteArrayInputStream : 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。内部计数器跟踪read 方法要提供的下一个字节。关闭 ByteArrayInputStream无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何IOException。
- ByteArrayOutputStream: 此类实现了一个输出流,其中的数据被写入一个byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和toString() 获取数据。关闭ByteArrayOutputStream无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何IOException。
数据流
- DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本Java 数据类型。应用程序可以使用数据输出 流写入稍后由数据输入流读取的数据。DataInputStream对于多线程访问不一定是安全的。线程安全是可选的, 它由此类方法的使用者负责。
- DataOutputStream:数据输出流允许应用程序以适当方式将基本Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。
字符串流
- StringReader: 其源为一个字符串的字符流。
- StringWriter: 一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串。关闭StringWriter无效。此类中的方法在关闭 该流后仍可被调用,而不会产生任何IOException。
以上纯属个人见解, 如有不足之处希望有高人指出, 定感激不尽, 如有喜欢交流学习经验请给我留言谢谢.
原创文章, 转载请注明出处