Поскольку файл может быть очень большой, разделять файлы могут сами как хорошо быть большим:
Пример:
Источник Размер файла: 5Гб
Num расколы: 5: Назначение
Размер файла: 1 ГБ каждый (5 файлов)
Невозможно прочитать этот большой кусок сплита за один раз, даже если у нас есть такая память. В основном для каждого раскола мы можем прочитать размер исправления byte-array
, который, как мы знаем, должен быть осуществим с точки зрения производительности, а также памяти.
NumSplits: 10 MaxReadBytes: 8КБ
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);
}
}
В цикле while просто собирайте столько строк, сколько хотите, в String или StringBuilder и записывайте их в отдельные файлы. Вы не можете заранее знать количество файлов, возможно, было бы лучше определить максимальное количество строк в файле. –
Вам нужно либо дважды зациклиться, чтобы получить количество строк, а затем разделить. Или вы можете догадаться о количестве строк и разбить этот путь. –
@ kw4nta Почему бы вам не захотеть _store_ строк. 1) OP говорит, что сохранение всех строк не является вариантом, 2) учитывая, что вы можете писать строки прямо в другой файл ... –