DataInputStream與DataOutputStream類
- DataOutputStream類提供三個寫入字符串的方法:
-- public final void writeBytes(String s) //由於JAVA的字符編碼是Unicode的,第個字符占兩個字節,writeBytes方法只是將每個字符的低字節寫入到目標設備中
-- public final void writeChars(String s) //writeChars是將字符的兩個字節都寫入到目標設備中
-- public final void writeUTF(String str) //writeUTF將字符串按照UTF編碼寫入到目標設備(其中包括長度) - 為什么DataInputStream類中有一個readUTF方法,而沒有"readBytes"和"readChars"方法呢?
- 編程實例:分別使用DataOutputStream類的writeUTF,writeBytes和writeChars方法,比較這幾個方法的差異。程序中所使用的流棧如下:
-
關閉流棧中的最上層的流對象(DataInputStream,DataOutputStream),將會自動關閉流棧中的所有底層流對象。
//DataStreamTest.java
import java.io.*;
public class DataStreamTest{
public static void main(String[] args) throws Exception {
FileOutputStream fos = new FileOutputStream("count.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
DataOutputStream dos = new DataOutputStream(bos);
dos.writeUTF("ab中國");
dos.writeBytes("ab中國");
dos.writeChars("ab中國");
dos.close();
//只要關閉最上層流對象,下層的流對象也會關閉
FileInputStream fis = new FileInputStream("count.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
DataInputStream dis = new DataInputStream(bis);
System.out.pritnln(dos.readUTF());
dis.close();
}
}
PrintStream類
- PrintStream類提供了一系列的print和println方法,可以將基本數據類型的數據格式化成字符串輸出。
- 格式化輸出是什么意思?例如:97被格式化輸出的實際字節數據為0X39和0X37。
- PrintStream的3個構造函數:
-- PrintStream(OutputStream out)
-- PrintStream(OutputStream out,boolean autoflush)
-- PrintStream(OutputStream out,boolean autoflush,String encoding) - 與PrintStream對應的PrintWriter類,即使遇到了文本換行標識符(n),PrintWriter類也不會自動清空緩沖區。
- PrintWriter的println方法能根據操作系統的不同而生成相應的文本換行標識符。在Windows下的文本換行符是“rn“,而Linux下的文本換行標識符是“n“。
ObjectInputStream與ObjectOutputStream類
- ObjectInputStream和ObjectOutputStream這兩個包裝類,用於從底層輸入流中讀取對象類型的數據和將對象類型的數據寫入到底層輸出流。
- ObjectInputStream與ObjectOutputStream類所讀寫的對象必須實現了Seralizable接口。對象中的transient和static類型的成員變量不會被讀取和寫入。
- 一個可以被序列化的MyClass類的定義:
public class MyClass implements Serializable{
public transient Thread t;
private String customerID;
private int total;
}
編程舉例:創建了一個可序列化學生對象,並用ObjectOutputStream類把它存儲到一個文件(mytext.txt)中,然后再用ObjectInputStream類把存儲的數據讀了到一個學生對象中,即恢復保存的學生對象。
//Student.java
import java.io.Serializable;
class Student implements Serializable{
int id;
String name;
int age;
String department;
public Student(int id,String name,int age,String department){
this.id = id;
this.name = name;
this.age = age;
this.department = department;
}
}
//Serialization.java 啟動類
import java.io.*;
public class Serialization{
public static void main(String[] args) throws Exception {
Student stu1 = new Student(19,"zhangsan",25,"hauxue");
Student stu2 = new Student(20,"lisi",23,"wuli");
FileOutputStream fos = new FileOutputStream("student.txt");
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(stu1);
os.writeObject(stu2);
os.close();
FileInputStream fis = new FileInputStream("student.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
stu1 = (Student)ois.readObject();
stu2 = (Student)ois.readObject();
ois.close();
System.out.println("id:" + stu1.id);
System.out.println("name:" + stu1.name);
System.out.println("age:" + stu1.age);
System.out.println("age:" + stu1.department);
System.out.println("id:" + stu2.id);
System.out.println("name:" + stu2.name);
System.out.println("age:" + stu2.age);
System.out.println("age:" + stu2.department);
}
}
字節流與字符流的轉換
- 能不能找到一種簡單的方式來讀取鍵盤上輸入的一行字符,如何找?
- InputStreamReader和OutputStreamWriter,是用於將字節流轉換成字節流來讀寫的兩個類,InputStreamWriter可以將一個字節流中的字節解碼成字符后讀取,OutputStreamWriter將字符編碼成字節后寫入到一個字節流中。
- InputStreamReader的兩個主要的構造函數:
-- InputStreamReader(InputStream in)
-- InputStreamReader(InputStream in,String CharsetName) - OutputStreamWriter的兩個主要的構造函數:
-- OutputStreamWriter(OutputStream out)
-- OutputStreamWriter(OutputStream out,String CharsetName) - 避免頻繁地在字符與字節間進行轉換,最好不要直接使用InputStreamReader和OutputStreamWriter類來讀寫數據,應盡量使用BufferedWriter類包裝OutputStreamWriter類,用BufferedReader類包裝 InputStreamReader。