TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
程序使用FileStream读取二进制流,实现大文件的分割与合并。
程序1 ,实现文件的分割:
关于程序的一些解释: 将要分割的文件“36.avi”放到workspace中;FileInputStream用于读取二进制流,这样可以保证读取任意格式的文件;prefix用于截取文件名的后缀,以便分割后生成的文件格式与源文件一致(最主要用于文件合并时合并后的文件格式);可以根据文件大小设置 fileDivi;skip()方法用于跳过指定的字节数,这样可以有效地在文件中定位;注意read()方法中的三个参数
- /**
- * This program is used to devide large files
- * @version 2012-3-8
- * @author suqianqian
- *
- */
- import java.io.*;
- public class DividedFile {
- public static void main(String[] args){
- try{
- readFile("36.avi");
- }catch(IOException e){}
- }
- public static void writeFile(byte[] buf,String fileDestination) throws IOException
- {
- FileOutputStream fos = new FileOutputStream(fileDestination,true);
- fos.write(buf);
- fos.close();
- }
- //读取文件
- public static void readFile(String fileSource) throws IOException{
- FileInputStream fis = new FileInputStream(fileSource);
- //获取后缀
- String prefix=fileSource.substring(fileSource.lastIndexOf(".")+1);
- //String extension = fileSource.substring(fileSource.lastIndexOf("/"),fileSource.indexOf("."));
- //String trueName = extension.replace("/", "");
- String trueName=fileSource.substring(0,fileSource.lastIndexOf("."));
- int fileDivi = 5632*200;
- System.out.println(trueName);
- //String trueName = "TextFile";
- //available()方法可以知道文件具体有多少个字节。
- int filelen = fis.available();
- fis.close();
- System.out.println(filelen);
- int fl = filelen / fileDivi;
- byte[][] buf = new byte[fl+1][fileDivi];
- for(int i = 0; i < fl; i++){
- //System.out.println(i+":"+buf[i]);
- FileInputStream fis2 = new FileInputStream(fileSource);
- fis2.skip(i*fileDivi);
- fis2.read(buf[i],0,fileDivi);
- //System.out.println("写入前"+i);
- if(i < 10){
- writeFile(buf[i],"F:\java/"+trueName+"devided_00"+i+"."+prefix);
- }else
- if(i >= 10&&i < 100)
- writeFile(buf[i],"F:\java/"+trueName+"devided_0"+i+"."+prefix);
- else
- writeFile(buf[i],"F:\java/"+trueName+"devided_"+i+"."+prefix);
- //System.out.println("写入后"+i);
- fis2.close();
- }
- FileInputStream fis2 = new FileInputStream(fileSource);
- fis2.skip(fl*fileDivi);
- fis2.read(buf[fl],0,filelen%fileDivi);
- if(fl < 10){
- writeFile(buf[fl],"F:\java/"+trueName+"devided_00"+fl+"."+prefix);
- }else
- if(fl >= 10&&fl < 100)
- writeFile(buf[fl],"F:\java/"+trueName+"devided_0"+fl+"."+prefix);
- else
- writeFile(buf[fl],"F:\java/"+trueName+"devided_"+fl+"."+prefix);
- fis2.close();
- // writeFile(buf[fl],trueName+"devided_"+fl+"."+prefix);
- // fis.close();
- }
- }
复制代码 程序2用于将已分割的文件进行合并 解释:refreshFileList()方法用于遍历指定的目录中的所有文件。程序中readFile()方法也展示了如何返回两个值(当然此程序未用到,后来没改)- /**
- * This program is used to merge files
- * @version 2012-3-8
- * @author suqianqian
- *
- */
- import java.io.*;
- import java.util.ArrayList;
-
- public class MergedFile //字节流的读写文件简介
- {
- public static void main(String[] args) throws IOException
- {
- MergedFile fileStream = new MergedFile();
- fileStream.refreshFileList ("F:\java");
-
- }
- //遍历目录获取所有需要合并的的文件
- private static ArrayList filelist = new ArrayList();
- public void refreshFileList(String strPath) {
- File dir = new File(strPath);
- File[] files = dir.listFiles();
- if (files == null) return;
- for (int i = 0; i< files.length;i++){
- if (files[i].isDirectory()) {
- refreshFileList(files[i].getAbsolutePath());
- }
- else{
- String strFileName = files[i].getAbsolutePath().toLowerCase();
- try{
- //int fileNum = 0;
- //fileNum++;
- readFile(strFileName);
- //prefix 截取文件后缀
- String prefix=strFileName.substring(strFileName.lastIndexOf(".")+1);
- writeFile(strFileName,"merged."+prefix);
- }catch(IOException e){}
- System.out.println("---"+strFileName);
- filelist.add(files[i].getAbsolutePath());
- }
- }
- }
- //写文件的方法
- public static void writeFile(String filesource,String fileDestination) throws IOException
- {
- FileOutputStream fos = new FileOutputStream(fileDestination,true);
- byte[] buf = readFile(filesource).buf;
- fos.write(buf);
- fos.close();
- }
- //使用FileInputStream中的available()方法读文件存入到buf中,并获取文件长度和buf
- public static class ReadFile{
- public ReadFile(byte[] b,int fl){
- buf = b;
- filelen = fl;
- }
- public byte[] getBuf(){
- return buf;
- }
- public int getFileLen(){
- return filelen;
- }
- private byte[] buf;
- private int filelen;
- }
- public static ReadFile readFile(String filesource) throws IOException
- {
- FileInputStream fis = new FileInputStream(filesource);
- //available()方法可以知道文件具体有多少个字节。
- int filelen = fis.available();
- byte[] buf = new byte[filelen];
- fis.read(buf);
- fis.close();
- return new ReadFile(buf,filelen);
- }
- }
复制代码
源码下载:http://file.javaxxz.com/2014/11/3/235832234.zip |
|