文件分割与合并

文件分割与合并 类
package com.test0722;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Vector;

public class FileSpliteDemo {

	private static final long N = 4;
//	private File sourceFile = null;
//	String path = "E:"+File.separator+"电影"+File.separator + "[阳光电影www.ygdy8.com].小姐诱心.BD.720p.国粤双语中字.mkv";
//	private FilenameFilter filter;
	
	

	/**
	 * 
	 * @param sourceFile 源文件--->需要被分割的文件
	 * @param targetFilePath 分割文件以及配置文件 存放的目录
	 * @throws IOException 
	 */
	public void spliteFileAndCreatINIFile(File sourceFile,File targetFilePath) throws IOException {
		BufferedInputStream bis = 
				new BufferedInputStream(new FileInputStream(sourceFile));
		
		FileWriter fw = new FileWriter(new File(targetFilePath, "peizhi.ini"));
		fw.write(sourceFile.getParent()+"\r\n");
		//每个部分文件的大小
		long everyPartSize = (int) (sourceFile.length() / N);
		byte[] buff = new byte[1024];
		int len = 0;
		int i = 0;
		File targetFile = new File(targetFilePath, sourceFile.getName()+"part"+ i);;
		BufferedOutputStream bos = new BufferedOutputStream(
				new FileOutputStream(targetFile));;
		fw.write(targetFile.getName()+"\r\n");		
			
		while((len = bis.read(buff)) != -1){
			
			bos.write(buff, 0, len);
			if(targetFile.length() >= everyPartSize){
				bos.flush();//在bos输出流被重新定向之前 必须  要flush缓冲区,不然可能会丢失字节
				targetFile = new File(targetFilePath, sourceFile.getName()+"part"+ ++i);
				bos = new BufferedOutputStream(
						new FileOutputStream(targetFile));;
				fw.write(targetFile.getName()+"\r\n");
			}
		}
		
		bis.close();
		
		bos.flush();
		bos.close();
		
		fw.flush();
		fw.close();
		
	}


<span style="white-space:pre">	</span>/*
<span style="white-space:pre">	</span> *<span style="white-space:pre">	</span>根据配置文件  合并  被分割的文件  并且删除配置文件以及分割文件
<span style="white-space:pre">	</span> */
	public void combineFileAndDeleteINI(File file) throws IOException {
		
		Vector<InputStream> inputVerctor = new Vector<InputStream>();
		List<File> partFileList = new ArrayList<File>();
		
		BufferedReader bis = new BufferedReader(new FileReader(file));
		String line = "";
		//读取配置文件
		System.out.println("源文件的目录---->"+bis.readLine());
		
		while((line = bis.readLine()) != null){
			File partFile = new File(file.getParentFile(), line);
			partFileList.add(partFile);
			FileInputStream fis  = new FileInputStream(partFile);
			inputVerctor.add(fis);
		}
		//合并part文件
		Enumeration<InputStream> enumeration = inputVerctor.elements();
		SequenceInputStream sequenceInputStream = new SequenceInputStream(enumeration);
		byte[] buff = new byte[1024];
		int len = 0;
		FileOutputStream fos = new FileOutputStream(file.getParent()+File.separator+"小姐诱心.mkv");
		while((len = sequenceInputStream.read(buff)) != -1){
			fos.write(buff, 0, len);
		}
		
		bis.close();
		sequenceInputStream.close();
		fos.flush();
		fos.close();
		
		//删除配置文件  删除partFile文件,需要在关闭操作这些文件的流 之后才能 删除成功,不然删除失败
		boolean delete = file.delete();
		System.out.println("删除配置文件是否成功---->"+delete);
		for(File partFile : partFileList){
			partFile.delete();
		}
	}



//	public FileSpliteDemo(String path) {
//		sourceFile = new  File(path);
//	}

	
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Go 中,可以使用以下方式将大文件分割成多个小文件: ```go package main import ( "bufio" "fmt" "os" ) func main() { const chunkSize = 1024 * 1024 // 1MB // 打开源文件 srcFile, err := os.Open("bigfile.txt") if err != nil { panic(err) } defer srcFile.Close() // 逐个读取源文件的 chunk chunk := make([]byte, chunkSize) for i := 0; ; i++ { n, err := srcFile.Read(chunk) if err != nil { if err == io.EOF { break // 文件结束 } else { panic(err) } } // 创建新文件 dstFileName := fmt.Sprintf("part-%d.txt", i) dstFile, err := os.Create(dstFileName) if err != nil { panic(err) } defer dstFile.Close() // 将 chunk 写入新文件 _, err = dstFile.Write(chunk[:n]) if err != nil { panic(err) } } } ``` 上述代码中,我们使用了 `os.Open` 函数打开源文件,然后使用 `os.Create` 函数创建新文件。我们逐个读取源文件的 chunk,将每个 chunk 写入新文件。 接下来,我们来看看如何将多个小文件合并成一个大文件: ```go package main import ( "fmt" "io" "os" ) func main() { // 创建目标文件 dstFile, err := os.Create("bigfile.txt") if err != nil { panic(err) } defer dstFile.Close() // 逐个读取小文件并写入目标文件 for i := 0; ; i++ { srcFileName := fmt.Sprintf("part-%d.txt", i) srcFile, err := os.Open(srcFileName) if err != nil { if err == io.EOF { break // 没有更多文件 } else { panic(err) } } defer srcFile.Close() // 将小文件写入目标文件 _, err = io.Copy(dstFile, srcFile) if err != nil { panic(err) } } } ``` 上述代码中,我们使用 `os.Create` 函数创建目标文件,然后逐个读取小文件并写入目标文件。我们使用 `io.Copy` 函数将小文件的内容写入目标文件。 需要注意的是,如果您处理的是二进制文件,可能需要使用 `os.OpenFile` 和 `os.Create` 函数的 `O_BINARY` 标志。另外,还需要注意文件名的编码和路径分隔符的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值