1. 程式人生 > >Java基礎----檔案的切割合併

Java基礎----檔案的切割合併

package day22;
/*
位元組流


輸入位元組流:
-----------| InputStream  所有輸入位元組流的基類  抽象類
-----------------| FileInputStream 讀取檔案資料的輸入位元組流
-----------------| BufferedInputStream  緩衝輸入字元流       該類出現的目的是為了提高讀取檔案 資料的效率。 這個類其實只不過是在內部維護了一個8kb的位元組陣列而已。




輸出位元組流:
-----------| OutputStream 所有輸出位元組流的基類。  抽象類。
----------------| FileOutputStream 向檔案輸出資料的輸出位元組流  
----------------| BufferedOutputStream 緩衝輸出位元組流   該類出現的目的也是為了提高向檔案寫資料的效率。 這個類的也只不過是在內部維護了一個8kb的位元組陣列而已。


字元流 :  字元流 = 位元組流  + 編碼(解碼)


輸入字元流:
---------| Reader   所有輸入字元流的基類。  抽象類。
----------------| FileReader 讀取檔案資料的輸入字元流。 
----------------| BufferedReader 緩衝輸入字元流           該類出現的目的是為了提高讀取檔案資料的效率與拓展FileReader的(readLine)功能。  這個類的也只不過是在內部維護了一個8kb的字元陣列而已。




輸出字元流:
---------| Writer 所有輸出字元流的基類。  抽象類
----------------| FileWriter 向檔案輸出資料的輸出字元流  
----------------| BufferedWriter 緩衝輸出字元流        該類出現的目的是為了提高寫檔案資料的效率與拓展FileWriter的(newLine)功能.








 */
public class Demo1 {


public static void main(String[] args) {
// TODO Auto-generated method stub


}


}




package cn.itcast.other;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Vector;


/*
 需求:把a.txt與b.txt檔案的內容合併。
 
 */
public class Demo1 {


public static void main(String[] args) throws IOException {
//merge1();
//merge2();
merge3();


}

//把三個檔案合併成一個檔案
public static void merge3() throws IOException{
//找到目標檔案
File file1 = new File("F:\\a.txt");
File file2 = new File("F:\\b.txt");
File file3 = new File("F:\\c.txt");
File file4 = new File("F:\\d.txt");


//建立對應 的輸入輸出流物件
FileOutputStream fileOutputStream = new FileOutputStream(file4);
FileInputStream fileInputStream1 = new FileInputStream(file1);
FileInputStream fileInputStream2 = new FileInputStream(file2);
FileInputStream fileInputStream3 = new FileInputStream(file3);


//建立序列流物件
Vector<FileInputStream> vector = new Vector<FileInputStream>();
vector.add(fileInputStream1);
vector.add(fileInputStream2);
vector.add(fileInputStream3);
Enumeration<FileInputStream> e = vector.elements();


SequenceInputStream sequenceInputStream = new SequenceInputStream(e);

//讀取檔案資料
byte[] buf = new byte[1024];
int length = 0; 

while((length = sequenceInputStream.read(buf))!=-1){
fileOutputStream.write(buf,0,length);
}

//關閉資源
sequenceInputStream.close();
fileOutputStream.close();

}
// 使用SequenceInputStream合併檔案。
public static void merge2() throws IOException{
//找到目標檔案
File inFile1 = new File("F:\\a.txt");
File inFile2 = new File("F:\\b.txt");
File outFile = new File("F:\\c.txt");
//建立資料的輸入輸出通道
FileOutputStream fileOutputStream = new FileOutputStream(outFile);

FileInputStream fileInputStream1 = new FileInputStream(inFile1);
FileInputStream fileInputStream2 = new FileInputStream(inFile2);
//建立序列流物件
SequenceInputStream inputStream = new SequenceInputStream(fileInputStream1,fileInputStream2);
byte[] buf = new byte[1024];
int length = 0 ; 

while((length = inputStream.read(buf))!=-1){
fileOutputStream.write(buf,0,length);
}
//關閉資源
inputStream.close();
fileOutputStream.close();


}
//需求:把a.txt與b.txt檔案的內容合併。

public static void merge1() throws IOException{
//找到目標檔案
File inFile1 = new File("F:\\a.txt");
File inFile2 = new File("F:\\b.txt");

File outFile = new File("F:\\c.txt");
//建立資料的輸入輸出通道
FileInputStream fileInputStream1 = new FileInputStream(inFile1);
FileInputStream fileInputStream2 = new FileInputStream(inFile2);

FileOutputStream fileOutputStream = new FileOutputStream(outFile);

//把輸入流儲存到集合中,然後再從集合中讀取
ArrayList<FileInputStream> list = new ArrayList<FileInputStream>();
list.add(fileInputStream1);
list.add(fileInputStream2);

//準備一個緩衝陣列
byte[] buf = new byte[1024];
int length = 0;

for(int i =0;i<list.size();i++){
FileInputStream fileInputStream  = list.get(i);

while((length = fileInputStream.read(buf))!=-1){
fileOutputStream.write(buf, 0, length);
}

//關閉資源
fileInputStream.close();
}
fileOutputStream.close();

}


}




package cn.itcast.other;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.Enumeration;
import java.util.Vector;


/*
 
 需求: 把一首mp3先切割成n份,然後再把這些檔案合併起來。
 
 */




public class Demo2 {


public static void main(String[] args) throws IOException {
// cutFile();
mergeFlile();
}

//合併
public static void mergeFlile() throws IOException{
//找到目標檔案
File dir = new File("F:\\music");
//通過目標資料夾找到所有的MP3檔案,然後把所有的MP3檔案新增到vector中。
Vector<FileInputStream> vector = new Vector<FileInputStream>();
File[] files = dir.listFiles();
for(File file : files){
if(file.getName().endsWith(".mp3")){
vector.add(new FileInputStream(file));
}
}
//通過Vector獲取迭代器
Enumeration<FileInputStream> e = vector.elements();
//建立序列流
SequenceInputStream inputStream = new SequenceInputStream(e);
//建立檔案的輸出通道
FileOutputStream fileOutputStream = new FileOutputStream("F:\\合併.mp3");
//建立緩衝陣列讀取檔案
byte[] buf = new byte[1024];
int length = 0 ; 
while((length =  inputStream.read(buf))!=-1){
fileOutputStream.write(buf,0,length);
}
//關閉資源
fileOutputStream.close();
inputStream.close();

}



//切割MP3
public static void cutFile() throws IOException{
File file = new File("F:\\美女\\1.mp3");
//目標資料夾
File dir = new File("F:\\music");
//建立資料的輸入通道
FileInputStream fileInputStream = new FileInputStream(file);
//建立緩衝陣列讀取
byte[] buf = new byte[1024*1024];
int length = 0;
for(int i = 0 ;  (length = fileInputStream.read(buf))!=-1 ; i++){
FileOutputStream fileOutputStream = new FileOutputStream(new File(dir,"part"+i+".mp3"));
fileOutputStream.write(buf,0,length);
fileOutputStream.close();
}
//關閉資源
fileInputStream.close();
}


}