Properties-轉換流-打印流-序列化和反序列化-Commons-IO工具類

一.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){}:將字符串寫入到指定的文件中;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章