1.程序在運行期間,可能需要從外部的存儲媒介或其他程序中讀入所需要的數據,
這就需要使用輸入流對象。
2.輸入流的指向稱作它的源,程序從指向源的輸入流中讀取源中讀取源中的數據。
3.程序在處理數據後,可能需要將處理的結果寫入到永久的存儲媒介中或傳送給
其他的應用程序,這就需要使用輸出流對象。
4.輸出流的指向稱作它的目的地,程序通過向輸出流中寫入數據把數據傳送到目
的地。
5.在Java中,將通過不同輸入/輸出設備(鍵盤,內存,顯示器,網絡等)之間的數據
傳輸抽象表述爲“流”。Java中的“流”都位於java.io包中,稱爲IO(輸入/輸出)流。
6.按照處理數據的單位不同分爲字節流和字符流。
7.Java把處理二進制數據的流稱爲字節流,字節流每次處理一個字節的數據,
以Stream結尾,說明是字節流。(例如:處理英文字符)
8.把處理某種格式的特定數據稱爲字符流,字符流每次處理一個字符的數據。
以Reader / Writer結尾,說明是字符流。(例如:處理漢字)
File類
1.File類是java.io包中唯一處理磁盤文件和目錄的類。它定義的對文件和目錄操作的方法
都是與平臺無關的,通過使用File類提供的各種方法能夠創建、刪除文件和目錄,獲取磁盤
上指定文件和目錄的相關信息。
2.File類的常用方法
創建功能
public boolean createNewFile()
public boolean mkdir()
public boolean mkdirs()
刪除功能
public boolean delete()
重命名功能
public boolean renameTo(File dest)
mkdir()
只能在已經存在的目錄中創建創建文件夾。
mkdirs()
可以在不存在的目錄中創建文件夾。諸如:a\\b,既可以創建多級目錄。
3.在Unix/Linux操作系統下,路徑分隔符爲“/”,而在Windows和DOS下的路徑分隔符爲“\”。
Java對這兩種分隔符都支持。但是如果使用“\”作爲分隔符,注意要以轉義字符“\\”來代替,
例如以“c:\\sun\\jdk”表示“c:\sun\jdk”。
4.使用File(String filename)創建文件,當filename是文件名字時,該文件被認爲與
當前應用程序在同一目錄中。
5.遍歷目錄下的文件:
如果希望得到指定類型的文件,如獲取指定目錄下所有的'.java'文件,則可以使用重載
的list(FilenameFilter filter)方法,該方法接收一個FilenameFilter類型的參數。
FilenameFilter是一個接口,被稱作文件過濾器,其中定義了一個抽象的方法
accept(File dir,String name),在調用list()方法時,需要實現文件過濾器,
在accept()方法中做出判斷,從而獲取到指定類型的文件。
6.list(FilenameFilter filter)方法的工作原理如下:
1️⃣調用list()方法傳入FilenameFilter文件過濾器對象;
2️⃣取出當前File對象所代表目錄下的所有子目錄和文件
3️⃣對於每一個子目錄或文件,都會調用文件過濾器對象的accept(File dir,String name)
方法,並把代表當前目錄的File對象以及這個子目錄或文件的名稱作爲參數dir和name傳遞
給方法。
4️⃣如果accept()方法返回true,就將當前遍歷的這個子目錄或文件添加到數組中,如果
返回false,則不添加。
如何遍歷指定目錄下所有擴展名爲.java的文件:
如果想得到所有子目錄下的File類型對象,list()方法顯然不能滿足,這時,可
以使用listFiles()方法,該方法返回一個File對象數組。
在操作文件時,經常需要刪除一個目錄下的某個文件或者刪除整個目錄,這時,首先會想到File類的delete()方法,但該方法無法刪除目錄。
刪除文件失敗了。因爲File類的delete()方法只是刪除一個指定的文件,假如File對象代表目錄,並且目錄下包含子目錄或文件,則File類的delete()方法不允許對這個目錄直接刪除。
定義了一個刪除目錄的靜態方法deleteDir(),接收一個File類型的參數。在這個方法中,調用listFiles()方法把這個目錄下所有的子目錄和文件保存到一個File類型的數組files中,然後遍歷files,如果是目錄就重新調用deleteDir()方法進行遞歸,如果是文件就直接調用File的delete()方法刪除。當刪除完一個目錄下的所有文件後,再刪除當前這個目錄,這樣便從裏層到外層遞歸的刪除了整個目錄。
需要注意的是,Java中刪除目錄是從虛擬機直接刪除而不進入回收站。
運行可執行文件:
1.當要執行一個本地機上的可執行文件時,可以使用java.lang包中的Runtime類。
首先使用Runtime類聲明一個對象。如:Runtime ec;
2.然後使用該類的getRuntime()靜態方法創建這個對象:
ec=Runtime.getRuntime();
3.ec可以調用exec(String command)方法打開本地計算機的可執行文件或執行一個操作
//例如打開IE上搜狐:file=new File(“C:\\Program Files\\Internet Explorer”,
“IEXPLORE www.sohu.com”);
字節流與字符流
字節流
1.在JDK中,提供了兩個抽象類InputStream和OutputStream,它們是字節流的
頂級父類,所有的字節輸入流繼承自InputStream,所有的字節輸出流都繼承自
OutputStream。
1.InputStream和OutputStream兩個類雖然提供了一系列和讀寫數據相關的方法,但這兩個
類是抽象類,不能被實例化。
2.針對文件的讀寫,JDK專門提供了兩個類,分別是FileInputStream和FileOutputStream
,其中FileInputStream是InputStream的子類,它是操作文件的字節輸入流,專門用於
讀取文件中的數據。
字節流讀寫文件
1.與FileInputStream對應的是FileOutputStream
2.FileOutputStream是OutputStream的子類,它是操作文件的字節輸出流,專門用於把
數據寫入文件
3.long skip(long numBytes):輸入流調用該方法跳過numBytes個字節,並返回實際
跳過的字節數目。
4.OutStream流以字節爲單位順序地寫文件,只要不關閉流,每次調用write方法就順序
地向目的地寫入內容,直到流被關閉。
字節流緩衝區
爲了提高拷貝文件的效率,可以定義一個字節數組作爲緩衝區。在拷貝文件時,可以一次性讀取多個字節的數據,並保存在字節數組中,然後將字節數組中的數據一次性寫入文件。
字節緩衝流
在IO包中提供兩個帶緩衝的字節流,分別是BufferedInputStream和BufferdOutputStream,這兩個流都使用了裝飾設計模式。它們的構造方法中分別接收InputStream和OutputStream類型的參數作爲被包裝對象,在讀寫數據時提供緩衝功能。
字符流
字符流
1.同字節流一樣,字符流也有兩個抽象的頂級父類,分別是Reader和Writer,只提供了
一系列用於字符流處理的接口。它們的方法與類InputStream和OutputStream類似,只不
過其中的參數換成字符或字符數組。
2.Reader是字符輸入流,用於從某個源設備讀取字符。
3.Writer是字符輸出流,用於向某個目標設備寫入字符。
4.字符流讀取字符, 就要先讀取到字節數據, 然後轉爲字符。 如果要寫出字符, 需要把
字符轉爲字節再寫出。
5.轉換流是一種包裝流,其中OutputStreamWriter是Writer的子類,可以將一個字節流
輸出流包裝成字符輸出流,方便直接寫入字符,而InputStreamReader是Reader的子類,
它可以將一個字節輸入流包裝成字符輸入流,方便直接讀取字符。