今天用一上午的時間看了java流的一些基本知識點。因為在java中流的使用非常高。現在我就輸入和輸出資料流談談自己對流的認識。
Java的輸入輸出資料流來源於stream(資料流)。其中流分位元組流和字元流。而位元組和字元流都有輸出個輸入和輸出資料流。他們分別是這四個介面。
InputStream(位元組輸入) outputStream(位元組輸出) reader(字元輸入) writer(字元輸出)其中四個介面可以派生出不同功能的類。其中輸出資料流有write()方法的三種重載。輸入資料流有read()的三種重載。
一般就介紹幾個常用的幾個輸入輸出類:
Fileinputstream bufferedinputstream fileoutstream bufferedoutputstream
fileReader bufferedreader filewriter bufferedwriter
其中buffered的是一種緩衝流,是對流的封裝,使用buffered可以提高輸出輸入的效率。
現在我想用輸入和輸出資料流的列子來更好的說明。
//利用位元組流向一個檔案寫資料
File file = new File("d:\\fish.txt");
file.createNewFile();//先建立一個檔案
OutputStream outputStream = new FileOutputStream(file);//建立一個輸出資料流
String s = "我叫飛魚";//寫入資料
outputStream.write(s.getBytes());//將資料寫入留中
outputStream.close();//關閉流
介紹一個提高效率的寫法
Filefile = new File("d:\\fish.txt");
file.createNewFile();
OutputStream outputStream = new FileOutputStream(file);
BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(outputStream);
String s = "我叫飛魚";
bufferedOutputStream.write(s.getBytes());
bufferedOutputStream.close();
兩個實現的功能是一樣的。但是BufferedOutputStream是一種緩衝技術流。可以將資料建立於緩衝數組中。這樣可以提高效率。下面關於輸入輸出資料流我都將用封裝bufferedstream方法來封裝實現。
//對一個檔案的內容進行讀取到控制台
InputStreaminputStream=new FileInputStream(new File("d:\\fish.txt"));
BufferedInputStream bufferedInputStream=new BufferedInputStream(inputStream);
byte b= (byte)bufferedInputStream.read();
while(b!=-1){
System.out.print((char)b);
b=(byte) bufferedInputStream.read();
}
bufferedInputStream.close();
對於這個你一定會出現一個問題那就是漢字會出現亂碼。因為漢字佔兩個位元組,而每次只是輸出一個位元組即半個漢字,自然出亂碼。
//所以下面介紹一種利用字元流進行對檔案的讀取。
BufferedReader bufferedReader =new BufferedReader(new FileReader(new File("d:\\fish.txt")));
String s= bufferedReader.readLine();
while(s!=null){
System.out.println(s);
s=bufferedReader.readLine();
}
bufferedReader.close();
現在的代碼是不是簡練多了。對於java的輸入輸出資料流本身就是採用了一種裝飾者的設計模式。所以第一句這樣寫就簡練多了。
而字元流讀取每次是讀取一行。所以是readline();當然你不閑麻煩也可以read()的。
/
/利用字元流對檔案進行寫內容
BufferedWriterbufferedWriter =new BufferedWriter(new FileWriter(new File("d:\\fish.txt")));
String s="我是飛魚";
bufferedWriter.write(s);
bufferedWriter.close();
通過這些例子我感覺我覺得已經說的比較清楚了,當然需要一點對java基礎知識的人看。
//現在我感覺大概差不多,就做一個從一個檔案複製到另個檔案的練習。我就用字元流做吧。
public static void main(String[] args) throwsException {
BufferedReader bufferedReader = new BufferedReader(new FileReader(
new File("d:\\fish.txt")));
String s = bufferedReader.readLine();
File file = new File("d:\\fishcopy.txt");
file.createNewFile();// 建立一個檔案用來存放檔案內容
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file));
while (s != null) {
bufferedWriter.write(s + "\n");
s = bufferedReader.readLine();
}
bufferedReader.close();
bufferedWriter.close();
}
//上述例子都可在eclispe下調通。但是都拋出異常。
說了那麼多,給該說說字元流和位元組流的區別了。
我想說一句話就是位元組流比字元流要好。但是字元流讀取方便,可以寫到緩衝區效率高。
但是位元組流應用廣,像視頻圖片音頻都是用位元組流的。所以用位元組流不會失真。
還有使用流以後記得要關閉流。