在上面兩篇文章中介紹了IO體系並詳細介紹了字節流以及字符流,本文主要是講述操作文件的File、轉化流、標準輸入與輸出、Properties、打印流以及序列流。
File
File英文爲"文件"的意識,正如其意識所表達的一樣,File代表的是對磁盤文件對象,File中封裝了對文件操作的一些方法,例如創建.刪除.重命名文件等操作。File類是對象主要用來獲取未文件本身的一些信息,如文件所在的目錄、文件的長度、文件的讀寫權限等。File對象可以作爲參數傳遞給流的構造函數。
構造方法:
|--File(File parent, String child)
根據 parent 抽象路徑名和 child 路徑名字符串創建一個新 File 實例。
|--File(String pathname)
通過將給定路徑名字符串轉換爲抽象路徑名來創建一個新 File 實例。
|--File(String parent, String child)
根據 parent 路徑名字符串和 child 路徑名字符串創建一個新 File 實例。
|--File(URI uri)
通過將給定的 file: URI 轉換爲一個抽象路徑名來創建一個新的 File 實例。
常見方法
1.創建
boolean createNewFile():在指定位置創建文件,如果該文件已經存在,則不創建,返回false。
boolean mkdir():創建文件夾。
boolean mkdirs():創建多級文件夾。
注:File類創建文件的方法createNewFile()與輸出流的方法不同點:
File類通過createNewFile方法來創建文件的話,如果文件存在則不創建
輸出流是對象一建立就創建文件,如果文件存在就會覆蓋原文件。
2.刪除
boolean delete():刪除失敗返回false。如果文件正在被使用,則刪除不了返回falsel。
void deleteOnExit():在程序退出時刪除指定文件。
3.判斷
boolean exists():文件或目錄是否存在。
boolean isFile():是否是一個標準文件。
boolean isDirectory():是否是一個目錄。
boolean isHidden():是否是一個隱藏文件。
boolean isAbsolute():是否爲絕對路徑名。
boolean canRead()是否可讀
boolean canWrite()是否可寫
4.獲取
String getName():返回由此抽象路徑名錶示的文件或目錄的名稱。
String getPath():獲取相對路徑
String getParent():獲取父級目錄,如果此路徑名沒有指定父目錄,則返回 null。
String getAbsolutePath():獲取絕對路徑
long lastModified():返回此抽象路徑名錶示的文件最後一次被修改的時間。
long length():返回由此抽象路徑名錶示的文件的長度.
static File[] listRoots():列出系統的可用的根
String[] list():獲取指定目錄下的所有文件和文件夾的名稱數組
File[] listFiles():獲取指定目錄下的所有文件和文件夾的File數組
5.修改
boolean renameTo(File dest):重新命名此抽象路徑名錶示的文件。
轉換流
IO流分爲字節流與字符流,但是如何實現字節流與字符流之間的轉化呢?這就要使用到下面所講的內容了。
InputStreamReader
字節流轉化爲字符流的橋樑,它使用指定的 charset 讀取字節並將其解碼爲字符。它使用的字符集可以由名稱指定或顯式給定,或者可以接受平臺默認的字符集。每次調用 InputStreamReader 中的一個 read() 方法都會導致從底層輸入流讀取一個或多個字節。爲了達到最高效率,可要考慮在 BufferedReader 內包裝 InputStreamReader。
構造方法:
InputStreamReader(InputStream in)
InputStreamReader(InputStream in, String charsetName)
示例:BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
OutputSteamWriter
字符流通向字節流的橋樑可使用指定的 charset 將要寫入流中的字符編碼成字節。它使用的字符集可以由名稱指定或顯式給定,否則將接受平臺默認的字符集。每次調用 write() 方法都會導致在給定字符(或字符集)上調用編碼轉換器。爲了達到最高效率,可要考慮在 BufferedReader 內包裝 InputStreamReader。
構造方法:
OutputStreamWriter(OutputStream out)
OutputStreamWriter(OutputStream out, String charsetName)
應用示範
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
System.in 默認設備爲鍵盤
標準輸入與輸出
System類中的字段:in,out,它們各代表了系統標準的輸入和輸出設備,默認輸入設備是鍵盤,輸出設備是顯示器。
System.in的類型是InputStream.
System.out的類型是PrintStream
Properties類
Properties是hashtable的子類,也就是說它具備map集合的特點。而且它裏面存儲的鍵值對都是字符串。
是集合中和IO技術相結合的集合容器。
該對象的特點:可以用於鍵值對形式的配置文件,那麼在加載數據時,需要數據有固定格式:鍵=值。
構造方法:
|--Properties():創建一個無默認值的空屬性列表。
|--Properties(Properties defaults):創建一個帶有指定默認值的空屬性列表。
常用方法:
|--Object setProperty(String key,String value)
調用Hashtable的put方法,設置鍵值對
|--String getProperty(String key)
用指定的鍵在此屬性列表中搜索屬性
|--Set<String> stringPropertyNames
獲取集合中所有的鍵
|--void load(InputStream in)
從輸入流中讀取屬性列表(鍵和元素對)。
|--void load(Reader reader)
按簡單的面向行的格式從輸入字符流中讀取屬性列表(鍵和元素對)。
|--void list(PrintStream out)
將屬性列表輸出到指定的輸出流。
|--void list(PrintWriter out)
將屬性列表輸出到指定的輸出流。
|--void Store(OutputStream out,String comments)
以適合使用 load(InputStream) 方法加載到 Properties 表中的格式,將此 Properties 表中的屬性列表(鍵和元素對)寫入輸出流。
|--void store(Writer writer, String comments)
以適合使用 load(Reader) 方法的格式,將此 Properties 表中的屬性列表(鍵和元素對)寫入輸出字符。
打印流
可以直接操作輸入流和文件,該流提供了打印方法,可以將各種數據類型的數據都原樣打印。
字節打印流:PrintStream
構造函數可以接收的參數類型:
1.file對象:File
2.字符串路徑:String
3.字節輸出流:OutputStream
字符打印流:PrintWriter
構造函數可以接收的參數類型:
1.file對象:File
2.字符串路徑:String
3.字節輸出流:OutputStream
4.字符輸出流:Writer
注:與其他輸出流不同,PrintStream 永遠不會拋出IOException,而且打印流可以根據指定編碼轉成字符!