2014-11-22 13 views
0

, поэтому я работаю над этим проектом, который анализирует шестнадцатеричные дампы для определенных подписи файлов. Проблема, с которой я сталкиваюсь, заключается в попытке проанализировать дампы размером 16+ ГБ, я получаю ошибку OutOfMemoryError: Java heap space. Поэтому я решил перепроектировать алгоритм, который я использую.Использование сканера для отображения всей строки, если строка содержит любую часть соответствия строки (Java)

Прямо сейчас мой код выглядит что-то похожее на:

public class Test 
{  
    private static ArrayList<String> JPGHeaders = new ArrayList<String>(); 
    private static ArrayList<String> JPGTrailers = new ArrayList<String>(); 
    private static ArrayList<String> entireTextFile = new ArrayList<String>(); 

    public static void main (String[] args) 
    { 
     Scanner scanner = new Scanner(new File("C:\\HexAnalyser\\HexDump\\fileTest.txt")); 

     while (scanner.hasNextLine()) 
     { 
      entireTextFile.add(scanner.nextLine()); 
     } 

     for (String line : entireTextFile) 
     { 
      if(line.contains(Constants.JPGHEADER)) 
      { 
       JPGHeaders.add(line); 
      } 

      if(line.contains(Constants.JPGTRAILER)) 
      { 
       JPGTrailers.add(line); 
      } 
     } 

    } 
} 

так это добавление весь файл в entireTextFile ArrayList, а затем искать что ArrayList для конкретных заголовков файлов и прицепов.

Для тех из вас, кто не знает, что типичный шестигранной свалка выглядит, его похожим на:

0012be0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0012bf0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0012c00: ffd8 ffe0 0010 4a46 4946 0001 0201 0050 ......JFIF.....P 
0012c10: 0050 0000 ffed 166e 5068 6f74 6f73 686f .P.....nPhotosho 
0012c20: 7020 332e 3000 3842 494d 03ed 0000 0000 p 3.0.8BIM...... 
0012c30: 0010 0050 0000 0001 0001 0050 0000 0001 ...P.......P.... 
0012c40: 0001 3842 494d 040d 0000 0000 0004 0000 ..8BIM.......... 
0012c50: 002d 3842 494d 03f3 0000 0000 0008 0000 .-8BIM.......... 

с заголовком для JPEG является «ffd8 ffe0», единственная линия, которую я хотел бы чтобы добавить к моему JPGHeaders ArrayList является:

0012c00: ffd8 ffe0 0010 4a46 4946 0001 0201 0050 ......JFIF.....P 

Я знаю, что это похоже на Grep в Linux, но я делаю это для Java проекта, в затмении на платформе Windows. Есть ли более простой способ поиска в каждой строке файла при его первоначальном сканировании и добавлении этих конкретных строк к соответствующему arraylist? или я застреваю весь файл в ArrayList, а затем просматриваю ArrayList для строковых литералов?

ответ

1
public class Test 
{  
    private static ArrayList<String> JPGHeaders = new ArrayList<String>(); 
    private static ArrayList<String> JPGTrailers = new ArrayList<String>(); 
    private static ArrayList<String> entireTextFile = new ArrayList<String>(); 

    public static void main (String[] args) 
    { 
     Scanner scanner = new Scanner(new File("C:\\HexAnalyser\\HexDump\\fileTest.txt")); 

     while (scanner.hasNextLine()) 
     { 
      String line = scanner.nextLine(); 
      if(line.contains(Constants.JPGHEADER)) 
      { 
       JPGHeaders.add(line); 
      } 

      if(line.contains(Constants.JPGTRAILER)) 
      { 
       JPGTrailers.add(line); 
      } 
     } 

    } 
} 

Зачем хранить все это в памяти? Как только вы прочтете строку, проанализируйте ее. Если это не имеет значения, отбросьте его.

+0

Это изящный. Ненавижу, как иногда самые очевидные решения забывают, когда вы некоторое время смотрите на проект. Спасибо. – Mattski357