如何使用Java将文件分解成碎片?
我有一个奇怪的问题要问 - 如何使用Java(任何文件类型)将给定的文件分解成小块?然后我可以把这些碎片放到一些CD和/或随身碟上,然后把它们拿走。我尝试这样做
但正如大多数用户所评论的那样,我正在尝试的东西是无法以这种方式实现的。因此,我决定问一个新问题,以获得正确的方法来破坏文件。
当我将文件分解为多个部分(例如30个部分)时,必须有一种方法可以重新组合它们并重新创建原始文件。请帮忙。
我有一个奇怪的问题要问 - 如何使用Java(任何文件类型)将给定的文件分解成小块?然后我可以把这些碎片放到一些CD和/或随身碟上,然后把它们拿走。我尝试这样做
但正如大多数用户所评论的那样,我正在尝试的东西是无法以这种方式实现的。因此,我决定问一个新问题,以获得正确的方法来破坏文件。
当我将文件分解为多个部分(例如30个部分)时,必须有一种方法可以重新组合它们并重新创建原始文件。请帮忙。
将部分字节读取到字节数组,并在缓冲区已满或文件末尾时将其存储在新文件中。
例如(代码并不完美,但它应该有助于理解过程)
class FileSplit {
public static void splitFile(File f) throws IOException {
int partCounter = 1;//I like to name parts from 001, 002, 003, ...
//you can change it to 0 if you want 000, 001, ...
int sizeOfFiles = 1024 * 1024;// 1MB
byte[] buffer = new byte[sizeOfFiles];
String fileName = f.getName();
//try-with-resources to ensure closing stream
try (FileInputStream fis = new FileInputStream(f);
BufferedInputStream bis = new BufferedInputStream(fis)) {
int bytesAmount = 0;
while ((bytesAmount = bis.read(buffer)) > 0) {
//write each chunk of data into separate file with different number in name
String filePartName = String.format("%s.%03d", fileName, partCounter++);
File newFile = new File(f.getParent(), filePartName);
try (FileOutputStream out = new FileOutputStream(newFile)) {
out.write(buffer, 0, bytesAmount);
}
}
}
}
public static void main(String[] args) throws IOException {
splitFile(new File("D:\\destination\\myFile.mp4"));
}
}
my文件.mp4大小 = 12,7 MB
拆分后,我有13个文件
myFile.mp4.001
- myFile.mp4.012
大小 1 MBmyFile.mp4.013
大小 806 KB如果要合并这些文件,可以使用
public static void mergeFiles(List<File> files, File into)
throws IOException {
try (FileOutputStream fos = new FileOutputStream(into);
BufferedOutputStream mergingStream = new BufferedOutputStream(fos)) {
for (File f : files) {
Files.copy(f.toPath(), mergingStream);
}
}
}
您还可以创建一些其他方法,以使您的生活更轻松。例如,该方法将根据其中一个文件的名称(和位置)创建包含分隔部分的文件列表。
public static List<File> listOfFilesToMerge(File oneOfFiles) {
String tmpName = oneOfFiles.getName();//{name}.{number}
String destFileName = tmpName.substring(0, tmpName.lastIndexOf('.'));//remove .{number}
File[] files = oneOfFiles.getParentFile().listFiles(
(File dir, String name) -> name.matches(destFileName + "[.]\\d+"));
Arrays.sort(files);//ensuring order 001, 002, ..., 010, ...
return Arrays.asList(files);
}
使用该方法,我们可以重载方法以仅使用其中一个文件而不是整个列表(我们将根据其中一个文件生成该列表)mergeFiles
File oneOfFiles
List<File>
public static void mergeFiles(File oneOfFiles, File into)
throws IOException {
mergeFiles(listOfFilesToMerge(oneOfFiles), into);
}
您还可以重载这些方法来代替(我们将在需要时将每个字符串包装在文件中)String
File
public static List<File> listOfFilesToMerge(String oneOfFiles) {
return listOfFilesToMerge(new File(oneOfFiles));
}
public static void mergeFiles(String oneOfFiles, String into) throws IOException{
mergeFiles(new File(oneOfFiles), new File(into));
}
读取和写入流作为原始流。避免文本流和读取器。byte[]
在你的最后一个问题中,你显然是根据“行”分解文件的。要复制该行为,只需使用固定大小的读取。请仔细注意最后一个问题的注释中的警告,以检查读取了多少字节。A 不一定在一次读取中填写。byte[]
byte[2^16]