2013-11-27 6 views
0

Вот мой код:Попытки изменить текстовый файл в Java

import java.util.Scanner; 
import java.io.*; 
import java.util.ArrayList; 

public class Filter{ 

    Message myMessage; 
    Scanner input; 
    Scanner input2; 
    String sender; 
    String subject; 
    String emailMIN; 
    String line; 
    String line2; 
    ArrayList<String> blacklist = new ArrayList<String>(); 
    ArrayList<String> keywords = new ArrayList<String>(); 
    ArrayList<String> subjectWords = new ArrayList<String>(); 
    ArrayList<String> emails = new ArrayList<String>(); 
    //String[] lines; 
    File SpamMessage; 
    File inFile; 
    File inFile2; 
    File tempFile; 
    String[] lines; 



    public Filter(Message m,String blacklistFile, String keywordFile, String Spam)throws IOException{ 
      inFile = new File(blacklistFile); 
      inFile2 = new File(keywordFile); 
      input = new Scanner (inFile); 
      input2 = new Scanner (inFile2); 
                            myMessage =m; 
      SpamMessage=new File(Spam); 
    } 


    public void filter() throws IOException{ 
      PrintWriter output = new PrintWriter(SpamMessage); 
      while(input.hasNextLine()){ 
        line = input.nextLine(); 
        //System.out.println(line); 
        if(line!=null) 
          blacklist.add(line); 
      }  
      while(input2.hasNextLine()){ 
        line2 = input2.nextLine(); 
        //System.out.println(line2); 
        if(line!=null) 
          keywords.add(line2); 
      } 

      emails=myMessage.getEmails(); 
    //  System.out.println(emails.size() + emails.get(1)); 
      for(int i = 0; i < emails.size(); i++){ 
    //    boolean isSpam = false; 
        lines = emails.get(i).split("\n"); 
    //    System.out.println(lines[5] + lines[7]); 
        sender = lines[2].substring(lines[2].indexOf('<'), lines[2].indexOf('>')); 
    //`    System.out.println(sender); 
        emailMIN = lines[6].substring(lines[6].indexOf('<'), lines[6].indexOf('>')); 
    //    System.out.println(emailMIN); 
        for(int j =0; j<lines.length; j++) 
        { 
          if(j==2) 
          { 
            for(String blacklist2: blacklist) 
            { 
          //    System.out.println(blacklist2); 
              if(lines[j].contains(blacklist2)) 
              { 
              output.println(emailMIN); 
              } 
          //    output.close(); 
            } 
          } 
          if(j==5 || j>=7) 
          { 
          //  System.out.println(keywords.size()); 
            for(String keywords2: keywords) 
            { 
          //    System.out.println(keywords2); 
              if(lines[j].contains(keywords2)) 
              { 
                output.println(emailMIN); 
              } 
            //  output.close(); 
            } 
          } 
        //addKeywords(); 
      } 

    } 
    output.close(); 
    addKeywords(); 
    } 

    public void addKeywords() throws IOException 
    { 
      tempFile = new File("tempFile.txt"); 
      PrintWriter pw = new PrintWriter(new FileWriter(tempFile)); 

      for(int i=0; i<lines.length; i++) 
      { 
        if(i==5){ 
          String[] words = lines[i].split(" "); 
          for(String word: words){ 
            if(word.length()>=6){ 
              subjectWords.add(word +"\n"); 
              //System.out.println(subjectWords); 
            } 
          }    
          keywords.addAll(subjectWords); 
          pw.println(keywords); 

        } 
      }    
      pw.close(); 
      if (!inFile2.delete()) { 
        //System.out.println("Could not delete file"); 
        return; 
      }    

    // Rename the new file to the filename the original file had. 
      if (!tempFile.renameTo(inFile2)){ 
        //System.out.println("Could not rename file"); 
      } 
    } 
} 

Я пытаюсь обновить список слов в файле ключевых слов текстового прямо сейчас это обновление, но она ставит его в формат [generic, pharmacy, little, inside]

Это неправильно, потому что если я снова запустил свой код, он ищет, если файл содержит [generic, pharmacy, little, inside], и ​​мне нужно его искать каждое слово а не плюс запятая или скобка. Поэтому в основном я хочу, чтобы он скопировал слова в виде списка, подобном этому

generic 
pharmacy 
little 
inside 

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

ответ

0

Это потому, что вы пишете массив в файл, который вызывает метод, который он вызывается toString. Вместо этого напишите каждый элемент.

Вместо pw.println(keywords);

Do:

for (String keyword : keywords) 
{  
    pw.println(keyword.trim()); 
} 

Или, если каждое слово содержит \ п уже, это должно работать

for (String keyword : keywords) 
{  
    pw.print(keyword); 
} 
+0

Как это сделать? Мне жаль, что у меня мало времени, и если бы вы могли показать мне, как это сделать, я бы очень признателен. – user2977165

+0

Хорошо, что работает, но он помещает пробелы между каждым элементом списка, поэтому теперь он также ищет пробелы, когда я снова запустите его – user2977165

+0

@ user2977165 Как вы имеете в виду пробелы? Попробуйте мое редактирование –

0

Вместо того чтобы делать:

pw.println(keywords); 

вы с hould вместо этого цикл через массив и добавить каждую линию индивидуально.

for(int i = 0; i < keywords.length; i++) { 
    pw.println(keywords[i]); 
} 
0

Это было потому, что вы печатаете объект ArrayList. В вашем коде keywords является экземпляром списка, и вы бы дали вам выход из [aa, bb]. Более того, вы получите повторяющиеся слова, так как этот экземпляр списка является переменным классом, и печатается внутри цикла

keywords.addAll(subjectWords); 
pw.println(keywords); 

Либо вы можете петля вокруг keywords снаружи для цикла или распечатать word перед добавлением в список.

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