代码如下
package com.oceansoft.dupcheck;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PushbackReader;
import java.io.Writer;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.oceansoft.dupcheck.util.IOUtils;
/**
* 大文件分割工具类(把大的文本文件分割为小的文本文件,按行分割)
*
* @author 储玉庭
*/
class FileSpliter {
private static ThreadLocal<AtomicInteger> threadCounter = new ThreadLocal<AtomicInteger>();
private static ThreadLocal<FileProceedCallback> threadCallback = new ThreadLocal<FileProceedCallback>();
public static final void setThreadFileCallback(FileProceedCallback callback) {
if (null != threadCallback.get()) {
throw new IllegalStateException("callback already set");
}
threadCallback.set(callback);
}
/**
* 分割指定目录下的文件
*
* @param inputDir
* 输入文件目录
* @param extension
* 文件扩展名
* @param splitSize
* 分割后的小文件的大小
* @throws IOException
*/
public static final void splitFiles(File inputDir, final String extension,
String encoding, int splitSize) throws IOException {
File[] files = inputDir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.getPath().endsWith(extension);
}
});
if (null != files) {
for (File file : files) {
splitFile(file, encoding, splitSize);
}
}
threadCallback.get().proceedEnd();
}
private static final void splitFile(File largeFile, String encoding,
int splitSize) throws IOException {
threadCounter.set(new AtomicInteger(0));
if (largeFile.length() <= splitSize) {
File tmpFile = nextFile(largeFile);
IOUtils.copyFile(largeFile, tmpFile);
threadCallback.get().proceeded(tmpFile);
return;
}
File proceedFile = null;
final FileProceedCallback callback = threadCallback.get();
PushbackReader reader = null;
Writer output = null;
try {
int c;
int totalBytes = (int) largeFile.length();
int charsRead = 0, totalBytesRead = 0;
String CRLF = System.getProperty("line.separator");
proceedFile = nextFile(largeFile);
reader = new PushbackReader(new BufferedReader(
new InputStreamReader(new FileInputStream(largeFile),
encoding)));
output = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(proceedFile), encoding));
boolean hasLine = false;
while (true) {
c = reader.read();
if (-1 == c) {
break;
}
totalBytesRead++;
charsRead++;
if ('\r' == c) {
if (!hasLine) {
hasLine = true;
// 保存文件,生成下一个文件
if (charsRead >= splitSize) {
hasLine = false;
output.close();
charsRead = 0;
callback.proceeded(proceedFile);
proceedFile = nextFile(largeFile);
output = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(proceedFile),
encoding));
}
}
// consume \n if possible
c = reader.read();
if ('\r' != c && '\n' != c) {
reader.unread(c);
} else {
totalBytesRead++;
charsRead++;
}
} else if ('\n' == c) {
if (!hasLine) {
hasLine = true;
// 保存文件,生成下一个文件
if (charsRead >= splitSize) {
hasLine = false;
output.close();
charsRead = 0;
callback.proceeded(proceedFile);
proceedFile = nextFile(largeFile);
output = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(proceedFile),
encoding));
}
}
} else {
if (hasLine) {
hasLine = false;
output.write(CRLF);
}
output.write(c);
}
}
} finally {
try {
if (null != reader) {
reader.close();
}
if (null != output) {
output.close();
}
} catch (IOException e) {
e.printStackTrace();
}
if (null != proceedFile) {
callback.proceeded(proceedFile);
}
}
}
private static final File nextFile(File original) {
String filename = original.getName();
File tempDir = new File(System.getProperty("java.io.tmpdir")
+ File.separator + "split");
File file = new File(tempDir, filename.concat(".").concat(
String.valueOf(threadCounter.get().getAndIncrement())));
if (null != file.getParentFile() && !file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
return file;
}
public static interface FileProceedCallback {
/**
* 某个文件处理成功
*
* @param file
*/
void proceeded(File file);
/**
* 所有文件处理完毕
*/
void proceedEnd();
}
}
相关推荐
在Java编程语言中,分割大文件是一项常见的任务,特别是在处理大量数据或需要分批传输大文件的场景下。本文将详细介绍如何使用Java将一个大文件按照特定条件(如文件大小或生成日期)分割成多个小文件。 首先,我们...
Java 将大文件分割为小文件 Java 将大文件分割为小文件是指将一个大文件分割成多个小文件,以便于存储、管理和处理。下面是实现该功能的 Java 代码示例: ### 1. 大文件分割 大文件分割是指将一个大文件分割成多...
Java实现按行分割大文件 Java实现按行分割大文件是指将一个大的文本文件按行分割成几个小文件的过程。这个过程可以使用Java语言来实现,本文将详细介绍Java实现按行分割大文件的方法。 知识点1: Java中读取大文件...
Java文件分割压缩是一种常见的操作,尤其在处理大数据或者网络传输时非常有用,因为单个大文件可能会导致处理效率低或传输困难。以下是一些相关的Java编程知识点: 1. **文件I/O操作**:在Java中,`java.io`包提供...
文件分割是其中的一个子领域,它涉及到将一个大文件拆分成多个小文件以便于传输、存储或处理。本篇将详细介绍如何使用Java实现文件的分割,并提供相关的代码示例。 首先,我们需要理解文件分割的基本原理。文件分割...
本篇文章将详细探讨基于Java的文件分割器和合并器的实现原理、相关知识点以及源码解析。 首先,文件分割是在大文件处理时常用的一种技术。当一个文件过大,无法一次性读取或者传输时,可以将其分割成多个小文件进行...
用Java语言实现的文件分割器。可按大小或数量对二进制文件和文本文件进行分割; 可探测文本文件的字符集编码,有效解决了分割乱码的问题;支持扩展定制,可以实现 满足特定需求的文件分割器。本代码附有详尽的注释,...
文件分割和文件合并功能,java语言开发
这个“将大文件分割及合并java源码”的资源就是针对这一需求提供的解决方案。 首先,我们来看一下`SplitImageUtil.java`这个文件,它是实现文件分割和合并功能的主要代码。在Java中,我们可以使用`java.io`包中的`...
基于java窗体的文件分割器 大文件也能分割 功能强大
学习这个Java文件分割程序,你可以了解到以下关键知识点: 1. Java的I/O流:包括FileInputStream、FileOutputStream,以及它们的使用方式。 2. 文件操作:如打开、读取、写入和关闭文件。 3. 流的缓冲:可能会用到...
文件分割则相反,将大文件拆分为多个小文件。其主要步骤包括: 1. 创建`FileInputStream`对象,读取大文件。 2. 根据指定大小计算出需要分割的文件数量。 3. 创建`FileOutputStream`对象,为每个子文件创建输出流。...
### Java实现文件分割与合并 #### 一、概述 本文将详细介绍如何使用Java语言实现文件的分割与合并功能。此技术对于数据传输、备份或处理大量数据时非常有用。通过分割大文件为较小的部分,可以有效地减少单个文件...
Java文件分割器是一种实用工具,尤其对于处理大文件而言,它可以将大文件分解为多个小文件,便于存储、传输或管理。这个特定的Java实现已经被打包成一个名为`split.jar`的可执行JAR文件,用户可以直接运行来对大文件...
在Java编程中,文件分割是一项常见的任务,尤其在大数据处理、网络传输或存储优化时显得尤为重要。本示例“java实现文件的分割.rar”提供的SplitFile程序,利用了Java的随机访问流(RandomAccessFile)来实现文件的...
在Java编程语言中,文件操作是常见的任务之一,特别是在处理大型文件时,有时我们需要将大文件分割成多个小文件,以便于传输、存储或者优化处理效率。同样,我们也可能需要将这些小文件重新合并成原始的大文件。在这...
以下是一个简单的Java文件分割器实现的步骤: 1. **打开源文件**:使用`FileInputStream`打开要分割的源文件。通常会配合`BufferedInputStream`以提高读取效率。 ```java FileInputStream fis = new ...
总的来说,使用Java实现任意文件分割是一种实用的技术,它能够帮助我们处理大文件,适应各种存储和传输限制。通过合理的设计和优化,这样的工具可以兼顾速度和空间效率,对于开发人员来说是一项有价值的技能。
使用java开发的一个大文件切割成多个小文件的工具,只要安装了java环境,之间点击运行就行了。