A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄公子 初级黑马   /  2017-2-28 23:40  /  1590 人查看  /  4 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

有如下文件: 1.mp3 需求:把1.mp3,切割成10份小文件 提示:读取一个文件,写到10个目的地去即可!

4 个回复

倒序浏览
明天写出来给你,今天太晚了
回复 使用道具 举报
回复 使用道具 举报
[Java] 纯文本查看 复制代码
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.SequenceInputStream;
import java.util.Enumeration;
import java.util.Vector;

/**
 * 
 * 
 * 有如下文件: 1.mp3 需求:把1.mp3,切割成10份小文件 提示:读取一个文件,写到10个目的地去即可!
 *
 */
public class Demo05 {

    public static void main(String[] args) throws IOException {

        //========= 分割 ======================================/
        File file = new File("1.mp3");
        int partCount = 10; // 切割成10份
        splitFile(file, partCount);
        
        //========= 合并 ======================================/
        String[] files = new String[partCount];
        for (int i = 1; i <= partCount; i++) {
            String pathname = String.format("part/part%02d", i);
            files[i - 1] = pathname;
        }
        String outPath = "1_copy.mp3";
        mergeFile(outPath,files);
    }


    private static void splitFile(File file, int partCount) throws IOException {

        if (file.isFile()) {
            //获取文件的总长度
            long length = file.length();
            InputStream fileInputStream = new FileInputStream(file);
            File dir = new File("part");
            dir.mkdir();
            for (int i = 1; i <= partCount; i++) {
                String child = String.format("part%02d", i);
                File outFile = new File(dir, child);

                byte[] buff = new byte[1024 * 8];
                FileOutputStream fileOutputStream = new FileOutputStream(outFile);
                for (int len = -1; (len = fileInputStream.read(buff)) != -1;) {
                    fileOutputStream.write(buff, 0, len);
                    if (outFile.length() > (length / partCount)) {
                        break;
                    }
                }
                fileOutputStream.close();
            }
            fileInputStream.close();
        }
    }

    private static void mergeFile(String outPath,String... files) throws IOException {

        Vector<FileInputStream> vector = new Vector<FileInputStream>();
        
        for (int i = 0; i < files.length; i++) {
            vector.add(new FileInputStream(files[i]));
        }
        
        Enumeration<FileInputStream> elements = vector.elements();
        SequenceInputStream sequenceInputStream = new SequenceInputStream(elements);
        FileOutputStream fileOutputStream = new FileOutputStream(outPath, true);
        byte[] buff = new byte[1024 * 8];
        for (int len = 0; (len = sequenceInputStream.read(buff)) != -1;) {
            fileOutputStream.write(buff, 0, len);
        }
        fileOutputStream.close();
        sequenceInputStream.close();
        
        System.out.println("文件合并完成!");
    }
}
回复 使用道具 举报
[AppleScript] 纯文本查看 复制代码
package myexam;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;



/*
 * 有如下文件: 1.mp3 需求:把1.mp3,切割成10份小文件 提示:读取
 * 一个文件,写到10个目的地去即可!
 * 
 */
public class Test17 {

	public static void main(String[] args) throws IOException {
		/*
		 * 思路:一个读取流,对应多个输出流,生成的碎片文件要有有序的序号。
		 * 前提:1.mp3文件要存在
		 */
		
		File srcFile=new File("1.mp3");
		File dirFile=new File("filesPlit");
		fileSplit(srcFile, dirFile);
	}

	public static void fileSplit(File srcFile,File dirFile) throws IOException {
		
		if(!dirFile.exists()){
			dirFile.mkdir();
		}
		if(!srcFile.exists()){
			throw new RuntimeException(srcFile.getAbsolutePath()+",源文件不存在!");
		}
		//1.读取源文件,定义流跟原文件相关联
		FileInputStream fis=new FileInputStream(srcFile);
		
		//2.创建一个目的引用,应为目的文件有多个,所以目的引用不确定
		FileOutputStream fos=null;
		
		//3.创建一个缓冲区。
		//3.1 获取源文件大小
		long fileLength=srcFile.length();
		byte[] buf=new byte[(int)(fileLength/10)+1];//分成10份,这里切割文件个数不太准确,可以改动10
		int count=0;
		int len=0;
		//4.往缓冲区存储数据
		while((len=fis.read(buf))!=-1){
			
			//5.创建输出流,明确要写入的文件对象
			File partFile=new File(dirFile,(++count)+".part");
			
			fos=new FileOutputStream(partFile);
			fos.write(buf, 0, len);
			fos.close();
		}
		//用Properties集合创建一个配置文件,用于存储源文件,和分割文件的信息
		Properties prop=new Properties();
		
		prop.setProperty("partcount",Integer.toString(count));
		prop.setProperty("filename",srcFile.getName());
		File configFile=new File(dirFile,(++count)+".properties");
		fos=new FileOutputStream(configFile);
		prop.store(fos, "save part file info");
		
		fos.close();
		fis.close();
	}

}

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马