IO流基礎
一、概念
數據的交換
程序與文件,數組,網絡資源,數據庫資源的數據傳輸與交換。
<br />
二、IO流的分類
- 流向:輸出流與輸入流(以程序為中心判斷)
- 數據:字節流:二進制,可以傳輸任何文件。
字符流:文本文件,只能處理純文本 - 功能:節點:包裹源頭
處理:增強功能,提高性能
<br />
三、字符流與字節流(重點區分)
- 字節流
輸入流:InputStream
輸出流:OutputStream - 字符流
輸入流:Writer
輸出流:Reader
<br />
四、操作
1)、建立聯系
2)、選擇流
3)、操作 數組大小+read、write
4)、釋放資源
字節流基本操作之文件讀取,寫出,追加,拷貝
<br />
一、文件讀取
- 建立聯系:File對象
- 選擇流 文件輸入流:InputStream接口的實現類FileOutputStream
- 操作:byte[] car=new byte[數組大小]+read+讀取大小,輸出
- 關閉資源
示例程序
public static void fileIn() {
// 1.關聯文件
File f = new File("F:/javaIotest/poetry.txt");
// 2.選擇流
InputStream is = null;// 提升作用域
try {
is = new FileInputStream(f);
// 3.操作
byte[] car = new byte[20];// 緩沖數組
// 這里定義每次讀取的文件的長度,
// 如果不定義的話,如果到最后長度不夠填滿數組,那么只會改變前面的部分,后面的還是上次讀取的內容
// 輸出也沒辦法確定輸出到哪里結束
int len = 0;
while (-1 != (len = is.read(car))) {// is.read()方法會返回整形,表示本次讀取的長度
// 每次只輸出本次讀取的字節,到最后就不會多輸出了
String str = new String(car, 0, len);
// 打印
System.out.print(str);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("文件未找到");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("讀取文件失敗");
} finally {
// 4.關閉資源
if (null != is)
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
System.out.println("關閉流失敗");
}
}
}
<br />
二、文件寫出
<br />
操作同上
選擇流的FileInputStream 多一個參數,是表示追加還是覆蓋。false為覆蓋,true為追加。如果不寫該參數的話,默認為覆蓋的。
還有個要注意的,文件輸出需要使用flush()方法強制刷新一下。如果不刷新視頻里說是等輸出總線滿了,才會往外推。雖然在finally里關閉流的時候也會自動刷新,但是推薦養成使用這個方法的習慣。
public static void outFile() {
File f = new File("F:/javaIotest/test01.txt");
OutputStream os = null;
try {
// 選擇文件輸出流,構造器里,最后一個參數為追加或者覆蓋,false為覆蓋
os = new FileOutputStream(f);
String str = "Viking is very handsome ! Do you agry ?";
// 字符串轉為字符數組
byte[] b = str.getBytes();
os.write(b, 0, b.length);
os.flush();// 強制刷新,雖然在流關閉時也會,但推薦加一個這個
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("文件無法創建或者為目錄");
} catch (IOException e) {
e.printStackTrace();
System.out.println("文件寫入失敗");
} finally {
if (null != os)
// 關閉資源
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
System.out.println("流關閉失敗");
}
}
}
<br />
三、文件拷貝
<br />
建立聯系階段,源必須存在,且必須為文件。目的文件可以不存在,但也必須是文件。
示例程序
public static void fileCopy(File src, File dest) {
InputStream is = null;
OutputStream os = null;
try {
is = new FileInputStream(src);
os = new FileOutputStream(dest);
byte[] b = new byte[20];
int len = 0;
while (-1 != (len = is.read(b))) {
os.write(b, 0, len);
}
os.flush();
} catch (FileNotFoundException e) {
System.out.println("文件未找到");
e.printStackTrace();
} catch (IOException e) {
System.out.println("文件讀取或寫出失敗");
e.printStackTrace();
} finally {
try {
os.close();
is.close();
} catch (IOException e) {
System.out.println("流關閉失敗!");
e.printStackTrace();
}
}
}
<br />
四、文件夾的拷貝。
即利用listFiles方法獲取目錄下文件,如果是文件則拷貝,是目錄則遞歸調用。因為都是完全的拷貝。所以要注意新文件的關聯的建立。目錄則需要手動創建。文件可以自己建立。
示例程序
public static void dirCopy(File src, File dest) {
// 先判斷源是否是文件,如果再判斷目的,如果是目錄,就新建個同名的文件
// 如果是文件直接拷貝。如果源是目錄則調用私有方法拷貝目錄。
if (src.isDirectory()) {
// 這里是在目的地下面新建個同名文件夾,即整個源一起拷貝進去
File f = new File(dest, src.getName());
dirCopyDetils(src, f);
} else if (dest.isDirectory()) {
File copyFile = new File(dest, src.getName());
fileCopy(src, copyFile);
} else {
fileCopy(src, dest);
}
}
private static void dirCopyDetils(File src, File dest) {
// 建立文件夾
if (!dest.exists())
dest.mkdirs();
File[] files = src.listFiles();
// 遍歷源目錄下文件
for (File temp : files) {
// 如果是目錄,調用自身,拷貝到上層目錄下的同名文件夾
if (temp.isDirectory()) {
dirCopyDetils(temp, new File(dest, temp.getName()));
} else {
// 如果是文件,建立新的文件關聯,復制時自動創建文件
File copyFile = new File(dest, temp.getName());
fileCopy(temp, copyFile);
}
}
}
<br />
字符流
<br />
字符流只能用于處理純文本。
操作與字節流類似
字符流的節點流:
- Reader 文件讀取(FileReader)
- Writer 文件寫出(FileWriter)
區別在于,用char數組來接收而不是用byte數組
寫出操作,write方法形參可以是字符數組也可以是字符串,還多個append方法表示追加。