Java案例——位元組流實現複製檔案(文字、圖片、視訊)
一、位元組流複製文字檔案
需求:把E盤下的abc.txt檔案複製到F盤下的abc.txt中
分析:
1.複製文字檔案,其實就是把文字檔案的內容從一個檔案中讀出(資料來源),然後寫入到另一個檔案中(目的地)
2.資料來源:E:\\abc.txt ——>需要讀資料——>InputStream——>最終實現類FileInputStream
3.目的地:F:\\abc.txt——>需要寫資料——>OutputStream——>最終實現類FileInputStream
步驟:
1.根據資料來源建立位元組輸入流物件
2.根據目的地建立位元組輸出流物件
3.讀寫資料,複製文字檔案(一次讀取一個位元組、一次寫入一個位元組;)
4.釋放資源
/*需求:把E盤下的abc.txt檔案複製到F盤下的abc.txt中
分析:
1.複製文字檔案,其實就是把文字檔案的內容從一個檔案中讀出(資料來源),然後寫入到另一個檔案中(目的地)
2.資料來源:E:\\\abc.txt ——>需要讀資料——>InputStream——>最終實現類FileInputStream
3.目的地:F:\\\abc.txt——>需要寫資料——>OutputStream——>最終實現類FileInputStream
步驟:
1.根據資料來源建立位元組輸入流物件
2.根據目的地建立位元組輸出流物件
3.讀寫資料,複製文字檔案(一次讀取一個位元組、一次寫入一個位元組;建議使用迴圈方式)
4.釋放資源
* */
public class Demo02 {
public static void main(String[] args) throws IOException {
//根據資料來源建立位元組輸入流物件
FileInputStream fips=new FileInputStream("E:\\abc.txt");
//根據目的地建立位元組輸出流物件
FileOutputStream fops=new FileOutputStream("F:\\abc.txt");
//讀寫資料,複製文字檔案(一次讀取一個位元組、一次寫入一個位元組;建議使用迴圈方式)
int by;
while((by=fips.read())!=-1){
fops.write(by);
}
//釋放資源
fops.close();
fips.close();
}
}
二、位元組流複製圖片
需求:把E盤下的123.jpg圖片複製到F盤下的123.jpgt中
步驟:
1.根據資料來源建立位元組輸入流物件
2.根據目的地建立位元組輸出流物件
3.讀寫資料,複製圖片(一次讀取一個位元組陣列資料、一次寫入一個位元組陣列資料;)
4.釋放資源
/*需求:把E盤下的123.jpg圖片複製到F盤下的123.jpgt中
步驟:
1.根據資料來源建立位元組輸入流物件
2.根據目的地建立位元組輸出流物件
3.讀寫資料,複製圖片(一次讀取一個位元組陣列資料、一次寫入一個位元組陣列資料;)
4.釋放資源
* */
public class Demo03 {
public static void main(String[] args) throws IOException {
//根據資料來源建立位元組輸入流物件
FileInputStream fips=new FileInputStream("E:\\123.jpg");
FileOutputStream fops=new FileOutputStream("F:\\123.jpg");
//讀寫資料,複製圖片(一次讀取一個位元組陣列資料、一次寫入一個位元組陣列資料;)
byte[]bytes=new byte[1024];
int len;
while((len=fips.read(bytes))!=-1){
fops.write(new String(bytes,0,len).getBytes);
fops.flush();//清除快取
}
//釋放資源
fops.close();
fips.close();
}
}
容易出現的問題:
我在寫完之後發現複製後的圖片雙擊打不開,再回去看程式碼,也沒幾行,我覺得問題應該是出在了位元組陣列轉字串再轉位元組陣列那一行,猜測應該是二進位制資料在轉成字串後出現了問題,再轉回去的資料不是之前的了,所以寫入的資料不是之前的圖片的二進位制資料,才會出現損壞或不被識別。 嘗試對這一行進行修改,既然轉String出現問題,那麼就不轉了,直接寫位元組陣列
/*需求:把E盤下的123.jpg圖片複製到F盤下的123.jpgt中
步驟:
1.根據資料來源建立位元組輸入流物件
2.根據目的地建立位元組輸出流物件
3.讀寫資料,複製圖片(一次讀取一個位元組陣列資料、一次寫入一個位元組陣列資料;)
4.釋放資源
* */
public class Demo03 {
public static void main(String[] args) throws IOException {
//根據資料來源建立位元組輸入流物件
FileInputStream fips=new FileInputStream("E:\\123.jpg");
FileOutputStream fops=new FileOutputStream("F:\\123.jpg");
//讀寫資料,複製圖片(一次讀取一個位元組陣列資料、一次寫入一個位元組陣列資料;)
byte[]bytes=new byte[1024];
int len;
while((len=fips.read(bytes))!=-1){
fops.write(bytes,0,len);
fops.flush();//清除快取
}
//釋放資源
fops.close();
fips.close();
}
}
完美解決!!!
三、位元組流複製視訊
需求:把E盤下的123.mp4圖片複製到F盤下的123.mp4t中
步驟:
1.根據資料來源建立位元組輸入流物件
2.根據目的地建立位元組輸出流物件
3.讀寫資料,複製視訊(4種方式,基本位元組流一次讀寫一個位元組、一次讀寫一個位元組陣列資料;位元組緩衝流一次讀寫一個位元組、一次讀寫一個位元組陣列)
4.釋放資源
/*需求:把E盤下的123.mp4圖片複製到F盤下的123.mp4
步驟:
1.根據資料來源建立位元組輸入流物件
2.根據目的地建立位元組輸出流物件
3.讀寫資料,複製視訊(4種方式,基本位元組流一次讀寫一個位元組、一次讀寫一個位元組陣列資料;位元組緩衝流一次讀寫一個位元組、一次讀寫一個位元組陣列)
4.釋放資源
* */
public class Demo05 {
public static void main(String[] args) throws IOException {
//記錄開始時間
long startime=System.currentTimeMillis();
//方式一
method1();
//方式二
method2();
//方式三
method3();
//方式4
method4();
//記錄結束時間
long endtime= System.currentTimeMillis();
System.out.println("共用時"+(endtime-startime)+"毫秒");
}
//方法一,使用基本位元組流實現一次讀取一個位元組
public static void method1() throws IOException {
FileOutputStream fops=new FileOutputStream("F:\\123.mp4");
FileInputStream fips=new FileInputStream("E:\\123.mp4");
//一次讀取一個數據
int by;
while((by=fips.read())!=-1){
fops.write(by);
}
fops.close();
fips.close();
}
//方法二,一次讀取一個位元組陣列資料
public static void method2() throws IOException {
FileInputStream fips=new FileInputStream("E:\\123.mp4");
FileOutputStream fops=new FileOutputStream("F:\\123.mp4");
//一次讀取一個數據
byte []bytes=new byte[1024];
int len;
while((len=fips.read(bytes))!=-1){
fops.write(bytes,0,len);
}
fops.close();
fips.close();
}
//方法三,使用位元組緩衝流一次讀取一個位元組
public static void method4() throws IOException {
//建立位元組緩衝流物件
BufferedInputStream bips=new BufferedInputStream(new FileInputStream("E:\\123.mp4"));
BufferedOutputStream bops=new BufferedOutputStream(new FileOutputStream("F:\\123.mp4"));
//一次讀取一個位元組資料
int by;
while((by=bips.read())!=-1){
bops.write(by);
}
bips.close();
bops.close();
}
//方法四,使用位元組緩衝流一次讀取一個位元組陣列資料
public static void method3() throws IOException {
//建立位元組緩衝流物件
BufferedInputStream bips=new BufferedInputStream(new FileInputStream("E:\\123.mp4"));
BufferedOutputStream bops=new BufferedOutputStream(new FileOutputStream("F:\\123.mp4"));
//一次讀取一個位元組陣列資料
byte []bytes=new byte[1024];
int len;
while((len=bips.read(bytes))!=-1){
bops.write(bytes,0,len);
}
bips.close();
bops.close();
}
}