Java IO 字節流 字符流操作
Java.io 包幾乎包含了所有操作輸入、輸出需要的類。所有這些流類代表了輸入源和輸出目標。一個流被定義爲一個數據序列。輸入流用於從源讀取數據,輸出流用於向目標寫數據。
Java.io 包中的流支持很多種格式,比如:基本類型、對象、本地化字符集等等。
一個流可以理解爲一個數據的序列。輸入流表示從一個源讀取數據,輸出流表示向一個目標寫數據。
Java 爲 I/O 提供了強大的而靈活的支持,使其更廣泛地應用到文件傳輸和網絡編程中。
InputStream,DataInputStream,ObjectInputStream,ByteArrayInputStream,FileInputStream,BufferedInputStream
OutputStream,DataOutputStream,ObjectOutputStream,ByteArrayOutputStream,FileOutputStream,BufferedOutputStream
InputStream
字節輸入流的超類,一般使用它的子類:FileInputStream等;
OutputStream
字節輸出流的超類,一般使用它的子類:FileOutputStream等,它能輸出字節流;
BufferedInputStream
是帶緩衝區的輸入流,默認緩衝區大小是8M,能夠減少訪問磁盤的次數,提高文件讀取性能;
BufferedOutputStream是帶緩衝區的輸出流,能夠提高文件的寫入效率。
BufferedInputStream與BufferedOutputStream分別是FilterInputStream類和FilterOutputStream類的子類,實現了裝飾設計模式。
ByteArrayInputStream、ByteArrayOutputStream
字節數組輸入/輸出流
ByteArrayInputStream、ByteArrayOutputStream
文件輸入/輸出流
DataOutputStream
以適當方式將基本 Java 數據類型寫入輸出流中。
DataInputStream
以與機器無關方式從底層輸入流中讀取基本 Java 數據類型
ObjectInputStream
對象輸入流反序列化
ObjectOutputStream
對象輸出流序列化
先序列化,後反序列化,反序列化順序必須與序列化順序一致。
不是所有的對象都可以序列化,必須實現Java.io.Serializable接口。
不是所有的屬性都需要序列化,不需要使用序列化的屬性使用transient
InputStreamReader
是字節流與字符流之間的橋樑,能將字節流輸出爲字符流,並且能爲字節流指定字符集,可輸出一個個的字符;
BufferedReader
提供通用的緩衝方式文本讀取,readLine讀取一個文本行, 從字符輸入流中讀取文本,緩衝各個字符,從而提供字符、數組和行的高效讀取。
示例
ByteArrayInputStream/ByteArrayOutputStream
File fdest = new File(destPath); //數據輸入文件
File fsrc = new File(srcPath); //數據輸入文件
byte[] dest = null; //字節數組輸出
//文件輸入流
InputStream is = new BufferedInputStream(new FileInputStream(fsrc));
//字節數組輸出流
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] flush = new byte[1024];
int len = 0;
while(-1!=(len=is.read(flush))) {
bos.write(flush,0,len); //寫出到字節數組流中
}
bos.flush();
//獲取數據,轉換爲字節數組輸出
dest = bos.toByteArray();
bos.close();
is.close();
//字節數組輸入流
InputStream is = new BufferedInputStream(new ByteArrayInputStream(dest));
//文件輸出流
OutputStream os = new BufferedOutputStream(new FileOutputStream(fdest));
byte[] flush = new byte[1024];
int len = 0;
while(-1!=(len=is.read(flush))){
os.write(flush,0,len); //寫出到文件
}
os.flush();
os.close();
is.close();
//FileUtil.close(os,is);
示例 1
DataInputStream/DataOutputStream
byte[] dest = null;
double point = 2.5;
long num = 1L;
String str = "data type";
//字節輸出流
ByteArrayOutputStream bos = new ByteArrayOutputStream();
//數據輸出流
//文件輸出
//DataOutputStream dos = new DataOutputStream(
// new BufferedOutputStream(new FileOutputStream(dest))
// );
//字節數組輸出
DataOutputStream dos = new DataOutputStream(
new BufferedOutputStream(bos));
dos.writeDouble(point); //寫入double數據到流中
dos.writeLong(num);
dos.writeUTF(str);
dos.flush();
dest =bos.toByteArray();//得到字節數組輸出
dos.close();
//數據輸入流
//文件輸入
//DataInputStream dis = new DataInputStream(
// new BufferedInputStream(new FileInputStream(src))
// );
//字節數組輸入
DataInputStream dis = new DataInputStream(
new BufferedInputStream(new ByteArrayInputStream(dest)));
//讀取順序需跟寫入順序相同才能正確讀取
point = dis.readDouble();
num = dis.readLong();
str = dis.readUTF();
dis.close();
System.out.println("point="+point+",num="+num+",str="+str);
示例 2
Java序列化是指把Java對象轉換爲字節序列的過程;
Java反序列化是指把字節序列恢復爲Java對象的過程
ObjectInputStream/ObjectOutputStream
public class Student implements java.io.Serializable{
private transient String name; //不需要序列化
private int age;
public Student(){
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return salary;
}
public void setAge(int age) {
this.age = age;
}
}
//寫入
Student st = new Student("wangxiaoming",10);
Student st0 = new Student("lilin",8);
//創建源
File dest = new File(destPath);
//對象輸出流,序列化到文件,生成字節流
ObjectOutputStream dos = new ObjectOutputStream(
new BufferedOutputStream(new FileOutputStream(dest)));
dos.writeObject(st);
dos.writeObject(st0);
dos.close();
//對象輸入流,反序列化從文件,生成對象
ObjectInputStream dis = new ObjectInputStream(
new BufferedInputStream(new FileInputStream(dest)));
//讀取流、生成對象
Object obj = dis.readObject();
if(obj instanceof Student){
Student st= (Student)obj;
System.out.println("name="st.getName()+",age="+emp.getAge());
}
dis.close();
示例3
System.in : 輸入流 鍵盤輸入
System.out: 輸出流 標準輸出
System.err : 輸出流 錯誤信息輸出
字節流 – 轉換流 – 字符流
InputStream –> BufferedReader –> BufferedReader
InputStream is = System.in;//字節流
//InputStreamReader是字節流通向字符流的橋樑
BufferedReader br = new BufferedReader(new InputStreamReader(is));
System.out.println("input:");
String msg = br.readLine();//處理一行
System.out.println(msg);
示例4:
PrintStream 打印流
PrintStream 繼承了 OutputStream類,並且實現了方法 write()。write() 可以用來往控制檯寫操作,控制檯的輸出由 print( ) 和 println() 完成,這些方法都由類 PrintStream 定義。
//輸出到文件
File src = new File(destPath);
PrintStream ps = System.out;
ps.println(false);
//打印流,輸出到文件
ps = new PrintStream(new BufferedOutputStream(new FileOutputStream(src,true))); //false覆蓋方式輸出到文件,true追加方式輸出到文件
ps.println("print output!");
ps.close();