Java入門基礎知識:Java IO(輸入/輸出)

Java中將輸入輸出抽象成流,流通過輸入輸出系統與物理設備連接,儘管與它們鏈接的物理設備不盡相同,所有流的行爲具有同樣的方式。今天yjbys小編爲大家帶來最新Java入門基礎知識——Java IO(輸入/輸出),希望對同學們學習java基礎知識有所幫助!

Java入門基礎知識:Java IO(輸入/輸出)

Java語言中的IO包支持Java的基本I/O(輸入/輸出)系統,包括文件的輸入/輸出。Java所有的I/O機制都是基於數據流進行輸入輸出,這些數據流表示了字符或者字節數據的流動序列。Java的I/O流提供了讀寫數據的標準方法。任何Java中表示數據源的對象都會提供以數據流的方式讀寫它的數據的方法。

  Java I/O基礎流的概念

java中將輸入輸出抽象成流,流通過輸入輸出系統與物理設備連接,儘管與它們鏈接的物理設備不盡相同,所有流的行爲具有同樣的方式。將數據從外部(包括磁盤文件、鍵盤、套接字)讀入到內存中的流稱爲輸入流,將從內存寫入到外部設備(控制檯、磁盤文件或者網絡)的稱爲輸出流。

  流的分類

流序列中的數據既可以是未經加工的原始二進制數據,也可以是經一定編碼處理後符合某種格式規定的特定數據。因此Java中的流分爲兩種:

字節流:數據流中最小的數據單元是字節 多用於讀取或書寫二進制數據

字符流:數據流中最小的數據單元是字符, Java中的字符是Unicode編碼,一個字符佔用兩個字節。

提示

在最底層,所有的輸入/輸出都是字節形式的。基於字符的流只爲處理字符提供方便有效的方法。

  字節流

字節流的最頂層是兩個抽象類:InputStream和OutputStream,其他關於處理字節的類都是它們的子類,這些子類對不同的外設進行處理,例如磁盤文件,網絡連接,甚至是內存緩衝區。

抽象類InputStream 和 OutputStream中定義了實現其他流類的關鍵方法read()和write(),它們分別對數據的`字節進行讀寫。兩種方法都是抽象方法,被子類重載。

例1 文件按字節流的方式拷貝

import .*;

//byte streams are used to perform input and output of 8-bit bytes

public class CopyFileByte {

public static void main(String args[]) throws IOException

{

FileInputStream in = null;

FileOutputStream out = null;

try {

in = new FileInputStream("");

out = new FileOutputStream("");

int c;

while ((c = ()) != -1) {

e(c);

}

}finally {

if (in != null) {

e();

}

if (out != null) {

e();

}

}

}

}

例1中,上面使用的是文件名來創建FileInoutStream和FileOutputStream,實際上可以還可以使用文件對象來創建輸入輸出流。字節流的每次操作都是一個數據單位——字節,假如文件中包含 Hello world ,那麼它將複製完“H”之後,再複製“e”,接着就是“l”,如此類推直到其結束。()每次從輸入流中讀取一個字節,如果達到文件末尾就返回-1。使用完了,還要關閉這些字節流,調用close()方法。

File inFile = new File("");

File outFile = new File("");

FileInputStream in = new FileInputStream(inFile);

FileOutputStream out = new FileOutputStream(outFile);

  字符流

java是使用16-bits來存儲字符數據的,涉及到的大多是字符操作,在程序中使用字符流會比字節流更加合適。類似於字節流,字符流的兩個頂層抽象類是Reader和Writer,一下是它們的子類處理字符流。

類似於字節,字符的抽象類Reader和 Writer中也定義了關鍵方法read()和write(),它們分別對字符進行讀寫。兩種方法也都是抽象方法,被子類重載。

例2 文件按字符流的方式拷貝

import .*;

//Character streams are used to perform input and output for 16-bit unicode

public class CopyFileCharacter {

public static void main(String args[]) throws IOException

{

FileReader in = null;

FileWriter out = null;

try {

in = new FileReader("");

out = new FileWriter("");

int c;

while ((c = ()) != -1) {

e(c);

}

}finally {

if (in != null) {

e();

}

if (out != null) {

e();

}

}

}

}

和例1對比發現,只有聲明的I/O流的類名不同,這裏使用的FileReader和FileWriter,它們操作的最小單位是一個字符16bits,而FileInputStream和FileOutputStream最小單位則是一個字節8bits.

  java 自定義的標準流

標準輸入流 讀取標準輸入設備數據,例如鍵盤輸入(默認),其類型是InputStream,三個重要的讀入方法:

int read() 從輸入流中讀取數據的下一個字節,返回ASCII碼。若,返回值=-1,說明沒有讀取到任何字節讀取工作結束

int read(byte[] b) 從輸入流中讀取一定數量的字節,並將這些數據存儲到緩衝區數組b中

int read(byte[] b, int off, int len) 將輸入流中最多len個字節讀入到字節數組b中

標準輸出流 向標準的輸出設備寫入數據,默認情況下指控制檯,其類型是PrintStream,包含兩個重要的方法:print()(不換行)和println()(輸出之後換行)

標準錯誤流 默認也是控制檯,類型和相同是PrintStream,

提示

這些流都有默認的設備,但它們可以重定向到任何兼容的輸入/輸出設備。

  控制檯的輸入和輸出

正如上面所介紹的,控制檯的輸入、輸出是由和來完成的。目前,讀取控制檯的輸入輸出的首選方法的是字符流,但完成控制檯輸入的唯一方法是字節流,因而java提供了InputStreamReader和OutputStreamWriter將字節流轉化成字符流。BufferedReader是緩衝輸入字符流。正如我們在例子中看到的,java允許使用向控制檯寫數據,但在實際的項目中,它推薦使用PrintWriter,它是基於字符的。

例3 控制檯輸入字符

import .*;

class ConsoleInOut{

public static void main(String args[])throws IOException{

char c;

InputStreamReader isr = new InputStreamReader(); //①

BufferedReader br = new BufferedReader(isr); //②

tln("Enter characters, 'q' to exit.");

c=(char)();

while(c != 'q'){

tln(c);

c = (char) ();

} ;

}

}

輸出:

D:java>java ConsoleInOut

Enter characters, 'q' to quit.

Hello world!

H

e

l

l

o

w

o

r

l

d

!

q

例3 中的①和②兩行創建了一個與鍵盤相連的BufferedReader對象,這裏使用read()方法來讀取字符,當到達流的末尾時返回-1,輸入q退出程序。輸出我們使用的是println()方法,每次輸出後都換行。

控制檯輸入字符我們使用的是read()方法,輸入字符串的話我們可以使用readLine()方法,和輸入字符非常相似,只需要將例3中的read()方法換成readLine()方法即可,同時將改爲String類型,由於比較簡單,此處不再贅述。

  提高

我們來看java工具包中的輸入類Scanner。

創建Scanner類的對象時,需要用 作爲它的參數,也可以將Scanner看作是對象的支持者,取得用戶輸入的內容後,交給Scanner來作一些處理.

Scanner類中提供了多個方法:next():取得一個字符串;

hasNext():是否還有輸入;

nextInt():將取得的字符串轉換成int類型的整數;

nextFloat():將取得的字符串轉換成float型;

nextBoolean():將取得的字符串轉換成boolean型;

提示

使用Scanner非常方便,但也有不足,Scanner取得輸入的依據是空格符,包括空格鍵,Tab鍵和Enter鍵.當按下這其中的任一鍵 時,Scanner就會返回下一個輸入. 當你輸入的內容中間包括空格時,顯然,使用Scanner就不能完整的獲得你輸入的字符串.

例4 Scanner

public static void main(String[] args){

Scanner sc = new Scanner(new BufferedInputStream());

while(ext()){

int m = Int();

String str = ();

for(int i=0; i

tln(Int());

}

}

}

正如我們在例子中看到的,java允許使用向控制檯寫數據,但在實際的項目中,它推薦使用PrintWriter,它是基於字符的。

PrintWriter支持所有類型(包括Object)的print( )和println( )方法,這樣,我們就可以像用那樣用這些方法。如果遇到不同類型的情況,PrintWriter方法調用對象的toString( )方法並打印結果。

例5 控制檯的輸出

import .*;

public class TestAbstract {

public static void main(String args[]) {

PrintWriter printerWriter = new PrintWriter(, true);

tln("Hello World!");

int i = -10;

tln(i);

double d = 0.00003;

tln(d);

}

}

D:java>java TestAbstract

Hello World!

-10

3.0E-5

例5 中的new PrintWriter(, true)新建了一個PrinterWriter對象,指定輸出流爲,true是每一行輸出之後進行刷新。

  文件的輸入輸出

文件

文件File 位於包中,用於描述文件和目錄的操作。創建文件對象如下:

File file = new File("");//文件位於當前目錄下

File file = new File("/home/user","");//文件位於/home/user目錄下

除了上述的File構造方法之外,還有很多和File相關的方法如下:

exists() 判斷文件或目錄是否存在

mkdir() 創建目錄

isFile()/isDirectory() 判斷是文件還是目錄

delete() 刪除文件

getPath() 獲取文件或者目錄的路徑

list() 將目錄中所有文件名保存在字符串數組中返回

例6 文件相關操作

import .*;

public class TestAbstract {

public static void main(String args[]) throws IOException {

File dir = new File("D:/java");

File file1 = new File(dir, "");

File file2 = new File(dir, "");

if (!ts())

r();

if (!ts())

teNewFile();

if (!ts())

teNewFile();

tln("file1's AbsolutePath= " + bsolutePath());

tln("file2's AbsolutePath= " + bsolutePath());

tln("file1 Canread=" + ead());

tln("file1's len= " + th());

String[] fileList = ();

tln("there are " + th + " file(s) in D:");

}

}

運行結果:

D:java>java TestAbstract

file1's AbsolutePath= D:java

file2's AbsolutePath= D:java

file1 Canread=true

file1's len= 0

there are 133 file(s) in D:

  I/O

文件處理最常用的兩個流是FileInputStream和FileOutputStream,初始化的形式爲:

FileInputStream(String fileName) throws FileNotFoundException

FileOutputStream(String fileName) throws FileNotFoundException

或者

FileInputStream(File fileName) throws FileNotFoundException

FileOutputStream(File fileName) throws FileNotFoundException

讀文件使用的是FileInputStream中定義的read()方法,它有很多種形式,具體可參考FileInputStream,寫文件是使用FileOutputStream中定義的write()方法,詳細參考FileOutputStream

  提示

當你對文件的操作結束後,需要調用close( )來關閉文件。