Java io流 之FileOutputStream與FileInputStream 詳解
阿新 • • 發佈:2019-02-02
FileOutputStream
檔案輸出流
方法程式碼詳解:
public class Demo01 {
public static void main(String[] args) {
// fun1();
// fun2();
/*
* 異常處理
* io 發生異常 都需要停止程式 修改程式碼
*/
File file = new File("/Users/james/Desktop/level/123.txt");
// 增加作用域
FileOutputStream oStream = null ;
try {
// 建立一個流
// 只要手動建立的流 就需要手動關閉
oStream = new FileOutputStream(file);
oStream.write("Hello".getBytes());
} catch (FileNotFoundException e) {
// 丟擲執行時異常(直接停止程式)
throw new RuntimeException("檔案找不到");
} catch (IOException e) {
// 檔案編寫失敗
throw new RuntimeException("檔案無法編寫");
}finally {
try {
// 非空判斷
// 如果是空的 說明 流建立失敗 就不需要關閉
if (oStream != null) {
oStream.close();
}
} catch (IOException e) {
// 關閉資源失敗 停止程式
throw new RuntimeException("流無法關閉");
}
}
}
/**
* @throws FileNotFoundException
* @throws IOException
* 檔案的續寫 和 換行
*/
public static void fun2() throws FileNotFoundException, IOException {
File file = new File("/Users/james/Desktop/level/123.txt");
FileOutputStream oStream = new FileOutputStream(file, true);
oStream.write("Hello\n".getBytes());
oStream.close();
}
/**
* @throws FileNotFoundException
* @throws IOException
*/
public static void fun1() throws FileNotFoundException, IOException {
/*
* 構造方法需要檔案(被寫入的檔案) 和 檔案的路徑(被寫入的路徑)
* 寫入檔案流程
* 1. 繫結要寫入的檔案 或 檔案路徑
* 2. 使用write方法 直接寫入
* 3. 關閉資源
*
*/
// 繫結資料的目的地(繫結要寫入的檔案)
// 該路徑下 沒有該檔案 會幫你創建出這個檔案
// 如果有該檔案 檔案會被覆蓋
File file = new File("/Users/james/Desktop/level/123.txt");
FileOutputStream oStream = new FileOutputStream(file);
// 按ascii 表的值輸入的
oStream.write(97);
byte[] b = {90,100,110};
oStream.write(b);
oStream.write(b, 1, 2);
// 簡單寫法
oStream.write("hello".getBytes());
oStream.close();
}
}
FileInputStream
從檔案系統中的某個檔案中獲得輸入位元組
方法程式碼示例:
/*
* 位元組輸入流
* inputStream 所有輸入流的父類
* 注意: 位元組流 寫入的時候 是一個位元組一個位元組的寫 讀取是一個位元組一個位元組的讀
*
* 讀取檔案流程
* 1.繫結資料來源檔案(要讀哪個檔案)
* 2.使用read方法讀
* 3.關閉資源
*/
public class Demo01 {
public static void main(String[] args) throws IOException {
File file = new File("/Users/james/Desktop/level/134.txt");
FileInputStream iStream = new FileInputStream(file);
// fun1(iStream);
// fun2(iStream);
int length = (int) file.length();
byte[] bs = new byte[length];
while ((iStream.read(bs)) != -1) {
for (byte b : bs) {
System.out.println(b);
}
}
iStream.close();
}
/**
* @param iStream
* @throws IOException
*/
public static void fun2(FileInputStream iStream) throws IOException {
// 迴圈讀取
// read 方法 每呼叫一次就 讀取一個位元組
// 迴圈的時候 read方法只能出現一次
// 宣告一個變數儲存 讀出來的結果
int read = 0;
while ((read = iStream.read())!= -1 ) {
System.out.println(read);
}
}
}
輸入輸出流例題應用:
/*
* 使用位元組的輸入輸出流進行檔案的複製
* (位元組流不但可以寫文字 還可以寫圖片 音訊 視訊)
*/
public class Demo01 {
public static void main(String[] args) {
// 獲取系統時間
long start = System.currentTimeMillis();
// 異常處理 複製檔案
// 讀
FileInputStream fis = null;
// 寫
FileOutputStream fos = null;
try {
// 複製圖片
fis = new FileInputStream("/Users/james/Desktop/level/圖1.jpg");
fos = new FileOutputStream("/Users/james/Desktop/圖2.jpg");
// 利用緩衝陣列讀寫 效率較高!
// 開始讀 讀一個位元組 寫一個位元組
// int len = 0;
// while ((len = fis.read()) != -1) {
// // 直接把讀出來的寫進檔案
// fos.write(len);
// }
// 用位元組陣列方式讀寫
byte[] bs = new byte[1024];
int len = 0;
while ((len = fis.read(bs)) != -1) {
fos.write(bs, 0, len);
}
} catch (FileNotFoundException e) {
throw new RuntimeException("檔案找不到!");
} catch (IOException e) {
throw new RuntimeException("檔案複製失敗");
}finally {
// 這時讀寫都完事 可以不用順序關閉
try {
if (fis != null) {
fis.close();
}
} catch (IOException e) {
throw new RuntimeException("關閉資源失敗");
}finally {
// 寫在一起 如果第一個報異常 第二個流 無法關閉
try {
if (fos != null) {
fos.close();
}
} catch (IOException e) {
throw new RuntimeException("關閉資源失敗");
}
}
}
long stop = System.currentTimeMillis();
System.out.println(stop - start);
}
}
複製一個資料夾裡的所有txt到另一個檔案內
public class Demo03 {
public static void main(String[] args) throws IOException {
File oldfile = new File("/Users/james/Desktop/level");
File newfile = new File("/Users/james/Desktop/xTest");
copyFileTxt(oldfile, newfile);
}
public static void copyFileTxt(File src, File dest) throws IOException {
File[] listFiles = src.listFiles(new FileTxt());
for (File file : listFiles) {
if (file.isFile()) {
// 讀寫
FileInputStream fis = new FileInputStream(file);
File tempFile = new File(dest, file.getName());
FileOutputStream fos = new FileOutputStream(tempFile);
int len = 0;
byte[] b = new byte[1024];
while ((len = fis.read(b)) != -1) {
fos.write(b, 0, len);
}
fis.close();
fos.close();
}else {
copyFileTxt(file, dest);
}
}
}
}
class FileTxt implements FileFilter{
@Override
public boolean accept(File pathname) {
// 檔案不被過濾
if (pathname.isDirectory()) {
return true;
}
// 過濾不是txt的
String name = pathname.getName();
return name.endsWith("txt");
}
}