上一節(jié),我們學(xué)習(xí)了文件字節(jié)輸入流的構(gòu)造方法,這一節(jié),我們繼續(xù)學(xué)習(xí)如何使用輸入流讀取字節(jié)以及關(guān)閉流。
1.使用輸入流讀取字節(jié)
輸入流的目的是提供讀取源中數(shù)據(jù)的通道,程序可以通過這個(gè)通道讀取源中的數(shù)據(jù),文件字節(jié)流可以調(diào)用從父類繼承的read方法順序地讀取文件,只要不關(guān)閉流,每次調(diào)用read方法就順序地讀取文件中的其余內(nèi)容,直到文件的末尾或文件字節(jié)輸入流被關(guān)閉。
字節(jié)輸入流的read方法以字節(jié)為單位讀取源中的數(shù)據(jù)。
1)int read()
輸入流調(diào)用該方法從源中讀取單個(gè)字節(jié)的數(shù)據(jù),該方法返回字節(jié)值(0~255之間的一個(gè)整數(shù)),如果未讀出字節(jié)就返回-1。
2)int read(byte b[])
輸入流調(diào)用該方法從源中試圖讀取b.length個(gè)字節(jié)到字節(jié)數(shù)組b中,返回實(shí)際讀取的字節(jié)數(shù)目。如果到達(dá)文件的末尾,則返回-1。
3)int read(byte b[],int off,int len)
輸入流調(diào)用該方法從源中試圖讀取len個(gè)字節(jié)到字節(jié)數(shù)組b中,并返回實(shí)際讀取的字節(jié)數(shù)目。如果到達(dá)文件的末尾,則返回-1,參數(shù)off指定從字節(jié)數(shù)組的某個(gè)位置開始存放讀取的數(shù)據(jù)。
注意:FileInputStream流順序地讀取文件,只要不關(guān)閉流,每次調(diào)用read方法就順序地讀取源中其余的內(nèi)容,直到源的末尾或流被關(guān)閉。
2.關(guān)閉流
輸入流都提供了關(guān)閉方法close(),盡管程序結(jié)束時(shí)會自動(dòng)關(guān)閉所有打開的流,但是當(dāng)程序使用完流后,顯示地關(guān)閉任何打開的流仍是一個(gè)良好的習(xí)慣。如果沒有關(guān)閉那些被打開的流,那么就可能不允許另一個(gè)程序操作這些流所用的資源。
例如:
import java.io.*; public class Main { public static void main(String args[]) { int n = -1; byte [] a = new byte[100]; try { File f = new File("Main.java"); InputStream in = new FileInputStream(f); while((n = in.read(a,0,100)) !=-1) { String s = new String (a,0,n); System.out.print(s); } in.close(); } catch(IOException e) { System.out.println("File read Error"+e); } } }
注意:當(dāng)把讀入的字節(jié)轉(zhuǎn)化為字符串時(shí),要把實(shí)際讀入的字節(jié)轉(zhuǎn)化為字符串,例如上述例子中:
String s = new String (a,0,n);
不可寫成:
String s = new String (a,0,100);
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個(gè)爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程