2016-03-10 2 views
-1

Мне нужно найти слово «тест» в файле. Файл, который я использую, является текстовым файлом, но я буду использовать его для двоичных файлов.Java: поиск конкретных байтов в двоичном файле и замена или удаление указанных байтов

Следующий код выглядит так, как будто он работает для меня, но он не работает. Я могу отображать экземпляры «теста» в файле, но я не могу получить его в основном. Не записывать «тест» в созданный файл.

Любая помощь пожалуйста?

public static void makelabels(){ 
    File file = new File("test.txt"); 
    // Check if File Exists. 
    if(file.exists()){ 
    //Do work boy!!!! 
    int length = (int) file.length(); 
    System.out.println("\nFile Length is "+length+" bytes"); 
    try{ 
    byte[] bytes = new byte[length]; 
    int i = 0; 
    int count = 0; 
    char c; 
    FileInputStream input = new FileInputStream(file); 
    FileOutputStream output = new FileOutputStream("test2.txt"); 
    input.read(bytes); 
    for(byte b:bytes){ 
    c = (char) b; 
    if(Character.toString(c).equals("t")){ 
     if(Character.toString((char) bytes[i+1]).equals("e")){ 
     if(Character.toString((char) bytes[i+2]).equals("s")){ 
      if(Character.toString((char) bytes[i+3]).equals("t")){ 
      count++; 
      System.out.println("Found TEST " + count +" times"); 

      } 
      else{ 
      output.write(b); 
      } 
     } 
     else{ 
      output.write(b); 
     } 
     } 
     else{ 
     output.write(b); 
     } 
    } 
    else{ 
     output.write(b); 
    } 

    i++; 
    } 
    System.out.println("\n\n"); 
    System.out.println("Test Results\n\n"); 
    input.close(); 
    output.close(); 

    return;} 

    catch(FileNotFoundException ex){ 
    System.out.println("\nFile Not Found"); 
    } 
    catch(IOException ex){ 
    System.out.println("\nCan't Read File"); 
    } 
} 
else{ 
    System.out.println("\nFile Not Found!"); 
    return; 
} 
} 

Спасибо за помощь, которую вы можете предложить.

У меня проблемы с массивом.

Вот содержимое тестового файла.

"this is a test 
Please test me" 

Вот мои результаты

"this is a est 
Please est me" 

код имеет смысл для меня, и на самом деле кажется, что это должно работать, но я не имею никакой удачи.

+2

Ошибка, которую вы получаете, иногда важнее, чем стена кода. –

+0

Этот код получит «ArrayIndexOutOfBoundsException.» Странно, что вы не упомянули об этом. Необъяснимо. – EJP

+0

Я обновил вопрос. Но для EJP проблем с массивом нет. Спасибо в любом случае :) – hackn101

ответ

0

Я мог бы порекомендовать подходить к нему по-другому, вместо того, чтобы преобразовывать каждого человека в байт.

byte[] match = "test".getBytes(); 
for(int i =0; i < 1 + bytes.length - match.length; i++){ 
    boolean flag = true; 
    for(int j= 0; j < match.length; j++){ 
    if(match[j] != bytes[i+j]){ 
     flag = false; 
     break; 
    } 
    } 
    if(flag){ 
    count++; 
    i+=match.length-1; // don't check these bytes anymore which will also cause them to not be written because it won't do the check below. 
    }else{ 
    output.write(b); 
    } 
} 

Внешний цикл будет проходить через каждый байт, который потенциально может начать строку, которую вы хотите совместить. Внутренний цикл начнется в начальной точке и сравните следующие байты. Если все байты совпадают, флаг будет оставаться истинным. Однако, если есть расхождение, флаг будет установлен в значение false. Таким образом, если флаг равен true, увеличьте счетчик.

Редактировать: приведенный выше код теперь увеличивает индекс длины строки, которую вы пытаетесь сопоставить, если находит совпадение. Он делает это в противоположность написанию на выходе. Насколько я понимаю, это то, что вы пытались спросить, но я не уверен. Если бы это было не то, что вы хотели, можете ли вы объяснить немного больше?

+0

Я попробую это позже сегодня и дам вам знать, что я получу. Спасибо, сэр :) – hackn101

+0

Я собираюсь попробовать это прямо сейчас. После прочтения это имеет смысл. Вы сделаете мой день сэр, если это произойдет. Спасибо. Я дам вам знать, если это поможет: 0 – hackn101

+0

Хорошо, так что другой метод атаки, но тот же результат: (как я могу сказать программе, чтобы даже не выводить байты tes t.? Я думаю, что это проблема. Btw Большое спасибо за гораздо более чистый код, чем у меня. lol – hackn101