淺談Java的io類庫使用
簡單理解
java的io包括輸入流InputStream,輸出流OutputStream,File類等,具體結構如下圖所示:
在網路上的檔案傳輸有兩種方式,一種是字元流傳輸,一種是二進位制流傳輸(這裡的位元組流就是二進位制流,只是起了一個便於區分的名字)。
字元流的樣子是這樣的:
^&%R%^FR^&%F*^&R^RF^%^&EYD%$^
二進位制流的樣子是這個樣子的:
1011010101010111101010100001
事實上,只是檔案傳輸的途中用到了字元流,真正儲存到計算機中的都是二進位制流。二進位制流的前幾位用來描述檔案的資訊,後面的位數用來記錄檔案的具體內容。
當我們讀取一個檔案的時候,是把這個檔案的內容從磁碟中拿到記憶體的我們的程式中再去讀取它的資料,這時稱作流的輸入,對應的就是輸入流InputStream
當我們去對一個檔案寫入資料的時候,是把要輸出的內容從記憶體中的程式中輸出到磁碟的檔案中,這時稱作流的輸出,對應的就是輸出流OutputStream
所以,我們常常會感到很難受,為什麼明明對一個檔案寫入資料是輸出流,而對一個一個檔案的讀取操作卻是輸入流,貌似完全反過來了一樣,原因就在此。輸入輸出是相對記憶體中的程式而言的,而不是相對我們人類而言的。
基本使用方法
1.File類
建立資料夾
使用File類可以建立一個資料夾,建立的方法很簡單:
File f= new File("你的路徑");
這是給File一個路徑值,接著,我們通過File類的mkdir()方法就可以建立一個資料夾
f.mkdir();
讀取資料夾中內容
當我們讀取資料夾中的內容時,使用list()方法可以直接讀取出來這個資料夾中的檔案,讀取出來的是一個數組,下面的例子用字串陣列接受了資料夾中的子檔案,然後遍歷輸出:
public static void main(String args[]) {
String dirname = "/tmp";
File f1 = new File(dirname);
if (f1.isDirectory()) {
System.out.println("目錄 " + dirname);
String s[] = f1.list();
for (int i = 0; i < s.length; i++) {
File f = new File(dirname + "/" + s[i]);
if (f.isDirectory()) {
System.out.println(s[i] + " 是一個目錄");
} else {
System.out.println(s[i] + " 是一個檔案");
}
}
} else {
System.out.println(dirname + " 不是一個目錄");
}
}
輸出結果:
目錄 /tmp
bin 是一個目錄
lib 是一個目錄
demo 是一個目錄
test.txt 是一個檔案
README 是一個檔案
index.html 是一個檔案
include 是一個目錄
刪除目錄及內容
我們可以使用File類的delete()方法刪除檔案,但是必須保證刪除的檔案目錄下沒有子檔案才行,否則會刪除失敗。
那麼,我們可以通過如下方法把資料夾和資料夾中的內容一起刪除:
public static void main(String args[]) {
File folder = new File("/tmp/java/");
File[] files = folder.listFiles();
if (files != null)
{
for (File f : files)
{
if (f.isDirectory())
{
deleteFolder(f);
}
else
{
f.delete();
}
}
}
folder.delete();
}
看著複雜,其實很簡單,我們只是將一個資料夾下的東西遍歷了一遍然後挨個去刪除它們而已。
2.FileInputStream類
該流用於從檔案讀取資料,使用方法很簡單,直接可以new出來
下面的例子可以從已經建立好的檔案中讀取流:
File f = new File("C:/java/hello");
InputStream out = new FileInputStream(f);
當然,我們也可以直接在構造方法中輸入檔案的路徑:
InputStream f = new FileInputStream("C:/java/hello");
建立好了流物件,我們就可以通過流物件的方法讀取資料了,可以使用read()方法讀出資料來:
f.read();
注意,無論是使用輸入流還是輸出流,在使用完成後都要關閉流,否則對於檔案來說是不安全的,我們通過呼叫close()方法關閉流:
f.close();
下面是完整的例項:
public static void main(String[] args) throws IOException {
FileInputStream f = new FileInputStream("test.txt");
int b;
while((b = f.read()) != -1) {
System.out.println(b);
}
//關閉流資源
fis.close();
}
3.FileOutputStream類
該流用於向檔案中寫入資料,使用方法也是直接new出來
如果該流在開啟檔案進行輸出前,目標檔案不存在,那麼該流會建立該檔案。
下面的例子建立了一個檔案並且開始向檔案中寫入資料:
File f = new File("C:/java/hello");
OutputStream f = new FileOutputStream(f);
寫入資料是通過write()方法
下面的完整例子演示了輸入輸出流的用法:
import java.io.*;
public class fileStreamTest {
public static void main(String args[]) {
try {
byte bWrite[] = { 11, 21, 3, 40, 5 };
OutputStream os = new FileOutputStream("test.txt");
for (int x = 0; x < bWrite.length; x++)
{
os.write(bWrite[x]); // 向檔案中寫入
}
os.close();
InputStream is = new FileInputStream("test.txt");
int size = is.available();//available返回的是一次性可以讀取出的位元組數
for (int i = 0; i < size; i++)
{
System.out.print((char) is.read() + " ");//讀取並打印出資料
}
is.close();
} catch (IOException e) {
System.out.print("Exception");
}
}
}