2014-12-08 1 views
0

Мое приложение разбивает файл .zip на две части. Он отлично работает, когда размер файла меньше 100 МБ. Если размер файла больше, чем 100MB даетOutOfMemoryError в то время как разрыв zip-файла на две части

java.lang.OutOfMemoryError 
    at java.io.FileInputStream.readBytes(Native Method) 
    at java.io.FileInputStream.read(FileInputStream.java:198) 

Я использую glassfishV3 и JDK6

-Xms512m -Xmx512m не хватает

then I have set 
<jvm-options>-Xms1024m</jvm-options> 
<jvm-options>-Xmx1024m</jvm-options> 

, но затем он дает

"Error occurred during initialization of VM Could not reserve enough space for object heap Could not create the Java virtual machine." 

public void create() { 
    byte[] bFile = takeByteArr("file1.zip"); 
    byte[] bPart1 = Arrays.copyOfRange(bFile, 0, 100000); 
    byte[] bPart2 = Arrays.copyOfRange(bFile, 100000, bFile.length); 
    createFile(bPart1, "part1.zip"); 
    createFile(bPart2, "part2.zip"); 
} 

void createFile(byte[] bFile, String path) { 
    try { 
     FileOutputStream fos = new FileOutputStream(path); 
     fos.write(bFile); 
     fos.close(); 
    } catch (FileNotFoundException ex) { 
     System.out.println("FileNotFoundException : " + ex); 
    } catch (IOException ioe) { 
     System.out.println("IOException : " + ioe); 
    } 
} 

byte[] takeByteArr(String filePath) { 
    File file = new File(filePath); 
    byte[] bFile = new byte[(int) file.length()]; 
    try { 
     FileInputStream fileInputStream = new FileInputStream(file); 
     fileInputStream.read(bFile); 
     fileInputStream.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return bFile; 
} 
+0

Сколько оперативной памяти есть на вашем компьютере? И сколько свободного ОЗУ есть, когда вы получаете это сообщение? У вас есть 32 или 64-битная система и JDK. Когда у меня появляется это сообщение, я пытаюсь закрыть как можно больше программ и начать снова, в большинстве случаев этого достаточно. – StephaneM

+0

Нужно ли это делать на Java? Может быть, OS-команда может быть вызвана из Java, чтобы разделить файл ... –

+1

* Почему вы это делаете? Части не имеют смысла без всех других частей. Кажется бесполезным. В любом случае, конечно, это не сработает, если вы просто скопируете первые 100000 байт в другой кусок памяти, а затем предположите, что остальное тоже будет вписываться в память, а также в исходный файл. Файлы должны обрабатываться либо строкой, либо записью или буфером за раз. – EJP

ответ

0

Как уже было сказано в комментарии, большие файлы не читаются в одной части, а в меньшем буфере. Затем буфер обрабатывается, в вашем случае это будет сохранение файла детали на диск и повторное использование в цикле, который считывает фрагмент файла куском. Преимущество этого метода заключается в том, что вам нужно столько памяти, сколько размер вашего буфера.

FileInputStream класс имеет метод, названный read(byte[] b, int off, int len), который считывает Len количество байтов, начиная со смещения от в байтовый массив б из InputStream. Метод возвращает int, представляющий количество байтов, считанных во время вызова метода, и -1, если ничего не было прочитано.

Пример:

byte[] b = new byte[1024]; 
    int read = inputStream.read(b, 0, 1024); 

Теперь у вас есть массив байтов б что 1024 байт большой и содержит чтения байт содержимого.

Вы можете просмотреть свой файл, но вы должны обратить внимание на последнюю часть. Буфер массива байтов также будет иметь размер 100000, но я думаю, вы не хотите создавать последнюю часть с этим размером. Поэтому вам нужно воссоздать буфер с количеством байтов, которые на самом деле являются последней частью содержимого.

Ваш код может выглядеть следующим образом:

public void create() throws IOException { 
    FileInputStream in = new FileInputStream(new File("file1.zip")); 

    byte[] b = new byte[100000]; 
    int read; 
    int counter = 0; 
    while ((read = in.read(b, 0, 100000)) != -1) { 
     if(read != 100000) { // <- the last part 
      b = Arrays.copyOfRange(b, 0, read); 
     } 
     createFile(b, "part" + counter++ + ".zip"); 
     b = new byte[100000]; 
    } 
} 
Смежные вопросы