位置:首頁 > Java技術 > Java教學 > Java流,文件和I/O

Java流,文件和I/O

java.io包中包含幾乎所有可能永遠需要在Java中執行輸入和輸出(I/ O)類。所有這些數據流代表一個輸入源和輸出目標。 java.io包中的流支持多種數據,如基本類型,對象,本地化的字符等

流可以被定義為一個數據序列。 InputStream用於讀取從一個源數據,OutputStream是用於將數據寫入到一個目的地。

JAVA I/O提供了強有力,靈活的支持,因為它涉及到的文件和網絡,但本教學介紹與流非常基本的功能和I / O。我們會來一個接一個看下麵最常用的例子:

讀取控製台輸入:

Java輸入控製台由System.in讀取完成。為了獲得一個連接到控製台基於字符的數據流,包裝System.in在一個BufferedReader對象,創建一個字符流。下麵是最常見的語法來獲得BufferedReader:

BufferedReader br = new BufferedReader(new 
                      InputStreamReader(System.in));

一旦得到BufferedReader,我們可以使用read()方法來達到一個字符或readLine()方法來讀取從控製台的字符串。

從控製台讀取字符:

要讀取一個BufferedReader一個字符,使用read( ) (其語法時才如下所示)方法:

int read( ) throws IOException

每一次read( )被調用時,它讀取輸入流的字符,並返回它作為一個整數的返回值。1表示到流的末尾。正如所看到的,它可以拋出一個IOException異常。

下麵的程序演示read()通過讀取字符從控製台,直到用戶鍵入 "q":

// Use a BufferedReader to read characters from the console.

import java.io.*;

public class BRRead {
   public static void main(String args[]) throws IOException
   {
      char c;
      // Create a BufferedReader using System.in
      BufferedReader br = new BufferedReader(new 
                         InputStreamReader(System.in));
      System.out.println("Enter characters, 'q' to quit.");
      // read characters
      do {
         c = (char) br.read();
         System.out.println(c);
      } while(c != 'q');
   }
}

下麵是一個示例運行:

Enter characters, 'q' to quit.
123abcq
1
2
3
a
b
c
q

從控製台讀取字符串:

從鍵盤讀取一個字符串,使用readLine( )是BufferedReader類的成員。其一般形式如下所示:  

String readLine( ) throws IOException

下麵的程序演示的BufferedReader和的readLine()方法。該程序讀取並顯示的文本行直到輸入"end": 

// Read a string from console using a BufferedReader.
import java.io.*;
public class BRReadLines {
   public static void main(String args[]) throws IOException
   {
      // Create a BufferedReader using System.in
      BufferedReader br = new BufferedReader(new
                              InputStreamReader(System.in));
      String str;
      System.out.println("Enter lines of text.");
      System.out.println("Enter 'end' to quit.");
      do {
         str = br.readLine();
         System.out.println(str);
      } while(!str.equals("end"));
   }
}

下麵是示例的運行結果:

Enter lines of text.
Enter 'end' to quit.
This is line one
This is line one
This is line two
This is line two
end
end

寫入控製台輸出:

控製台輸出使用print()和調用println()是最容易完成的,如前所述。這些方法是由PrintStream類是引用bySystem.out的對象的類型來定義。儘管System.out 是字節流,使用它進行簡單的程序輸出還是可以接受的。

因為PrintStream 是從派生的OutputStream輸出流,它也實現了​​低層次的方法Write()。因此 write()方法可以用來寫入控製台。寫最簡單的形式是由PrintStream的定義如下所示:

void write(int byteval)

此方法寫入到流由byteval指定的字節。雖然byteval被聲明為一個整數,隻有低8位寫入。

例子:

以下是使用write()方法來輸出字符“A”後跟一個換行符到屏幕上一個簡單的例子:

import java.io.*;

// Demonstrate System.out.write().
public class WriteDemo {
   public static void main(String args[]) {
      int b; 
      b = 'A';
      System.out.write(b);
      System.out.write('
');
   }
}

這將產生輸出屏幕上簡單的“A”字母。

A

注: 一般不會經常使用write() 來執行控製台輸出,因為print()和println() 一樣基本上更容易使用。

讀取和寫入文件:

如前麵所述,一個流可以被定義為一個數據序列。 InputStream的用於讀取從一個源數據和OutputStream的是用於將數據寫入到一個目的地。

下麵是類的層次結構來處理輸入和輸出流。

Java I/O Streams

這兩個重要的數據流是文件輸入流和文件輸出流,這將在本教學中加以討論:

FileInputStream:

此流被用於讀取來自文件的數據。可以使用關鍵字new創建的對象和有幾種類型的構造函數可用。

下麵的構造函數接受一個文件名作為一個字符串創建一個輸入流對象來讀取文件。

InputStream f = new FileInputStream("C:/java/hello");

下麵的構造函數接受一個文件對象來創建一個輸入流對象來讀取文件。首先我們創建一個使用File()方法,如下所示的文件對象: 

File f = new File("C:/java/hello");
InputStream f = new FileInputStream(f);

一旦有了InputStream對象,再有就是helper方法,可以用來讀取流或做其他的操作在流列表。

SN 方法描述
1 public void close() throws IOException{}
此方法關閉文件輸出流。發布與該文件相關的所有係統資源。拋出一個IOException。
2 protected void finalize()throws IOException {}
這種方法清除連接到該文件。請確保此文件輸出流的close方法被調用時,有此流不再有引用。拋出一個IOException。
3 public int read(int r)throws IOException{}
此方法讀取從InputStream中指定的數據字節。返回一個int。返回數據的下一個字節,如果是文件的末尾,則返回-1。
4 public int read(byte[] r) throws IOException{}
此方法讀取從輸入流r.length字節到一個數組中。返回讀取的字節總數。如果文件末尾,則返回-1。
5 public int available() throws IOException{}
給出了可以從該文件輸入流中讀取的字節數。返回一個int。

也有其他重要的輸入流,更多的細節可以參考以下鏈接:

文件輸出流:

文件輸出流是用於創建一個文件並寫入數據到它。流會創建一個文件,如果它不存在,打開它的輸出之前。

這裡有兩個構造函數可以用來創建一個FileOutputStream對象。

下麵的構造函數接受一個文件名作為一個字符串創建一個輸入流對象寫入文件:

OutputStream f = new FileOutputStream("C:/java/hello") 

下麵的構造函數接受一個文件對象創建一個輸出流對象寫入文件。首先,我們創建一個使用File() 方法,如下一個文件對象:

File f = new File("C:/java/hello");
OutputStream f = new FileOutputStream(f);

一旦有OutputStream對象,再有就是helper方法的列表,它可以被用來寫入流或做其他操作上的流。

SN 方法描述
1 public void close() throws IOException{}
此方法關閉文件輸出流。發布與該文件相關的所有係統資源。拋出一個IOException。
2 protected void finalize()throws IOException {}
這種方法清除連接到該文件。請確保此文件輸出流的close方法被調用時,有此流不再有引用。拋出一個IOException。
3 public void write(int w)throws IOException{}
此方法將指定字節寫入到輸出流。
4 public void write(byte[] w)
寫入w.length字節自提字節數組的OutputStream。

也有其他重要的輸出流,更多的細節可以參考以下鏈接:

例子:

下麵是例子來演示InputStream和OutputStream:

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] ); // writes the bytes
      }
      os.close();
     
      InputStream is = new FileInputStream("test.txt");
      int size = is.available();

      for(int i=0; i< size; i++){
         System.out.print((char)is.read() + "  ");
      }
      is.close();
   }catch(IOException e){
      System.out.print("Exception");
   }	
   }
}

上麵的代碼將創建文件test.txt,並會寫入給定的數字在二進製格式。同樣是在標準輸出屏幕上輸出。

文件導航和I/O:

還有其他幾個類,我們將去了解文件導航的基本知識和I/O。

Java中的目錄:

創建目錄:

有兩個有用的文件實用工具方法,它可以用來創建目錄:

  • mkdir( ) 方法創建一個目錄,在成功時返回假失敗真的。失敗表明,在文件對象中指定的路徑已經存在,或者該目錄不能被創建,因為整個路徑尚不存在。

  • mkdirs() 方法同時創建一個目錄和目錄下的所有父目錄。

下麵的示例創建"/tmp/user/java/bin" 目錄:

import java.io.File;

public class CreateDir {
   public static void main(String args[]) {
      String dirname = "/tmp/user/java/bin";
      File d = new File(dirname);
      // Create directory now.
      d.mkdirs();
  }
}

編譯並執行上麵的代碼來創建 "/tmp/user/java/bin".

注: 的Java會自動在UNIX和Windows路徑分隔符按約定保護。如果在WindowsJava使用正斜杠(/),該路徑仍然會正確地解析。

讀取目錄:

目錄是一個包含其他文件和目錄列表的文件。當創建一個文件對象,它是一個目錄,isdirectory()方法將返回true。

可以調用 list( )時該對象上提取裡麵的其他文件和目錄列表。這裡顯示的程序演示了如何使用 list( )來檢查一個目錄的內容:

import java.io.File;

public class DirList {
   public static void main(String args[]) {
      String dirname = "/tmp";
      File f1 = new File(dirname);
      if (f1.isDirectory()) {
         System.out.println( "Directory of " + 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] + " is a directory");
            } else {
               System.out.println(s[i] + " is a file");
            }
         }
      } else {
         System.out.println(dirname + " is not a directory");
    }
  }
}

這將產生以下結果:

Directory of /tmp
bin is a directory
lib is a directory
demo is a directory
test.txt is a file
README is a file
index.htmll is a file
include is a directory