2015-12-29 2 views
-1

Я пытаюсь прочитать файл 2GB, используя следующую программу. Дело в том, что я хочу прочитать файл, а затем добавить его в одну строку, которая переходит к программе для дальнейшей обработки. это приложение будет развернуто в Jenkins, где я не могу увеличить размер памяти. Удивительно, если я могу обработать файл на небольшие pieaces, а затем обработать егоЧтение BIG-файла в Java

Когда я добавляю строку в построитель строк, я получил исключение памятиOutOFBound.

StringBuilder build = new StringBuilder(); 
      try { 
      FileInputStream fstream = new FileInputStream("E:"+File.separator+"file"+File.separator+"File.text"); 
      BufferedReader br = new BufferedReader(new InputStreamReader(fstream)); 

      String strLine; 

      //Read File Line By Line 
      while ((strLine = br.readLine()) != null) { 
       // Print the content on the console 
       build.append(strLine); 
      } 

      //Close the input stream 
      br.close(); 
      } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

Любая идея, как разобрать большой файл в строку? или я должен прочитать файл на более мелкие куски, а затем обработать его?

+0

Делитесь информацией о своей среде выполнения в своем сообщении. Для файла 2gb вы хотите> 3gb, назначенного вашему vm.Строка должна войти в память, если вы настаиваете на использовании строки. – Jan

+0

Попробуйте увеличить размер кучи для вашего приложения –

+0

Вы можете обнаружить, что вы * не можете * сделать это, даже с большим размером кучи - если 2GB-файл - это все ASCII, вы получите 4 ГБ строку в памяти. .. который может подтолкнуть некоторые ограничения VM, даже если у вас достаточно памяти. Не могли бы вы обработать «Список » с каждой строкой в ​​виде отдельной строки? –

ответ

0

Вы пытались с увеличением памяти JVM. Вы можете сделать это, предоставив аргументы VM как: -Xms1024m -Xmx2048m

Аргумент -Xms устанавливает начальный и минимальный размер памяти кучи для JVM. Аргумент -Xmx определяет максимальный размер памяти, который куча может достигать для JVM.

-Xms<size> установить начальный Java Размер кучи

-Xmx<size> установить размер кучи максимальный Java

0

Если вы используете Java 7, то вы можете использовать Files класс:

List<String> fileLines = Files.readAllLines(path, StandardCharsets.UTF_8);

Single String:

String contents = new String(Files.readAllBytes(path), StandardCharsets.UTF_8); 
// or equivalently: 
StandardCharsets.UTF_8.decode(ByteBuffer.wrap(Files.readAllBytes(path))); 

JAVA 8:

Вам не нужно никакого внешнего класса. Используйте Stream:

try (Stream<String> lines = Files.lines(myPath)) { 
    list = lines.collect(Collectors.joining(", ")); 
} catch (IOException e) { 
    LOGGER.error("Failed to load file.", e); 
} 

Или вы можете использовать сторонние библиотеки

гуавы

com.google.common.io.Files содержит много полезных методов.

String toString(File, Charset) 

или

List<String> readLines(File, Charset) 

Apache CommonsI/вывода

org.apache.commons.io.IOUtils также предлагают аналогичные функциональные возможности:

String toString(InputStream, String encoding)

List readLines(InputStream, String encoding)

Для меня Guava отлично подходит для аналогичной реализации.

+0

Это хорошие альтернативы для чтения файла, но я не вижу, как это относится к проблема памяти, которая является основной частью вопроса. –