IO異常的處理、Properties屬性集、IO流小結
阿新 • • 發佈:2019-01-02
1. JDK1.7前處理:
- 之前我們習慣了把異常丟擲,而在實際開發中並不能這樣處理,強烈建議使用try...catch...finally程式碼塊,處理異常部分。
- JDK1.7之前示例程式碼:
import java.io.*; public class FileCopy { public static void main(String[] args) { //建立檔案物件並關聯原始檔 File srcFile = new File("H:/aaa.jpg"); //建立檔案物件並關聯目標檔案 File destFile = new File("H:/bbb.jpg"); copyFile(srcFile,destFile); } public static void copyFile(File srcFile,File destFile) { //宣告位元組輸入輸出流 FileInputStream fis = null; FileOutputStream fos = null; try { //建立位元組輸入流物件關聯原始檔 fis = new FileInputStream(srcFile); //建立位元組輸出流物件並關聯目標檔案 fos = new FileOutputStream(destFile); //建立位元組陣列用於儲存讀取到的檔案資料 byte[] b = new byte[1024]; //定義整型變數用於儲存實際讀取到的位元組個數 int len=-1; //迴圈讀寫資料 while ((len=fis.read(b))!=-1){ //利用fos將位元組陣列內容輸出到目標檔案中 fos.write(b,0,len); } }catch (Exception e){ }finally { try{ //關閉流釋放資源 if(fis != null) fis.close(); }catch (Exception e){ e.printStackTrace(); } try{ if(fos != null) fos.close(); }catch (Exception e){ e.printStackTrace(); } } } }
2. JDK1.7之後處理異常方式:
JDK1.7之後處理異常的正確姿勢(小括號中會幫我們處理關閉流的動作,不需要我們手動處理) try(建立流的程式碼){ }catch(異常類名 變數名){ } 小括號中只能放建立流的程式碼,呼叫流方法的程式碼不能放在小括號中
import java.io.*; public class FileCopy { public static void main(String[] args) { //建立檔案物件並關聯原始檔 File srcFile = new File("H:/aaa.jpg"); //建立檔案物件並關聯目標檔案 File destFile = new File("H:/bbb.jpg"); copyFile(srcFile, destFile); } public static void copyFile(File srcFile, File destFile) { try (//建立位元組輸入流物件關聯原始檔 FileInputStream fis = new FileInputStream(srcFile); //建立位元組輸出流物件並關聯目標檔案 FileOutputStream fos = new FileOutputStream(destFile);) { //建立位元組陣列用於儲存讀取到的檔案資料 byte[] b = new byte[1024]; //定義整型變數用於儲存實際讀取到的位元組個數 int len = -1; //迴圈讀寫資料 while ((len = fis.read(b)) != -1) { //利用fos將位元組陣列內容輸出到目標檔案中 fos.write(b, 0, len); } } catch (Exception e) { } } }
3. JDK1.9之後處理異常的方式:
JDK1.9之後處理異常的方式:(同樣小括號中會幫我們處理關閉流的動作,不需要我們手動處理) try(流物件1;流物件2){ }catch(異常類名 變數名){ }
JDK1.7之後和JDK1.9之後注意事項:
- 同樣小括號中會幫我們處理關閉流的動作,不需要我們手動處理
- 作用域不同:JDK1.7之後建立的流物件是放在小括號裡面,JDK1.9之後建立的流物件是放在小括號外面,只需要傳兩個變數名過去小括號,作用域更大,但是JDK1.9需要作宣告(...throws Exception...),否則會報錯。
import java.io.*;
public class FileCopy {
public static void main(String[] args) throws FileNotFoundException {
//建立檔案物件並關聯原始檔
File srcFile = new File("H:/aaa.jpg");
//建立檔案物件並關聯目標檔案
File destFile = new File("H:/bbb.jpg");
copyFile(srcFile, destFile);
}
public static void copyFile(File srcFile, File destFile) throws FileNotFoundException {
//建立位元組輸入流物件關聯原始檔
FileInputStream fis = new FileInputStream(srcFile);
//建立位元組輸出流物件並關聯目標檔案
FileOutputStream fos = new FileOutputStream(destFile);
try (fis;fos) {
//建立位元組陣列用於儲存讀取到的檔案資料
byte[] b = new byte[1024];
//定義整型變數用於儲存實際讀取到的位元組個數
int len = -1;
//迴圈讀寫資料
while ((len = fis.read(b)) != -1) {
//利用fos將位元組陣列內容輸出到目標檔案中
fos.write(b, 0, len);
}
} catch (Exception e) {
}
}
}
Properties屬性集:
- Properties類概述:
- 實現了Map介面,繼承Hashtable,也是一個雙列集合。
- 也是用來儲存鍵值對資料,鍵和值預設是字串型別,不需要指定型別了。
- 有和流技術相結合的方法:可以直接將集合中的資料儲存到檔案中/也可以直接從檔案中讀取資料到檔案中
- 屬性檔案要求:
- 命名要求:xxx.properties
- 每一個鍵值對佔據一行,格式:鍵=值
- 檔案中可以使用註釋的,註釋是以#開頭
- Properties集合常用方法
- Object setProperty(String key,String value)
- 新增鍵值對
- 如果鍵存在,則使用新值替換舊值,返回舊值
- 如果鍵不存在,則返回null
- String getProperty(String key)
- 根據鍵獲得值,返回鍵對應的值
- 鍵不存在返回null
- set<String> stringPropertyNames():獲得鍵集合
- void store(OutputStream out,String comments)
- 將集合中的資料儲存到流關聯的目標檔案中
- comments:說明文字,一般給null即可
- void load(InputStream in)
- 從流關聯的目標檔案中載入資料到集合中
- 示例1:Properties集合常用方法
import java.util.Properties;
import java.util.Set;
/*
Properties集合常用方法
*/
public class PropertiesDemo01 {
public static void main(String[] args) {
//建立屬性集合物件
Properties prop = new Properties();
//新增鍵值對
Object o = prop.setProperty("name", "馬雲");
Object o1 = prop.setProperty("name", "馬化騰");
Object o2 = prop.setProperty("gender", "男");
Object age = prop.setProperty("age", "18");
System.out.println(o);//null
System.out.println(o1);//馬雲(新值替換舊值,馬化騰替換馬雲,返回舊值,返回馬雲)
System.out.println(o2);//null
System.out.println(age);//null
System.out.println(prop);//{gender=男, name=馬化騰, age=18}
//根據鍵獲得值
System.out.println(prop.getProperty("name"));//馬化騰
System.out.println("------------------------------");
//獲得鍵集合
Set<String> names = prop.stringPropertyNames();
for (String name:names){
System.out.println(name+"="+prop.getProperty(name));
}
/*
gender=男
name=馬化騰
age=18
*/
}
}
- 示例2:與流技術相結合的方法演示
import java.io.FileOutputStream;
import java.util.Properties;
/*
Properties集合方法:儲存集合資料到檔案中
*/
public class PropertiesDemo01 {
public static void main(String[] args) throws Exception{
//建立屬性集合物件
Properties prop = new Properties();
//新增鍵值對
prop.setProperty("name", "馬雲");
prop.setProperty("gender", "男");
prop.setProperty("age", "18");
//建立位元組輸出流物件並關聯目標檔案
FileOutputStream fos = new FileOutputStream("teach.properties");
prop.store(fos,"this is teacher");
//關閉流
fos.close();
}
}
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Properties;
/*
Properties集合方法:從檔案中讀取資料到Properties集合中
*/
public class PropertiesDemo01 {
public static void main(String[] args) throws Exception{
//建立屬性集合物件
Properties prop = new Properties();//{}
System.out.println(prop);
//建立位元組輸入流物件並關聯目標檔案
FileInputStream fis = new FileInputStream("teach.properties");
prop.load(fis);
//關閉流
fis.close();
System.out.println(prop);//{gender=男, name=馬雲, age=18}
}
}
IO流小結:
- IO流分類
位元組流:以位元組為單位讀寫資料
* 位元組輸入流:InputStream 所有位元組輸入流的父類
* 位元組輸出流:OutputStream 所有位元組輸出流的父類
字元流:以字元為單位讀寫資料
* 字元輸入流:Reader 所有字元輸入流的父類
* 字元輸出流:Writer 所有字元輸出流的父類
- 如何判斷流是位元組流還是字元流:
* 如果是以Stream結尾的流,就是位元組流,否則都是字元流。
- IO流的使用步驟:
* 建立流關聯目標檔案
* 呼叫流的write或read方法讀寫資料
* 呼叫流的close方法關閉流釋放資源
- 位元組流和字元流的區別:
* 位元組流:可以操作任意型別的檔案
* 字元流:只能用來操作文字檔案
- 位元組流和字元流的選擇:
* 如果明確清楚要操作的檔案型別是文字檔案,則強烈推薦使用字元流
* 如果不清楚要操作的檔案型別是什麼型別,則只能選擇位元組流。