Java I/O

一. Java Scanner 類

java.util.Scanner是 Java5 的新特征,我們可以通過 Scanner 類來獲取用戶的輸入。

1. 創(chuàng)建Scanner對象

Scanner sc = new Scanner(System.in);

Java 的控制臺輸入由 System.in 完成。

2. next() 與 nextLine() 方法

通過 Scanner 類的 next() 與 nextLine() 方法獲取輸入的字符串,在讀取前我們一般需要使用 hasNext 與 hasNextLine 判斷是否還有輸入的數據。

2.1 使用 next 方法

實例

import java.util.Scanner; //導包
 
public class ScannerDemo {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        // 從鍵盤接收數據
 
        // next方式接收字符串
        System.out.println("next方式接收:");
        // 判斷是否還有輸入
        while (scan.hasNext()) {
            String str1 = scan.next();
            System.out.println("輸入的數據為:" + str1);
        }
        System.out.println("welcome");
        scan.close();
    }
}

運行結果:

next方式接收:
new place
輸入的數據為:new
輸入的數據為:place
|

最下面一行光標依然在閃爍,表示可以繼續(xù)輸入,并且System.out.println("welcome");語句也未輸出

方法解釋

如果此掃描器的輸入(緩沖區(qū))中有另一個token(輸入的字符或數字),則返回true。根本沒有提到什么時候返回false。其實執(zhí)行過程是這樣的(重點),當執(zhí)行到hasNext()時,它會先掃描緩沖區(qū)中是否有字符,有則返回true,繼續(xù)掃描。直到掃描為空,這時并不返回false,而是將方法阻塞,等待你輸入內容然后繼續(xù)掃描。

解決方法

使用帶有參數的重載方法,當掃描到的字符與參數值匹配時返回true

修改后的代碼如下:

import java.util.Scanner; //導包
 
public class ScannerDemo {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        // 從鍵盤接收數據
 
        // next方式接收字符串
        System.out.println("next方式接收:");
        // 判斷是否還有輸入
        while (!scan.hasNext("#")) { //匹配#返回true,然后取非,即輸入#退出循環(huán)
            String str1 = scan.next();
            System.out.println("輸入的數據為:" + str1);
        }
        System.out.println("welcome");
        scan.close();
    }
}

運行結果如下:

next方式接收:
new place #
輸入的數據為:new
輸入的數據為:place
welcome

Process finished with exit code 0

2.2 使用 nextLine 方法

實例

import java.util.Scanner;
 
public class ScannerDemo {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        // 從鍵盤接收數據
 
        // nextLine方式接收字符串
        System.out.println("nextLine方式接收:");
        // 判斷是否還有輸入
        while (scan.hasNextLine()) {
            String str2 = scan.nextLine();
            System.out.println("輸入的數據為:" + str2);
        }
        scan.close();
    }
}

運行結果如下:

nextLine方式接收:
new place
輸入的數據為:new place
new new place
輸入的數據為:new new place
|

可以使用 if 語句來判斷是否為空行來結束循環(huán)
代碼如下:

import java.util.Scanner;
 
public class ScannerDemo {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        // 從鍵盤接收數據
 
        // nextLine方式接收字符串
        System.out.println("nextLine方式接收:");
        // 判斷是否還有輸入
        while (scan.hasNextLine()) {
            String str2 = scan.nextLine();
             if(str2.equals(""))
                    break;//輸入回車結束循環(huán)
            System.out.println("輸入的數據為:" + str2);
        }
        scan.close();
    }
}

運行結果如下:

nextLine方式接收:
new place
輸入的數據為:new place


Process finished with exit code 0

next() 與 nextLine() 區(qū)別

next():

  1. 一定要讀取到有效字符后才可以結束輸入。
  2. 對輸入有效字符之前遇到的空白,next() 方法會自動將其去掉。
  3. 只有輸入有效字符后才將其后面輸入的空白作為分隔符或者結束符。
    next() 不能得到帶有空格的字符串。

nextLine():

  1. 以Enter為結束符,也就是說 nextLine()方法返回的是輸入回車之前的所有字符。
  2. 可以獲得空白。

如果要輸入 int 或 float 類型的數據,在 Scanner 類中也有支持,但是在輸入之前最好先使用 hasNextXxx() 方法進行驗證,再使用 nextXxx() 來讀取。

2. 讀寫文件

字節(jié)流和字符流:

  • 字節(jié)流:以字節(jié)為單位,每次次讀入或讀出是8位數據。可以讀任何類型數據。
  • 字符流:以字符為單位,每次次讀入或讀出是16位數據。其只能讀取字符類型數據。

輸出流和輸入流:

  • 輸出流:從內存讀出到文件。只能進行寫操作。
  • 輸入流:從文件讀入到內存。只能進行讀操作。

注意:這里的出和入,都是相對于系統(tǒng)內存而言的。

節(jié)點流和處理流:

  • 節(jié)點流:直接與數據源相連,讀入或讀出。
  • 處理流:與節(jié)點流一塊使用,在節(jié)點流的基礎上,再套接一層,套接在節(jié)點流上的就是處理流。

為什么要有處理流?直接使用節(jié)點流,讀寫不方便,為了更快的讀寫文件,才有了處理流。

下面將要討論的兩個重要的流是 FileInputStream 和 FileOutputStream:

2.1 FileInputStream

該流用于從文件讀取數據,它的對象可以用關鍵字 new 來創(chuàng)建。
InputStream f = new FileInputStream("C:/java/hello");
創(chuàng)建了InputStream對象,就可以使用下面的方法來讀取流或者進行其他的流操作。

  1. public void close() throws IOException{}
    關閉此文件輸入流并釋放與此流有關的所有系統(tǒng)資源。拋出IOException異常。
  2. protected void finalize()throws IOException {}
    這個方法清除與該文件的連接。確保在不再引用文件輸入流時調用其 close 方法。拋出IOException異常。
  3. public int read(int r)throws IOException{}
    這個方法從 InputStream 對象讀取指定字節(jié)的數據。返回為整數值。返回下一字節(jié)數據,如果已經到結尾則返回-1。
  4. public int read(byte[] r) throws IOException{}
    這個方法從輸入流讀取r.length長度的字節(jié)。返回讀取的字節(jié)數。如果是文件結尾則返回-1。
  5. public int available() throws IOException{}
    返回下一次對此輸入流調用的方法可以不受阻塞地從此輸入流讀取的字節(jié)數。返回一個整數值。

2.2 FileOutputStream

該類用來創(chuàng)建一個文件并向文件中寫數據。
OutputStream f = new FileOutputStream("C:/java/hello")

創(chuàng)建OutputStream 對象完成后,就可以使用下面的方法來寫入流或者進行其他的流操作。

  1. public void close() throws IOException{}
    關閉此文件輸入流并釋放與此流有關的所有系統(tǒng)資源。拋出IOException異常。
  2. protected void finalize()throws IOException {}
    這個方法清除與該文件的連接。確保在不再引用文件輸入流時調用其 close 方法。拋出IOException異常。
  3. public void write(int w)throws IOException{}
    這個方法把指定的字節(jié)寫到輸出流中。
  4. public void write(byte[] w)
    把指定數組中w.length長度的字節(jié)寫到OutputStream中。
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容