2010-05-20 2 views
4

Мне нужно найти строку в файле и записать соответствующие строки в другой файл. У меня есть поток для чтения файла и потока для записи файла. Я хочу отправить stringBuffer из read thread для записи потока. Пожалуйста, помогите мне передать это. Я получаю нулевое значение.Пропустить строку между двумя потоками в java

записи резьбы:

class OutputThread extends Thread{ 

    /****************** Writes the line with search string to the output file *************/ 
     Thread runner1,runner; 
     File Out_File; 

     public OutputThread() { 
     } 
     public OutputThread(Thread runner,File Out_File) { 
      runner1 = new Thread(this,"writeThread"); // (1) Create a new thread. 
      this.Out_File=Out_File; 
      this.runner=runner; 
      runner1.start(); // (2) Start the thread. 
     } 


     public void run() 
     { 

      try{ 
      BufferedWriter bufferedWriter=new BufferedWriter(new FileWriter(Out_File,true)); 
      System.out.println("inside write"); 
      synchronized(runner){ 
       System.out.println("inside wait"); 
       runner.wait(); 
      } 
      System.out.println("outside wait"); 
      // bufferedWriter.write(line.toString()); 
      Buffer Buf = new Buffer(); 
      bufferedWriter.write(Buf.buffers); 
      System.out.println(Buf.buffers); 
      bufferedWriter.flush(); 

      } 
      catch(Exception e){ 
      System.out.println(e); 
      e.printStackTrace(); 
      } 

     } 
} 

Read Thraed:

class FileThread extends Thread{  

    Thread runner; 
    File dir; 
    String search_string,stats; 
    File Out_File,final_output; 
    StringBuffer sb = new StringBuffer(); 

     public FileThread() { 
     } 
     public FileThread(CountDownLatch latch,String threadName,File dir,String search_string,File Out_File,File final_output,String stats) { 
      runner = new Thread(this, threadName); // (1) Create a new thread. 
      this.dir=dir; 
      this.search_string=search_string; 
      this.Out_File=Out_File; 
      this.stats=stats; 
      this.final_output=final_output; 
      this.latch=latch; 
      runner.start(); // (2) Start the thread. 
     } 

     public void run() 
     { 

     try{ 
     Enumeration entries; 
     ZipFile zipFile; 
     String source_file_name = dir.toString(); 
     File Source_file = dir; 
     String extension; 
     OutputThread out = new OutputThread(runner,Out_File); 

     int dotPos = source_file_name.lastIndexOf("."); 
     extension = source_file_name.substring(dotPos+1); 

     if(extension.equals("zip")) 
     { 
      zipFile = new ZipFile(source_file_name); 
      entries = zipFile.entries(); 
      while(entries.hasMoreElements()) { 
      ZipEntry entry = (ZipEntry)entries.nextElement(); 
      if(entry.isDirectory()) { 
       (new File(entry.getName())).mkdir(); 
       continue; 
       } 
       searchString(runner,entry.getName(),new BufferedInputStream(zipFile.getInputStream(entry)),Out_File,final_output,search_string,stats); 

      } 

      zipFile.close(); 
     } 

     else 
      { 

      searchString(runner,Source_file.toString(),new BufferedInputStream(new FileInputStream(Source_file)),Out_File,final_output,search_string,stats); 

      } 

     } 

     catch(Exception e){ 
     System.out.println(e); 
     e.printStackTrace(); 
     } 

     } 

     /********* Reads the Input Files and Searches for the String ******************************/ 

     public void searchString(Thread runner,String Source_File,BufferedInputStream in,File output_file,File final_output,String search,String stats) 
     { 
     int count = 0; 
     int countw = 0; 
     int countl=0; 
     String s; 
     String[] str; 
     String newLine = System.getProperty("line.separator"); 

     try 
     { 

      BufferedReader br2 = new BufferedReader(new InputStreamReader(in)); 
      //OutputFile outfile = new OutputFile(); 
      BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(output_file,true)); 
      Buffer Buf = new Buffer(); 
      //StringBuffer sb = new StringBuffer(); 
      StringBuffer sb1 = new StringBuffer(); 

        while((s = br2.readLine()) != null) 
       { 
        str = s.split(search); 
        count = str.length-1; 
        countw += count; 
        if(s.contains(search)){ 
         countl++; 
         sb.append(s); 
         sb.append(newLine); 
        } 
        if(countl%100==0) 
        { System.out.println("inside count"); 
         Buf.setBuffers(sb.toString()); 
         sb.delete(0,sb.length()); 
         System.out.println("outside notify"); 
         synchronized(runner) 
         { 
          runner.notify(); 
         } 

         //outfile.WriteFile(sb,bufferedWriter); 
         //sb.delete(0,sb.length()); 
        } 
       } 
      } 


         synchronized(runner) 
      { 
       runner.notify(); 
      } 

      br2.close(); 
      in.close(); 

      if(countw == 0) 
      { 
       System.out.println("Input File : "+Source_File); 
       System.out.println("Word not found"); 
       System.exit(0); 
      } 
      else 
      { 
       System.out.println("Input File : "+Source_File); 
       System.out.println("Matched word count : "+countw); 
       System.out.println("Lines with Search String : "+countl); 
       System.out.println("Output File : "+output_file.toString()); 
       System.out.println(); 
         } 
     } 
     catch(Exception e){ 
      System.out.println(e); 
      e.printStackTrace(); 
     } 
    } 


} 

ответ

4

Вот подход, который я хотел бы использовать:

  • Добавить очередь в выходной поток. Убедитесь, что доступ синхронизирован.
  • Добавьте метод к выходному потоку (скажем addWork), который принимает String и добавляет его в очередь вывода.
  • Метод run выходного потока непрерывно деактивирует String и записывает их в файл.
  • Позвольте другому потоку пройти String s к выходной резьбе, позвонив по номеру addWork(String).
+0

Хотя я не согласен с моим ответом, потому что я написал его, подход данбена - это подход, который я лично использую при отправке сообщений между потоками (обычно я посылаю байт [], но данные данных.) Если вы - stringbuffer - хорошее конкретное решение, но подход danben - очень хорошее общее решение (вы можете адаптировать синхронизированную очередь к любым данным, которые вам нужно отправить) – corsiKa

1

Передайте stringbuffer как параметр для обоих.

Каждый раз, когда вы получаете доступ к StringBuffer, убедитесь, что вы делаете это внутри синхронизированного блока

synchronized(myStringBuffer) { 
    myStringBuffer.append("Awesome text"); 
} 

и

synchronized(myStringBuffer) { 
    myFileOutput.writeln(myStringBuffer.toString()); 
} 

примеры выше.

+0

Мне это не нравится, поскольку это исключает вас из-за нескольких поисковых потоков. – danben

+0

Нет, это не так, им нужно только синхронизировать их, чтобы обеспечить атомный доступ. – corsiKa

Смежные вопросы