这是我的代码:
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");
}
}
}
我正在尝试更新关键字txt文件中的单词列表,现在它确实更新了它,但它将其放入格式[generic,pharmacy,little,inside]
这是错误的,因为如果我再次运行我的代码,它正在搜索文件是否包含[通用,药房,小,内部]我需要它来搜索每个单词而不是加号逗号或大括号。所以基本上我希望它以像这样的列表格式复制单词
generic
pharmacy
little
inside
这样就可以搜索每个单词。我想出了如何做这个部分。现在,如何将发件人添加到其他文本文件?还有一种方法可以修改它,所以它不会两次添加相同的关键字吗?感谢
答案 0 :(得分:0)
这是因为您正在向该文件写入一个数组,这会导致调用它的toString
方法。写下每一个项目。
而不是pw.println(keywords);
执行:
for (String keyword : keywords)
{
pw.println(keyword.trim());
}
或者,如果每个单词都包含\ n,那么这应该有效
for (String keyword : keywords)
{
pw.print(keyword);
}
答案 1 :(得分:0)
而不是:
pw.println(keywords);
你应该循环遍历数组并单独添加每一行。
for(int i = 0; i < keywords.length; i++) {
pw.println(keywords[i]);
}
答案 2 :(得分:0)
那是因为您正在打印ArrayList
对象。在你的代码中,keywords
是List的实例,你会给你一个[aa,bb]的输出。除此之外你会得到重复的单词,因为这些列表实例是类变量,并打印在循环中
keywords.addAll(subjectWords);
pw.println(keywords);
您可以在for循环之外循环keywords
或在添加到列表之前打印word
。