一.Properties 類(java.util)
概述:Properties 是一個雙列集合;Properties 屬於map的特殊的孫子類;Properties 類沒有泛型,properties集合的key和value都是固定的數據類型
(String),該集合提供了一些特有的方法存取值,是唯一一個可以與IO流相結合的集合;
定義:public class Properties extends Hashtable<Object,Object>
注: public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable
構造方法:Properties():創建一個無默認值的空屬性列表
常用方法:
特有方法: public String getProperty(String key){}:用指定的鍵在此屬性列表中搜索屬性
public Object setProperty(String key, String value){}:調用 Hashtable 的方法 put()向集合中存鍵值對;
public Set<String> stringPropertyNames(){}:返回此屬性列表中的鍵集,其中該鍵及其對應值是字符串,
如果在主屬性列表中未找到同名的鍵,則還包括默認屬性列表中不同的鍵。
與IO流結合的方法:
public void load(InputStream instream) throws IOException{}:從輸入流中讀取屬性列表(鍵和元素對)。(文件-->集合)
public void load(Reader reader) throws IOException{}:按簡單的面向行的格式從輸入字符流中讀取屬性列表(鍵和元素對). (文件-->集合)
public void store(OutputStream out, String comments) throws IOException{}:以適合使用 load(InputStream) 方法加載到 Properties 表中的格式,
將此 Properties 表中的屬性列表(鍵和元素對)寫入輸出流。Comments 是對整個文件的解釋說明的話,
不能寫中文,因爲固定使用ISO8859-1的編碼,一般直接寫""; (集合-->文件)
public void store(Writer writer, String comments) throws IOException{}:以適合使用 load(Reader) 方法的格式,
將此 Properties 表中的屬性列表(鍵和元素對)寫入輸出字符。(集合-->文件)
注意事項:
1:一般情況下如果一個文件與properties集合相結合,那麼文件的後綴名是:.properties;
也可以自定義後綴名;如果後綴名是:.properties;那麼文件中的內容自動使用ISO8859-1編碼;
如果後綴名是其他的,文件使用工作空間默認的編碼;使用load方法,加載數據的時候,註釋的內容會被忽略;
2:與properties集合結合的文件中的數據格式,必須以鍵值對的形式存在;
代碼演示1:
/* Properties的基本使用:創建/添加/取值/迭代 */ import java.util.Properties; import java.util.Set; public class PropertiesDemo{ public static void main(String[] args){ //創建Properties集合對象 Properties p = new Properties(); //向集合中添加元素 p.setProperty("1","Jack"); p.setProperty("2","Rose"); p.setProperty("3","Smith"); //取值 String name = p.getProperty("1"); System.out.println(name);//Jack //迭代 //把鍵值取出stringPropertyNames(),返回set集合 Set<String> keySet = p.stringPropertyNames(); for(String s : keySet){ System.out.println(s+"===>"+p.getProperty(s)); } } }
代碼演示2:
/* 向Properties集合中添加元素並以字節流的形式存入到硬盤文件(txt,GBK) 再讀取到集合中 */ import java.util.Properties; import java.io.FileOutputStream; import java.io.IOException; import java.io.FileInputStream; public class PropertiesDemo02{ public static void main(String[] args) throws IOException{ //創建Properties集合 Properties p = new Properties(); //向集合中添加元素 p.setProperty("1","Rose"); p.setProperty("2","Jack"); //創建基本輸出字節流 FileOutputStream fout = new FileOutputStream("names.txt");//如果不是.properties結尾的文件默認爲工作空間的編碼格式 //存入磁盤 p.store(fout,""); //關閉流 fout.close(); //創建基本輸入字節流 FileInputStream fin = new FileInputStream("names.txt"); //讀入集合 p.load(fin); //關閉流 fin.close(); System.out.println(p);//{2=Jack, 1=Rose} } }
二.記住四套繼承關係:
字節流兩套:
java.lang.Object--java.io.OutputStream--java.io.FileOutputStream
java.lang.Object--java.io.InputStream--java.io.FileInputStream
高效字節流兩套:
java.lang.Object--java.io.OutputStream--java.io.FilterOutputStream--java.io.BufferedOutputStream
java.lang.Object--java.io.InputStream--java.io.FilterInputStream--java.io.BufferedInputStream
字符流兩套:
java.lang.Object--java.io.Writer--java.io.OutputStreamWriter (轉換流)--java.io.FileWriter
java.lang.Object--java.io.Reader--java.io.InputStreamReader (轉換流)--java.io.FileReader
緩衝字符流兩套:
java.lang.Object--java.io.Writer--java.io.BufferedWriter
java.lang.Object--java.io.Reader--java.io.BufferedReader
三.轉換流
按照方向,轉換流可以分爲:
用於讀數據的轉換流,字節流-->字符流的橋樑!
用於寫數據的轉換流,字符流-->字節流的橋樑!
Java 中的類:
OutputStreamWriter(程序-->硬盤 寫數據 字符流對象轉換成字節流對象)
InputStreamReader (硬盤-->程序 讀數據 將輸入的字節流變爲字符流)
兩個轉換流都屬於字符流的範疇;
作用:可以讀或寫指定編碼的文件!
OutputStreamWriter 有一個直接子類:FileWriter; Writer--OutputStreamWriter--FileWriter
InputStreamReader 有一個直接子類:FileReader; Reader--InputStreamReader--FileReader
適用場景:
當不需要考慮編碼的時候,建議使用子類;
如果需要考慮編碼的時候,使用父類(OutputStreamWriter/OutputStreamReader 轉換流);
四.OutputStreamWriter 類(java.io)
介紹:OutputStreamWriter 主要用於向硬盤中寫指定編碼格式的信息;
定義:public class OutputStreamWriter extends Writer
構造方法:
OutputStreamWriter(OutputStream out, String charsetName):創建使用指定字符集的 OutputStreamWriter。
OutputStreamWriter(OutputStream out):創建使用默認字符編碼的 OutputStreamWriter。
常用方法:
public void close() throws IOException(){}:關閉流(關閉前先刷新);
public void flush() throws IOException(){}:刷新流;
public void write(char[] cbuf, int off, int len){}:寫入字符數組的某一部分
public void write(int c) throws IOException(){}:寫入單個字符
public void write(String str, int off, int len){}:寫入字符串的某一部分
注意:write()方法可以直接寫入字符串,但是read()方法不能直接讀取,需轉成char[]
五.InputStreamReader 類(java.io)
介紹:InputStreamReader 主要用於從硬盤中讀指定編碼格式的信息
定義:public class InputStreamReader extends Reader
構造方法:
InputStreamReader(InputStream in, String charsetName):創建使用指定字符集的 InputStreamReader。
InputStreamReader(InputStream in) 創建一個使用默認字符集的 InputStreamReader。
常用方法:
public void close() throws IOException{}:關閉流
public int read() throws IOException{}:讀取單個字符
public int read(char[] cbuf,int offset,int length) throws IOException{}:讀入字符數組中的某一部分
回顧:
String(char[] value, int offset, int count):分配一個新的 String,它包含取自字符數組參數一個子數組的字符
代碼演示:
import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.IOException; import java.io.FileOutputStream; import java.io.OutputStreamWriter; public class StreamDemo02{ public static void main(String[] args) throws IOException{ //創建字節輸出流 FileOutputStream out = new FileOutputStream("E:\\JAVAPractice\\IO\\stream.txt"); //創建轉換流,以UTF-8的編碼寫入 OutputStreamWriter ow = new OutputStreamWriter(out,"UTF-8"); //準備寫入的內容 String s = "我愛APPLE"; ow.write(s); ow.close(); //創建字節輸入流 FileInputStream in = new FileInputStream("E:\\JAVAPractice\\IO\\stream.txt"); //創建轉換流,告訴程序應該是什麼編碼系統 InputStreamReader inr = new InputStreamReader(in, "UTF-8"); //定義i用來存儲讀取到的字節碼值 int i = -1; char[] c = new char[1024]; while((i = inr.read(c)) != -1){ String str = new String(c,0,i); System.out.print(str); } inr.close(); } }
六.打印流
概述:打印流僅用於向文件中輸出內容用,打印流在輸出數據的時候,不會拋出IO異常;打印流一共有2個:
printStream:屬於字節流;早期版本;1.0
printWriter:屬於字符流;後來的版本,1.1;
這兩個流的功能幾乎是一致;
特點:
所見即所得!
區別:
1:自動刷新的方式不同;
2:主要操作的內容不同,printStream主要操作字節數據,printWriter主要操作字符數據;
兩套繼承關係:
java.lang.Object--java.io.OutputStream--java.io.FilterOutputStream--java.io.PrintStream
java.lang.Object--java.io.Writer--java.io.PrintWriter
七.PrintStream (打印流)類(java.io)
定義:public class PrintStream extends FilterOutputStream implements Appendable, Closeable
構造方法:
PrintStream(File file) 創建具有指定文件且不帶自動行刷新的新打印流。
PrintStream(File file, String csn) 創建具有指定文件名稱和字符集且不帶自動刷新的新打印流。
-------------------------------------------------------------------------------------------
PrintStream(OutputStream out) 創建新的打印流。
PrintStream(OutputStream out, boolean autoFlush) 創建新的打印流,若爲true,可自動刷新
PrintStream(OutputStream out, boolean autoFlush, String encoding) :創建新的打印流。若爲true,可自刷新,並指定字符集
-------------------------------------------------------------------------------------------------------------------
PrintStream(String fileName):創建具有指定文件名稱且不帶自動行刷新的新打印流
PrintStream(String fileName, String csn):創建具有指定文件名稱和字符集且不帶自動行刷新的新打印流。
-----------------------------------------------------------------------------------------------------
常用方法:
public void print(Object obj):
public void println():
八.PrintWriter (打印流)類(java.io)
定義:public class PrintWriter extends Writer
構造方法:
PrintWriter(File file):使用指定文件創建不具有自動行刷新的新 PrintWriter。
PrintWriter(File file, String csn):創建具有指定文件和字符集且不帶自動刷行新的新 PrintWriter。
-------------------------------------------------------------------------------------------
PrintWriter(OutputStream out):根據現有的 OutputStream 創建不帶自動行刷新的新 PrintWriter。
PrintWriter(OutputStream out, boolean autoFlush):通過現有的 OutputStream 創建新的 PrintWriter。
----------------------------------------------------------------------------------------------
PrintWriter(String fileName):創建具有指定文件名稱且不帶自動行刷新的新 PrintWriter。
PrintWriter(String fileName, String csn):創建具有指定文件名稱和字符集且不帶自動行刷新的新 PrintWriter。
-------------------------------------------------------------------------------------------------------
PrintWriter(Writer out):創建不帶自動刷新的新 PrintWriter。
PrintWriter(Writer out, boolean autoFlush):創建新 PrintWriter。
---------------------------------------------------------------------------------------------
常用方法:同PrintStream
九.序列化和反序列化
概述:
序列化:將程序中的對象,保存到硬盤上,這個過程稱爲序列化;Java 中提供了一個類:ObjectOutputStream,用於序列化;
反序列化:將硬盤上對象讀取到程序中,並形成一個新的java對象,個過程稱爲反序列化;ObjectInputStream,用於反序列化;
十.ObjectOutputStream 類(java.io) 用於序列化
概述:
ObjectOutputStream 將 Java 對象的基本數據類型和圖形寫入 OutputStream。可以使用 ObjectInputStream 讀取(重構)對象。
注意事項:
1:被序列化的對象必須實現Serializable接口;
2:必須提供屬性的getXxx與setXXx方法;
3:必須有空參數的構造方法;
定義:public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants
構造方法:
ObjectOutputStream(OutputStream out)
常用方法:
public final void writeObject(Object obj) throws IOException{}:將指定的對象寫入 ObjectOutputStream。
十一.ObjectInputStream 類(java.io) 用於反序列化
概述:ObjectInputStream 對以前使用 ObjectOutputStream 寫入的基本數據和對象進行反序列化。
定義:public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants
構造方法:
public ObjectInputStream(InputStream in) throws IOException
常用方法:
public final Object readObject() throws IOException, ClassNotFoundException{}:從 ObjectInputStream 讀取對象。
調用一次,讀一個對象,如果文件中沒有下一個對象了,再調用該方法,會拋出異常;
建議:每個文件中只保存一個對象,只讀一次;
反序列化注意事項:
1:如果一個對象已經序列化了,不能修改java類,否則會報錯;解決:手動添加一個屬性,定死一個版本號即可;
2:如果屬性不想序列化,可以使用關鍵字:transient或static;
十二.工具類的使用步驟:
1:從網上下載對應的zip並解壓;
2:複製核心jar包到工程中;
3:將jar添加到本地工程;(add to build path)
4:直接使用核心類,調用方法;
十三.Commons-IO 工具類
工具的核心類:
FileUtils:主要用於文件與文件夾的IO操作;
FileNameUtils:主要用於文件名的操作;
核心jar包:commons-io-2.4.jar
FileUtils 常用方法:(一般均爲靜態方法,類名直接調用即可)
public static void copyDirectory(File srcDir, File destDir){}:複製文件夾,(不包含srcDir)(自動遞歸);
public static void copyDirectoryToDirectory(File srcDir, File destDir){}:複製文件夾,(包含srcDir)(自動遞歸);
public static void copyFile(File srcFile, File destFile){}:複製文件;
public static String readFileToString(File file){}:將文件的內容讀成一個字符串並返回;
public static void writeStringToFile(File file, String data){}:將字符串寫入到指定的文件中;