關於java io文件操作類的筆記

JAVA 中的IO流
1.首先得搞清楚流的概念:
一個流,它有源端和目的端,它們可以是計算機內存的某些區域,也可以是磁盤文件,甚至可以是Internet上的某個URL。因此我們可以把流分兩類:輸入流和輸出流。[color=darkred]用戶可以從輸入流中讀取信息,但不能寫它。相反,對輸出流,只能往輸入流寫,而不能讀它。[/color]

兩個概念:
[b]結點流(node stream)[/b]
特點:直接從指定的位置(如磁盤文件或內存區域)讀或寫
[b]過濾器(filters)[/b]
除結點流之外的流都是過濾器
特點:往往是以其它輸入流作爲它的輸入源,經過過濾或處理後再以新的輸入流的形式提供給用戶,過濾器輸出流的原理也類似。

我們知道,io裏面那些大大小小的關於文件操作的類很多,而且需要傳入的參數可能是物理文件,也可能是某個對象。搞清上面兩個概念後我們就能很清楚的知道在new一個文件類時該傳什麼樣的參數。下面介紹流的另外一種分類,它是基於操作對象的類型分的。

流分類:
1.Java的字節流
InputStream是所有字節輸入流的祖先,而OutputStream是所有字節輸出流的祖先。
2.Java的字符流
Reader是所有讀取字符串輸入流的祖先,而writer是所有輸出字符串的祖先。
InputStream,OutputStream,Reader,writer都是抽象類。所以不能直接new

[b]JAVA字節流[/b]

[color=darkred]FileInputStream和FileOutputStream[/color]
這兩個類屬於[color=darkred]結點流[/color],第一個類的源端和第二個類的目的端都是磁盤文件,它們的構造方法允許通過文件的路徑名來構造相應的流。如:
FileInputStream infile = new FileInputStream("myfile.dat");
FileOutputStream outfile = new FileOutputStream("results.dat");

要注意的是,構造FileInputStream, 對應的文件必須存在並且是可讀的,而構造FileOutputStream時,如輸出文件已存在,則必須是可覆蓋的。

[color=darkred] BufferedInputStream和BufferedOutputStream[/color]
它們是過濾器流,其作用是提高輸入輸出的效率。
[color=darkred]DataInputStream和DataOutputStream[/color]
這兩個類創建的對象分別被稱爲數據輸入流和數據輸出流。這是很有用的兩個流,它們允許程序按與機器無關的風格讀寫Java數據。所以比較適合於網絡上的數據傳輸。這兩個流也是過濾器流,常以其它流如InputStream或OutputStream作爲它們的輸入或輸出。

[b]Java的字符流[/b]

字符流主要是用來處理字符的。Java採用16位的Unicode來表示字符串和字符,對應的字符流按輸入和輸出分別稱爲readers和writers。

[b]兩種不現導向的stream之間的轉換 [/b]
InputStreamReader和OutputStreamReader:把一個以字節爲導向的stream轉換成一個以字符爲導向的stream
例如:
BufferedReader in
= new BufferedReader(new InputStreamReader(System.in));

[color=darkred]BufferedReader和BufferedWriter[/color]
這兩個類對應的流使用了緩衝,能大大提高輸入輸出的效率。這兩個也是過濾器流,常用來對InputStreamReader和OutputStreamWriter進行處理。

import java.io.*;
public class Echo {
public static void main(String[] args) {
BufferedReader in =
new BufferedReader(
new InputStreamReader(System.in));
String s;
try {
while((s = in.readLine()).length() != 0)
System.out.println(s);
// An empty line terminates the program
} catch(IOException e) {
e.printStackTrace();
}
}
}

該程序接受鍵盤輸入並回顯。
對BufferedReader類,該類的readLine()方法能一次從流中讀入一行,但對於BufferedWriter類,就沒有一次寫一行的方法,所以若要向流中一次寫一行,可用PrintWriter類將原來的流改造成新的打印流,PrintWriter類有一個方法println(),能一次輸出一行。如:
............
PrintWriter out = new PrintWriter(new BufferedWriter(
new FileWriter("D:\javacode\test.txt")));
out.println("Hello World!");
out.close();
............



[b]
相關示例:[/b]

1,與控制檯相關。的讀入/寫出。 實現了字符串的複製。
import java.io.*;
public class TextRead{

public static void main(String[] args){
BufferedReader bf = null;/*BufferedReader相當於一個大桶,其實就是內存,這裏實現了大量大量的讀寫 ,而不是讀一個字節或字符就直接寫如硬盤,加強了對硬盤的保護。*/
try{
while(true){ // while(true){}循環保證程序不會結束

bf = new BufferedReader(new InputStreamReader(System.in));
/*System.in 爲標準輸入,System.out爲標準輸出*/
/*InputStreamReader用語將字節流到字符流的轉化,這也就是處理流了
*在這裏相當與2個管道接在System.in與程序之間。
*readLine()方法功能比較好用,也就通過處理流來實現更好功能。
**/
String line = bf.readLine();
System.out.println(line);
}
}catch(Exception e){
e.printStackTrace();
}finally{
//一定要關閉流,用完後。最好放在

filally 裏面。
try{
if(bf!=null){
bf.close();
}
}catch(Exception e){
e.printStackTrace();
}

}

}

}


2,與文件 相關的 讀寫。 實現了文件的複製。


import java.io.*;
public class TextRead{

public static void main(String[] args){
File fin,fout;
BufferedReader bf = null;
PrintWriter pw = null;
try{
fin = new File("zzc.txt"); //注意文件與程序都要在同一個文件夾下。zzc.txt爲要被複制的文件。

fout = new File("copyzzc.txt"); //如果沒有會自動創建。

bf = new BufferedReader(new FileReader(fin));

pw = new PrintWriter(fout); //PrintWriter爲打印流,也可以使用BufferedWriter.
String line = bf.readLine();
while(line!=null){
pw.println(line);

line = bf.readLine();
}


}catch(Exception e){
e.printStackTrace();

}finally{
try{
//關閉 文件。
if(bf!=null){
bf.close();
bf = null;
}
if(pw!=null){
pw.close();
pw = null;
}
}catch(Exception e){
e.printStackTrace();
}
}

}

}


下面是io類的結構圖:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章