Java:在二进制文件中搜索特定字节并替换或省略所述字节

时间:2016-03-10 22:02:12

标签: java binary byte fileinputstream fileoutputstream

我需要在文件中搜索“test”这个词。我正在使用的文件是一个文本文件,但我将在二进制文件上使用它。

以下代码看起来应该对我有用,但它不起作用。我能够在文件中显示“test”的实例,但我无法理解它在创建的文件中不写“test”。

请帮忙吗?

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"

代码对我来说很有意义,而且看起来应该可行,但我没有运气。

1 个答案:

答案 0 :(得分: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);
  }
}

外部循环将遍历每个可能开始您想要匹配的String的字节。内部循环将从起始点开始,并比较以下字节。如果所有字节都匹配,则Flag将保持为真。但是,如果存在差异,则标志将设置为false。因此,如果flag为true,则递增计数。

编辑:上面的代码现在将索引增加索引,如果找到匹配项,则会尝试匹配的字符串的长度。它与写入输出相反。根据我的理解,这是你想要问的,但我不确定。如果那不是你想要的,你能解释一下吗?