读取文件,替换单词并使用Java写入新文件

时间:2014-01-07 17:00:01

标签: java regex file-io arraylist

我正在尝试读取一个文本文件,然后将其放入ArrayList中,然后遍历该ArrayList并将“this”一词替换为“ * *”。然后我想把这个修改过的ArrayList放回到一个带有新编辑文本的新文件中。

应用程序当前正确地将行读入ArrayList并写入新文件。但是,replaceWords方法似乎没有按预期运行,即这不会被 * *取代。任何帮助将不胜感激!

package com.assignment2s162305.answers;

import java.io.FileWriter;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Collections;

public class Question27 {

    private List<String> lines = new ArrayList<String>();

    // read original file to an ArrayList
    public String[] readOriginalFile(String filename) throws IOException {
        FileReader fileReader = new FileReader(filename);
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        String line = null;
        while ((line = bufferedReader.readLine()) != null) {
            lines.add(line);
        }
        bufferedReader.close();
        return lines.toArray(new String[lines.size()]);
    }

    // replace words with ****
    public void replaceWords() {
        Collections.replaceAll(lines, "this", "****");
        System.out.println(lines);
    }

    // write modified ArrayList to a new file
    public void writeToNewFile() throws IOException {
        FileWriter writer = new FileWriter("output.txt");
        for (String str : lines) {
            writer.write(str);
        }
        writer.close();
    }

}

package com.assignment2s162305.answers;

import java.io.IOException; 

public class Question27Test {  
    public static void main(String[] args) {  
        Question27 question27object = new Question27();

        String filename = "Hamlet2.txt";  

        try {  
            String[] lines = question27object.readOriginalFile(filename);
            System.out.println("______ORIGINAL DOCUMENT______\n");
            for (String line : lines) {  
                System.out.println(line);  
            }
            System.out.println("\n\n");
            question27object.replaceWords();
            question27object.writeToNewFile();
        } catch(IOException e) {  
            // Print out the exception that occurred  
            System.out.println("Unable to create "+filename+": "+e.getMessage());                
        }  
    }  
}

3 个答案:

答案 0 :(得分:1)

您的replaceWords方法存在错误。要修复它,您需要遍历这些行并在每行中进行替换。您实施的是用"this"替换所有等于****的行。所以这可行,但不是你想要的。

这个代码。这将解决它。

public void replaceWords() {
    ArrayList<String> lns = new ArrayList<String>();
    for (String ln : lines){
        lns.add(ln.replaceAll("this", "****"));
    }
    lines.clear();
    lines = lns;
    System.out.println(lines);
}

答案 1 :(得分:0)

您正在阅读数组lines中的文本行。但是,Collections.replaceAll不会在字符串中搜索以替换单词"this";它只是测试整行是否等于"this",它肯定不是。

  

将列表中所有出现的指定值替换为另一个。更正式地,将newVal替换为列表中的每个元素e(oldVal == null?e == null:oldVal.equals(e))。

示例:

List<String> lines = new ArrayList<String>();
lines.add("This");
lines.add("this");
lines.add("THIS");
lines.add("this won't work.");
Collections.replaceAll(lines, "this", "****");
System.out.println(lines);

输出:

[This, ****, THIS, this won't work.]

您可以将行拆分为单词,并在Collections.replaceAll字词上尝试List

或者,您可以使用String's replace method,它将与该行中的字匹配:

for (int i = 0; i < lines.size(); i++)
{
    lines.set(i, lines.get(i).replace("this", "****"));
}

答案 2 :(得分:0)

来自replaceAll方法javadoc:

  

用列表替换列表中所有出现的指定值   另一个。更正式地,将newVal替换为列表中的每个元素e   这样(oldVal == null?e == null:oldVal.equals(e))。 (这种方法   对列表的大小没有影响。)

这意味着,您正在尝试使用保存"this"文本的String实例替换保留"****"文本的String实例,而不是替换String对象中的文本。请注意,String是不可变的。

您必须使用String#replaceString#replaceAll方法迭代字符串列表并替换文本。