Я пытаюсь разделить двоичный файл (например, видео/аудио/изображение) на куски по 100 кбайт каждый, а затем присоединить эти фрагменты назад, чтобы вернуть исходный файл. Мой код, похоже, работает, в том смысле, что он делит файл и соединяет куски, и файл, который я возвращаю, имеет тот же размер, что и оригинал. Однако проблема заключается в том, что содержимое усекается - то есть, если это видеофайл, он останавливается через 2 секунды, если это файл изображения, то только верхняя часть выглядит правильно.
Вот код, который я использую (я могу опубликовать весь код, если хотите):
Для деления:
File ifile = new File(fname);
FileInputStream fis;
String newName;
FileOutputStream chunk;
int fileSize = (int) ifile.length();
int nChunks = 0, read = 0, readLength = Chunk_Size;
byte[] byteChunk;
try {
fis = new FileInputStream(ifile);
StupidTest.size = (int)ifile.length();
while (fileSize > 0) {
if (fileSize <= Chunk_Size) {
readLength = fileSize;
}
byteChunk = new byte[readLength];
read = fis.read(byteChunk, 0, readLength);
fileSize -= read;
assert(read==byteChunk.length);
nChunks++;
newName = fname + ".part" + Integer.toString(nChunks - 1);
chunk = new FileOutputStream(new File(newName));
chunk.write(byteChunk);
chunk.flush();
chunk.close();
byteChunk = null;
chunk = null;
}
fis.close();
fis = null;
И для присоединения к файлу я помещаю имена всех кусков в список, а затем сортирую их по имени и затем запускаю следующий код:
File ofile = new File(fname);
FileOutputStream fos;
FileInputStream fis;
byte[] fileBytes;
int bytesRead = 0;
try {
fos = new FileOutputStream(ofile,true);
for (File file : files) {
fis = new FileInputStream(file);
fileBytes = new byte[(int) file.length()];
bytesRead = fis.read(fileBytes, 0,(int) file.length());
assert(bytesRead == fileBytes.length);
assert(bytesRead == (int) file.length());
fos.write(fileBytes);
fos.flush();
fileBytes = null;
fis.close();
fis = null;
}
fos.close();
fos = null;