Я хочу обрезать большие файлы любого типа (аудио, видео, изображения ...) на маленькие. Я пробовал много алгоритмов, но я не могу этого сделать. Может ли кто-нибудь предложить мне рабочий алгоритм?Алгоритм коммутации для любого типа данных
-1
A
ответ
0
Просто скопируйте куски в маленькие файлы, используя следующие стартовые позиции:
N = FileSize/ChunkSize //integer division
RestSize = FileSize % ChunkSize //integer modulo
for i = 0 to N - 1
Copy ChunkSize bytes from position i * ChunkSize into ChunkFile[i]
if RestSize > 0
Copy RestSize bytes from position N * ChunkSize into ChunkFile[N]
Пример: необходимо разделить 7 байт файла в 2-байтовых куски. N = 3, RestSize = 1. Три файла с двумя байтами и один 1-байтовый.
0
Вы не можете прочитать большой кусок файлов за один раз, даже если у нас есть такая память. В основном для каждого раскола вы можете прочитать байтовый массив размера исправления, который, как вы знаете, должен быть осуществимым с точки зрения производительности, а также памяти.
public static void main(String[] args) throws Exception
{
RandomAccessFile raf = new RandomAccessFile("test.csv", "r");
long numSplits = 10; //from user input, extract it from args
long sourceSize = raf.length();
long bytesPerSplit = sourceSize/numSplits ;
long remainingBytes = sourceSize % numSplits;
int maxReadBufferSize = 8 * 1024; //8KB
for(int destIx=1; destIx <= numSplits; destIx++) {
BufferedOutputStream bw = new BufferedOutputStream(new FileOutputStream("split."+destIx));
if(bytesPerSplit > maxReadBufferSize) {
long numReads = bytesPerSplit/maxReadBufferSize;
long numRemainingRead = bytesPerSplit % maxReadBufferSize;
for(int i=0; i<numReads; i++) {
readWrite(raf, bw, maxReadBufferSize);
}
if(numRemainingRead > 0) {
readWrite(raf, bw, numRemainingRead);
}
}else {
readWrite(raf, bw, bytesPerSplit);
}
bw.close();
}
if(remainingBytes > 0) {
BufferedOutputStream bw = new BufferedOutputStream(new FileOutputStream("split."+(numSplits+1)));
readWrite(raf, bw, remainingBytes);
bw.close();
}
raf.close();
}
static void readWrite(RandomAccessFile raf, BufferedOutputStream bw, long numBytes) throws IOException {
byte[] buf = new byte[(int) numBytes];
int val = raf.read(buf);
if(val != -1) {
bw.write(buf);
}
}
Вы также должны искать какие-то дискуссии на различных сайтах, как https://coderanch.com/t/458202/java/Approach-split-file-chunks и на других сайтах. Счастливое кодирование.
Что вы имеете в виду? Вы хотите разрезать любой файл на несколько частей, не заботясь о типе содержимого? – MBo
Да, я должен разрезать его на мелкие куски –
Как насчет ['split'] (https://www.gnu.org/software/coreutils/manual/html_node/split-invocation.html)? –