JAVA資料流的概述
考慮到資料來源的多樣性,為了有效進行資料的輸入、輸出操作,java中把不同資料來源與程式間的資料轉送都抽像的表述為“流”(Stream),以實現相對統一和簡單的輸入/輸出(Inout/Output,I/O)操作方式。
下面就看看java資料流的概述:
流概述流的分類:
• 按資料流動方向
– 輸入資料流:只能從中讀取位元組資料,而不能向其寫出資料
– 輸出資料流:只能向其寫入位元組資料,而不能從中讀取資料
• 按照流所處理的資料類型
– 位元組流:用於處理位元組資料。
– 字元流:用於處理Unicode字元資料
• 按照流所處理的源
– 節點流:從/向一個特定的IO裝置讀/寫資料的流
– 處理流:對已存在的流進行串連和封裝的流
過濾流
抽象的InputStream和OutputStream類允許我們對字串及數字進行讀寫。為達到這個目的,還需要功能更多的子類。例如:DateInputStream和DataOutputStream允許我們對所有基本的java類型進行讀寫。
檔案流類與抽象的InputStream和OutputStream類相似,這些類也只支援位元組級的讀寫操作。換言之,只能從fin對象中讀取字元和位元組數組。byteb=fin.read(),他們沒有提供專門的數實值型別,所以DataInputStream沒有辦法從一個檔案中擷取數字。
解決方案:java給流職責分工,某些流(FileInputStream)負責從檔案或另一些更特殊的地方讀入位元組資料。而另一些流
(DataInputStream、PrintWriter)負責將位元組“組裝”成更有用的資料類型。必須綜合運用這兩種流,將其合并成所謂的"過濾流(FilteredStreams)",方法是將一個現成的流傳遞給另一個流的構建器。
資料流
l DataInputStream
l DataOutputStream
類的構造及成員詳見文檔
//在檔案中寫入並讀出人名及其工資
import java.io.*;
public class T1 {
public static void main(String[] args) {
String[] name = {"Tom","Jack","Mary"};
double[] salary = {300, 400, 1200};
try{
FileOutputStream fos =
new FileOutputStream("res/salary.txt");
DataOutputStream dos =
new DataOutputStream(fos);
for(int i=0; i<name.length; i++){
dos.writeUTF(name[i]);
dos.writeDouble(salary[i]);
}
dos.close();
fos.close();
///////////////////////
FileInputStream fin =
new FileInputStream("res/salary.txt");
DataInputStream dis =
new DataInputStream(fin);
for(int i=0; i<name.length; i++){
String n = dis.readUTF();
double s = dis.readDouble();
System.out.println(n + " :" + s);
}
dis.close();
fin.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
位元組緩衝流
l BufferedInputStream
l BufferedOutputStrem
類的構造及成員詳見文檔
預設情況下,流不會進行緩衝。即每讀一次,都會要求作業系統提供一個位元組。通過BufferedInputStream和
BufferedOutputStream對流構建器進行過濾分層,實現緩衝。
1、建構函式:
BufferedInputStream(InputStream in)
BufferedInputStream(InputStream in, intsize) //size:緩衝區的大小
2、代碼示範:
BufferedInputStream bis=newBufferedInputStream(System.in);
BufferedInputStream bis=newBufferedInputStream(System.in ,100);
//用緩衝位元組流實現檔案讀寫
import java.io.*;
public class BufferedIOTest {
public static void main(String[] args) {
try{
FileOutputStream fos =
new FileOutputStream("res/new.txt");
BufferedOutputStream bos =
new BufferedOutputStream(fos);
DataOutputStream dos =
new DataOutputStream(bos);
dos.writeUTF("goodmorning!");
dos.writeInt(250);
dos.close();
bos.close();
fos.close();
FileInputStream fis =
new FileInputStream("res/new.txt");
BufferedInputStream bis =
new BufferedInputStream(fis);
DataInputStream dis =
new DataInputStream(bis);
System.out.println(dis.readUTF() + "\n"+ dis.readInt());
dis.close();
bis.close();
fis.close();
}catch(Exception e){
e.printStackTrace();
}
}
}