java实现文件的分割

package com.zl.file.operator;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @author 丢了风筝的线
 * @see 文件的分割
 * @see 将源文件分为多个子块,然后分次读取这些块,通过RandomAccessFile的seek设置每次开始读取的位置来实现批此读取和写入
 */
public class SplitFile {

	// 原文件
	private File originalFile;

	// 存放的地址
	private String destDir;

	// 切割后的文件的路径
	private List<String> destPaths;

	// 每块大小
	private int blockSize;

	// 多少块
	private int count;

	public SplitFile(String originalFilePath, String destDir) {
		this(originalFilePath, destDir, 1024);
	}

	public SplitFile(String originalFilePath, String destDir, int blockSize) {
		this.originalFile = new File(originalFilePath);
		this.destDir = destDir;
		this.blockSize = blockSize;
		this.destPaths = new ArrayList<String>();

		// 初始化
		init();
	}

	private void init() {

		// 文件的总大小
		long len = this.originalFile.length();

		// 块数
		this.count = (int) Math.ceil((len * 1.0 / blockSize));

		// 切割生成的文件
		for (int i = 0; i < this.count; i++) {
			this.destPaths.add(this.destDir + "/" + i + "-copy"
					+ this.originalFile.getName().substring(this.originalFile.getName().lastIndexOf(".")));
		}

	}

	public void split() throws FileNotFoundException, IOException {

		// 每块的起始位置
		int beginPos = 0;

		// 文件的总大小
		long len = this.originalFile.length();

		// 每块实际的大小
		int actualSize = (int) (len < blockSize ? len : blockSize);

		// 每块的起始位置和实际的大小
		for (int i = 0; i < this.destPaths.size(); i++) {

			// 每块的起始读取位置
			beginPos = i * blockSize;

			// 最后一块可能不够的情况
			if (i == this.destPaths.size() - 1) {
				actualSize = (int) len;
			} else {
				actualSize = blockSize;
				len -= actualSize;
			}

			spiltDatile(i, beginPos, actualSize);
		}

	}

	private void spiltDatile(int i, int beginPos, int actualSize) throws FileNotFoundException, IOException {

		// 创建随机访问流对象
		RandomAccessFile accessFile = new RandomAccessFile(this.originalFile, "r");
		RandomAccessFile accessFile2 = new RandomAccessFile(this.destPaths.get(i), "rw");
		accessFile.seek(beginPos);

		// 接收每次读取的字节数
		byte[] flush = new byte[1024];

		// 每次读到的实际长度
		int len;
		while ((len = accessFile.read(flush)) != -1) {
			if (actualSize >= len) {

				// 输出到指定的文件中
				accessFile2.write(flush, 0, len);
				actualSize -= len;
			} else {

				// 输出到指定的文件中
				accessFile2.write(flush, 0, actualSize);
				break;
			}
		}

		// 关闭流
		accessFile.close();
		accessFile2.close();
	}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中可以使用RandomAccessFile类来实现文件分割。具体步骤如下: 1. 创建一个RandomAccessFile对象,指定要分割文件和读写模式。 2. 获取文件总长度,计算出每个分割文件的长度。 3. 循环读取原文件,每读取到一个分割文件长度的数据就将其写入一个新文件中。 4. 关闭所有文件。 下面是一个简单的Java文件分割示例代码: ```java import java.io.*; public class FileSplitter { public static void main(String[] args) { String sourceFile = "D:/sample.txt"; // 原文件名 String targetFolder = "D:/split/"; // 分割文件存放目录 int fileSize = 1024 * 1024; // 分割文件大小,这里为1MB try { // 创建RandomAccessFile对象 RandomAccessFile raf = new RandomAccessFile(sourceFile, "r"); // 获取文件总长度 long totalSize = raf.length(); // 计算分割文件数 int fileCount = (int) Math.ceil((double) totalSize / fileSize); // 循环读取原文件并写入分割文件 byte[] buffer = new byte[fileSize]; int len; for (int i = 0; i < fileCount; i++) { // 创建分割文件 File targetFile = new File(targetFolder + "part" + i); RandomAccessFile targetRaf = new RandomAccessFile(targetFile, "rw"); // 读取并写入分割文件 while ((len = raf.read(buffer)) != -1) { targetRaf.write(buffer, 0, len); if (targetRaf.length() >= fileSize) { break; } } // 关闭分割文件 targetRaf.close(); } // 关闭原文件 raf.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 以上代码将一个名为sample.txt的文件分割成1MB大小的多个文件,并存放在D:/split目录下。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值