16、IO (Properties、序列化流、打印流、CommonsIO)
阿新 • • 發佈:2019-02-05
獲取文件 ocs 字節打印流 解壓 遍歷數組 tostring tab 變量 tof
Properties集合的特點
* A: Properties集合的特點 * a: Properties類介紹 * Properties 類表示了一個持久的屬性集。Properties 可保存在流中或從流中加載。屬性列表中每個鍵及其對應值都是一個字符串 * b: 特點 * Hashtable的子類,map集合中的方法都可以用。 * 該集合沒有泛型。鍵值都是字符串。 * 它是一個可以持久化的屬性集。鍵值可以存儲到集合中,也可以存儲到持久化的設備(硬盤、U盤、光盤)上。鍵值的來源也可以是持久化的設備。 * 有和流技術相結合的方法。 * c: 方法介紹 * load(InputStream inputStream) 把指定流所對應的文件中的數據,讀取出來,保存到Propertie集合中 * load(Reader reader) 按簡單的面向行的格式從輸入字符流中讀取屬性列表(鍵和元素對) * store(OutputStream outputStream,String commonts) 把集合中的數據,保存到指定的流所對應的文件中,參數commonts代表對描述信息 * stroe(Writer writer,String comments) 以適合使用 load(Reader) 方法的格式,將此 Properties 表中的屬性列表(鍵和元素對)寫入輸出字符
?
?
Properties集合存儲鍵值對
* A: Properties集合存儲鍵值對 * a: 方法介紹 * 集合對象Properties類,繼承Hashtable,實現Map接口 * 可以和IO對象結合使用,實現數據的持久存儲 * 使用Properties集合,存儲鍵值對 * setProperty等同與Map接口中的put * setProperty(String key, String value) * 通過鍵獲取值, getProperty(String key) * b: 案例代碼 public class PropertiesDemo { public static void main(String[] args)throws IOException { function_2(); } /* * 使用Properties集合,存儲鍵值對 * setProperty等同與Map接口中的put * setProperty(String key, String value) * 通過鍵獲取值, getProperty(String key) */ public static void function(){ Properties pro = new Properties(); pro.setProperty("a", "1"); pro.setProperty("b", "2"); pro.setProperty("c", "3"); System.out.println(pro); String value = pro.getProperty("c"); System.out.println(value); //方法stringPropertyNames,將集合中的鍵存儲到Set集合,類似於Map接口的方法keySet Set<String> set = pro.stringPropertyNames(); for(String key : set){ System.out.println(key+"..."+pro.getProperty(key)); } } }
?
Properties集合的方法load
* A: Properties集合的方法load * a: 方法介紹 * Properties集合特有方法 load * load(InputStream in) * load(Reader r) * 傳遞任意的字節或者字符輸入流 * 流對象讀取文件中的鍵值對,保存到集合 * b: 案例代碼 public class PropertiesDemo { public static void main(String[] args)throws IOException { function_1(); } /* * Properties集合特有方法 load * load(InputStream in) * load(Reader r) * 傳遞任意的字節或者字符輸入流 * 流對象讀取文件中的鍵值對,保存到集合 */ public static void function_1()throws IOException{ Properties pro = new Properties(); FileReader fr = new FileReader("c:\\pro.properties"); //調用集合的方法load,傳遞字符輸入流 pro.load(fr); fr.close(); System.out.println(pro); } }
Properties集合的方法store
* A: Properties集合的方法store
* a: 方法介紹
* Properties集合的特有方法store
* store(OutputStream out)
* store(Writer w)
* 接收所有的字節或者字符的輸出流,將集合中的鍵值對,寫回文件中保存
* b: 案例代碼
public class PropertiesDemo {
public static void main(String[] args)throws IOException {
function_2();
}
/*
* Properties集合的特有方法store
* store(OutputStream out)
* store(Writer w)
* 接收所有的字節或者字符的輸出流,將集合中的鍵值對,寫回文件中保存
*/
public static void function_2()throws IOException{
Properties pro = new Properties();
pro.setProperty("name", "zhangsan");
pro.setProperty("age", "31");
pro.setProperty("email", "[email protected]");
FileWriter fw = new FileWriter("c:\\pro.properties");
//鍵值對,存回文件,使用集合的方法store傳遞字符輸出流
pro.store(fw, "");
fw.close();
}
}
對象的序列化與反序列化
* A: 對象的序列化與反序列化
* a: 基本概念
* 對象的序列化
* 對象中的數據,以流的形式,寫入到文件中保存過程稱為寫出對象,對象的序列化
* ObjectOutputStream將對象寫道文件中,實現序列化
* 對象的反序列化
* 在文件中,以流的形式,將對象讀出來,讀取對象,對象的反序列化
* ObjectInputStream 將文件對象讀取出來
ObjectOutputStream流寫對象
* A: ObjectOutputStream流寫對象
* a: 簡單介紹
* IO流對象,實現對象Person序列化,和反序列化
* ObjectOutputStream 寫對象,實現序列化
* ObjectInputStream 讀取對象,實現反序列化
* b: 案例代碼
public class Person implements Serializable{
public String name;
public int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
public class ObjectStreamDemo {
public static void main(String[] args)throws IOException, ClassNotFoundException {
// writeObject();
readObject();
}
/*
* ObjectOutputStream
* 構造方法: ObjectOutputStream(OutputSteam out)
* 傳遞任意的字節輸出流
* void writeObject(Object obj)寫出對象的方法
*/
public static void writeObject() throws IOException{
//創建字節輸出流,封裝文件
FileOutputStream fos = new FileOutputStream("c:\\person.txt");
//創建寫出對象的序列化流的對象,構造方法傳遞字節輸出流
ObjectOutputStream oos = new ObjectOutputStream(fos);
Person p = new Person("lisi",25);
//調用序列化流的方法writeObject,寫出對象
oos.writeObject(p);
oos.close();
}
}
ObjectInputStream流讀取對象
* A: ObjectInputStream流讀取對象
* a: 簡單介紹
* ObjectInputStream
* 構造方法:ObjectInputStream(InputStream in)
* 傳遞任意的字節輸入流,輸入流封裝文件,必須是序列化的文件
* Object readObject() 讀取對象
* b: 案例代碼
/*
* IO流對象,實現對象Person序列化,和反序列化
* ObjectOutputStream 寫對象,實現序列化
* ObjectInputStream 讀取對象,實現反序列化
*/
public class ObjectStreamDemo {
public static void main(String[] args)throws IOException, ClassNotFoundException {
readObject();
}
/*
* ObjectInputStream
* 構造方法:ObjectInputStream(InputStream in)
* 傳遞任意的字節輸入流,輸入流封裝文件,必須是序列化的文件
* Object readObject() 讀取對象
*/
public static void readObject() throws IOException, ClassNotFoundException{
FileInputStream fis = new FileInputStream("c:\\person.txt");
//創建反序列化流,構造方法中,傳遞字節輸入流
ObjectInputStream ois = new ObjectInputStream(fis);
//調用反序列化流的方法 readObject()讀取對象
Object obj =ois.readObject();
System.out.println(obj);
ois.close();
}
}
靜態不能序列化
* A: 靜態不能序列化
* a: 原因
* 序列化是把對象數據進行持久化存儲
* 靜態的東西不屬於對象,而屬於類
transient關鍵字
* A: transient關鍵字
* a: 作用
* 被transient修飾的屬性不會被序列化
* transient關鍵字只能修飾成員變量
?
Serializable接口的含義
* A:Serializable接口的含義
* a: 作用
* 給需要序列化的類上加標記。該標記中沒有任何抽象方法
* 只有實現了 Serializable接口的類的對象才能被序列化
序列化中的序列號沖突問題
* A: 序列化中的序列號沖突問題
* a: 問題產生原因
* 當一個類實現Serializable接口後,創建對象並將對象寫入文件,之後更改了源代碼(比如:將成員變量的修飾符有private改成public),
再次從文件中讀取對象時會報異常
* 見day25_source文件夾下的"序列號的沖突.JPG"文件
序列化中自定義的序列號
* A: 序列化中自定義的序列號
* a: 定義方式
* private static final long serialVersionUID = 1478652478456L;
* 這樣每次編譯類時生成的serialVersionUID值都是固定的
* b: 案例代碼
public class Person implements Serializable{
public String name;
public /*transient阻止成員變量序列化*/ int age;
//類,自定義了序列號,編譯器不會計算序列號
private static final long serialVersionUID = 1478652478456L;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
打印流和特性
* A: 打印流和特性
* a: 概述
* 打印流添加輸出數據的功能,使它們能夠方便地打印各種數據值表示形式.
* 打印流根據流的分類:
* 字節打印流 PrintStream
* 字符打印流 PrintWriter
* 方法:
* void print(String str): 輸出任意類型的數據,
* void println(String str): 輸出任意類型的數據,自動寫入換行操作
* b: 特點
* 此流不負責數據源,只負責數據目的
* 為其他輸出流,添加功能
* 永遠不會拋出IOException,但是可能拋出別的異常
* 兩個打印流的方法,完全一致
* 構造方法,就是打印流的輸出目的端
* PrintStream構造方法
* 接收File類型,接收字符串文件名,接收字節輸出流OutputStream
* PrintWriter構造方法
* 接收File類型,接收字符串文件名,接收字節輸出流OutputStream, 接收字符輸出流Writer
?
打印流輸出目的是File對象
* A: 打印流輸出目的是File對象
* a: 案例代碼
public class PrintWriterDemo {
public static void main(String[] args) throws IOException {
function_3();
}
/*
* 打印流,向File對象的數據目的寫入數據
* 方法print println 原樣輸出
* write方法走碼表
*/
public static void function() throws FileNotFoundException{
File file = new File("c:\\1.txt");
PrintWriter pw = new PrintWriter(file);
pw.println(true);
pw.write(100);
pw.close();
}
}
輸出語句是char數組
* A: 輸出語句是char數組
* a: 案例代碼
public class Demo {
public static void main(String[] args) {
int[] arr = {1};
System.out.println(arr);
char[] ch = {'a','b'};
System.out.println(ch);
byte[] b = {};
System.out.println(b);
}
}
* b: 結果分析
* println數組,只有打印字符數組時只有容,其余均打印數組的地址
* 因為api中定義了打印字符數組的方法,其底層是在遍歷數組中的元素
* 而其他打印數組的方法,都是將數組對象編程Object,其底層再將對象編程String,調用了String s = String.valueOf(x);方法
打印流輸出目的是String和流對象
* A: 打印流輸出目的是String和流對象
* a: 案例代碼
public class PrintWriterDemo {
public static void main(String[] args) throws IOException {
function_2();
}
/*
* 打印流,輸出目的,是流對象
* 可以是字節輸出流,可以是字符的輸出流
* OutputStream Writer
*/
public static void function_2() throws IOException{
// FileOutputStream fos = new FileOutputStream("c:\\3.txt");
FileWriter fw = new FileWriter("c:\\4.txt");
PrintWriter pw = new PrintWriter(fw);
pw.println("打印流");
pw.close();
}
/*
* 打印流,輸出目的,String文件名
*/
public static void function_1() throws FileNotFoundException{
PrintWriter pw = new PrintWriter("c:\\2.txt");
pw.println(3.5);
pw.close();
}
}
打印流開啟自動刷新
* A: 打印流開啟自動刷新
* 案例代碼
public class PrintWriterDemo {
public static void main(String[] args) throws IOException {
function_3();
}
/*
* 打印流,可以開啟自動刷新功能
* 滿足2個條件:
* 1. 輸出的數據目的必須是流對象
* OutputStream Writer
* 2. 必須調用println,printf,format三個方法中的一個,啟用自動刷新
*/
public static void function_3()throws IOException{
//File f = new File("XXX.txt");
FileOutputStream fos = new FileOutputStream("c:\\5.txt");
PrintWriter pw = new PrintWriter(fos,true);
pw.println("i");
pw.println("love");
pw.println("java");
pw.close();
}
}
打印流復制文本文件
* A: 打印流復制文本文件
* a: 案例代碼
/*
* 打印流實現文本復制
* 讀取數據源 BufferedReader+File 讀取文本行
* 寫入數據目的 PrintWriter+println 自動刷新
*/
public class PrintWriterDemo1 {
public static void main(String[] args) throws IOException{
BufferedReader bfr = new BufferedReader(new FileReader("c:\\a.txt"));
PrintWriter pw = new PrintWriter(new FileWriter("d:\\a.txt"),true);
String line = null;
while((line = bfr.readLine())!=null){
pw.println(line);
}
pw.close();
bfr.close();
}
}
commons-io工具類介紹
* A: commons-io工具類介紹
* a: 工具類介紹
* 解壓縮commons-io-2.4.zip文件
* commons-io-2.4.jar需要導入到項目中的jar包,裏面存放的是class文件
* commons-io-2.4-sources.jar工具類中原代碼
* docs是幫助文檔
使用工具類commons_io
* A: 使用工具類commons_io
* a: 導入jar包
* 加入classpath的第三方jar包內的class文件才能在項目中使用
* 創建lib文件夾
* 將commons-io.jar拷貝到lib文件夾
* 右鍵點擊commons-io.jar,Build Path→Add to Build Path
* b: 學會如何看源代碼
IO工具類FilenameUtils
* A: IO工具類FilenameUtils
* a: 方法介紹
* getExtension(String path):獲取文件的擴展名;
* getName():獲取文件名;
* isExtension(String fileName,String ext):判斷fileName是否是ext後綴名;
* b: 案例代碼
public class Commons_IODemo {
public static void main(String[] args) {
function_2();
}
/*
* FilenameUtils類的方法
* static boolean isExtension(String filename,String extension)
* 判斷文件名的後綴是不是extension
*/
public static void function_2(){
boolean b = FilenameUtils.isExtension("Demo.java", "java");
System.out.println(b);
}
/*
* FilenameUtils類的方法
* static String getName(String filename)
* 獲取文件名
*/
public static void function_1(){
String name = FilenameUtils.getName("c:\\windows\\");
System.out.println(name);
}
/*
* FilenameUtils類的方法
* static String getExtension(String filename)
* 獲取文件名的擴展名
*/
public static void function(){
String name = FilenameUtils.getExtension("c:\\windows");
System.out.println(name);
}
}
IO工具類FileUtils
* A: IO工具類FileUtils
* a: 方法介紹
* readFileToString(File file):讀取文件內容,並返回一個String;
* writeStringToFile(File file,String content):將內容content寫入到file中;
* copyDirectoryToDirectory(File srcDir,File destDir);文件夾復制
* copyFile(File srcFile,File destFile);文件復制
* b: 案例代碼
public class Commons_IODemo1 {
public static void main(String[] args)throws IOException {
function_3();
}
/*
* FileUtils工具類方法
* static void copyDirectoryToDirectory(File src,File desc)
* 復制文件夾
*/
public static void function_3() throws IOException{
FileUtils.copyDirectoryToDirectory(new File("d:\\demo"), new File("c:\\"));
}
/*
* FileUtils工具類的方法
* static void copyFile(File src,File desc)
* 復制文件
*/
public static void function_2() throws IOException{
FileUtils.copyFile(new File("c:\\k.jpg"),new File("d:\\k.jpg"));
}
/*
* FileUtils工具類的方法
* static void writeStringToFile(File src,String date)
* 將字符串直接寫到文件中
*/
public static void function_1() throws IOException{
FileUtils.writeStringToFile(new File("c:\\b.txt"),"我愛Java編程");
}
/*
* FileUtils工具類的方法
* static String readFileToString(File src)讀取文本,返回字符串
*/
public static void function() throws IOException{
String s = FileUtils.readFileToString(new File("c:\\a.txt"));
System.out.println(s);
}
}
總結
16、IO (Properties、序列化流、打印流、CommonsIO)