2014-11-22 4 views
0

의 일부가 포함되어 있으면 스캐너를 사용하여 전체 행을 표시하므로 특정 파일 서명에 대한 16 진 덤프를 분석하는 프로젝트를 진행 중입니다. 내가 겪고있는 문제는 크기가 16GB 이상인 덤프를 분석하려고 할 때 OutOfMemoryError : Java 힙 공간 오류가 발생합니다. 그래서 내 생각은 내가 사용하고있는 알고리즘을 재 설계하는 것이다.행에 문자열 일치 (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); 
      } 
     } 

    } 
} 

은 그래서 특정 파일 헤더 및 트레일러에 대한 그 ArrayList를 검색 한 후 entireTextFile의 ArrayList에 전체 파일을 추가하고 있어요 :

는 지금 내 코드는 비슷한 보인다. 전형적인 헥스 덤프는 비슷한에, 어떻게 생겼는지 모르는 분들을 위해

하십시오 JPEG의 헤더 이후

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.......... 

는 "ffd8 FFE0"내가 원하는 것이 유일한 라인 나는이 리눅스에서 grep으로 유사합니다 알고

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

,하지만 난 윈도우 플랫폼에서 일식을 이루어 자바 프로젝트를 위해이 일을 해요 : 내 JPGHeaders의 ArrayList에 추가 할 것은. 처음에 파일을 스캔하는 동안 파일의 각 행을 검색하고 해당 행을 해당 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