IO稱之爲輸入輸出,Java的IO是經過java.io包下的類和接口來支持,包含兩大類:輸入,輸出. java
在整個Java.io包中最重要的就是5個類和一個接口。5個類指的是File、OutputStream、InputStream、Writer、Reader;一個接口指的是Serializable.掌握了這些IO的核心操做那麼對於Java中的IO體系也就有了一個初步的認識了。 數組
File類是java.io下表明與平臺無關的文件和目錄.也就是說若是要操做文件和目錄,均可以經過File來操做.File不能訪問訪問文件自己,若是須要訪問文件自己,須要使用輸入/輸出流. 網絡
File 類有一個欺騙性的名字——一般會認爲它對付的是一個文件,但實情並不是如此。
它既表明一個特定文件 的名字,也表明目錄內一系列文件的名字。
若表明一個文件集,即可用list()方法查詢這個集,返回的是一 個字串數組。之因此要返回一個數組,而非某個靈活的集合類,是由於元素的數量是固定的。並且若想獲得 一個不一樣的目錄列表,只需建立一個不一樣的File 對象便可。
事實上,「FilePath 」(文件路徑)彷佛是一個 更好的名字。 ide
----摘自 think in java 工具
代碼示例File的使用:package org.credo.io; import java.io.File; import java.io.IOException; public class FileTest { @SuppressWarnings("static-access") public static void main(String[] args) throws IOException { //以當前路徑來建立一個File對象 File file=new File("credo"); System.out.println("直接獲取文件名:"+file.getName()); System.out.println("獲取文件相對路徑的父路徑可能出錯,輸出爲NULL:"+file.getParent()); System.out.println("獲取絕對路徑:"+file.getAbsolutePath()); System.out.println("獲取絕對路徑對應的File對象:"+file.getAbsoluteFile()); System.out.println("獲取上一級路徑:"+file.getAbsoluteFile().getParent()); System.out.println("file:"+file); //檢查是否存在,先建立目錄。而後建立文件.否則報java.io.IOException: 系統找不到指定的路徑. if(!file.exists()){ file.mkdirs(); } //在當前路徑下建立一個臨時文件,名aaa屬性爲txt的. File tmpFile=File.createTempFile("aaa", ".txt",file); //JVM退出時刪除該文件,另外一個delete是直接刪除. tmpFile.deleteOnExit(); //以系統當前時間做爲新文件名來建立新文件. File newFile=new File(System.currentTimeMillis()+""); System.out.println("判斷newFile是否存在:"+newFile.exists()); //以指定的newFile對象來建立一個文件 newFile.createNewFile(); //以newFile對象來建立一個目錄,由於newFile已經存在因此下面方法返回false,沒法建立該目錄 newFile.mkdir(); //使用list()方法列出當前路徑下的全部文件和路徑 String[] fileList=file.list(); System.out.println("=========當前路徑下全部文件和路徑以下==========="); for(String fileName:fileList){ System.out.println("fileName:"+fileName); } //listRoots()靜態方法列出全部的磁盤根路徑 File[] roots=file.listRoots(); System.out.println("==========系統全部根路徑以下======="); for(File root:roots){ System.out.println("root:"+root); } } }跟具體的請查閱java API.
在File類的list()方法中能夠接收一個FilenameFilter參數,經過該參數能夠只列出符合條件的文件.
FilenameFilter接口裏包含了一個accept(File dir,String name)方法,該方法將依次對指定File的全部子目錄或者文件進行迭代,若是該方法返回true,則list()方法會列出該子目錄或者文件. spa
package org.credo.io; import java.io.File; import java.io.FilenameFilter; public class FileNameFilterTest { public static void main(String[] args) { //以當前路徑來建立一個File對象 File file=new File("."); String[] nameList=file.list(new MyFileNameFilter()); for(String str:nameList){ System.out.println(str); } } } class MyFileNameFilter implements FilenameFilter{ @Override public boolean accept(File dir, String name) { //若是文件名以.java結尾,或者文件對應一個路徑,則返回true return name.endsWith(".java")||new File(name).isDirectory(); } }
按照流的流向來分,能夠分爲輸入流和輸出流. 設計
輸入流 | 只能讀取數據,不能寫入數據.java裏由InputStream和Reader做爲基類.抽象基類,沒法建立實例. |
輸出流 | 只能寫入數據,不能讀取數據.java裏由OutputStream和Writer做爲基類.抽象基類,沒法建立實例. |
字節流和字符流的用法基本一致的.區別是字節流操做的數據單元是8位的字節.而字符是16位的字符.一個字節byte是8位二進制.Java中的字符char是unicode碼,佔2個字節,即16位.
字節流是由InputStream和OutputStream做爲基類.而字符流主要由Reader和Writer做爲基類. code
或者這麼解釋:Byte Stream皆起源與InputStream和OutputStream. Char Stream皆起源與Reader和Writer. 字符和字節的區別是,字符是字符集中一個有意義的字符單元. 而字節只是一個8bit二進制數據. 對象
字節流最原始的方法是InputStream的read()和OutputStream的write(). 分別爲讀取一個字節和寫入一個字節. 在InputStream和OutputStream之上,包裝了不少字節流工具,來一次性的讀或者寫多個字符. 但不管如何調用什麼方法,最終包裝過的方法都是經過調用最原始的read()和write()來操做流.
字符流最原始的方法是Reader的read()和Writer的write()方法.分別爲讀取一個字符或寫入一個字符.同上,包裝的字符流工具最終也是在和原始的read()和write()在打交道. 接口
下面是兩個體系圖:
因爲存在大量不一樣的設計方案,因此該任務的困難性是很容易證實的。其中最大的挑戰彷佛是如何覆蓋全部
可能的因素。不只有三種不一樣的種類的 IO 須要考慮(文件、控制檯、網絡鏈接),並且須要經過大量不一樣的
方式與它們通訊(順序、隨機訪問、二進制、字符、按行、按字等等)。
Java 庫的設計者經過建立大量類來攻克這個難題。
----摘自 think in java
下面是字節流的
下面是字符流的: