替换特定字符串的文件中的反射

时间:2011-11-14 11:17:11

标签: java string file

我有一个文本文件:

my name is abhi
my name is khan
my name is koushik

现在我想用“viswajit”替换“khan”。我已经为它编写了代码。我的预期输出是:

my name is abhi
my name is viswajit
my name is koushik

我的代码实际上是用“Viswajit”取代“汗”。但是下一行的几个字母很少。 我得到的是O / P:

my name is abhi
my name is viswajit
name is koushik.

最后一行中缺少“我的”字样。 请检查一下,并给我一些想法。 这是我的代码:

public static void replaceStringInFile(String fileName, String match, String replacingString){
        try {
        File file = new File(fileName);

        RandomAccessFile raf = new RandomAccessFile(file, "rw");
        long pointer = raf.getFilePointer();
        String lineData = "";

        while((lineData =raf.readLine()) != null){
        pointer = raf.getFilePointer() - lineData.length()-2;
        if(lineData.indexOf(match) > 0){

            lineData = lineData.replace(match, replacingString+"\n");
            raf.seek(pointer);
            raf.writeBytes(lineData);

3 个答案:

答案 0 :(得分:1)

您没有插入其他文字,而是在覆盖。

如果要插入文本,则没有捷径可以重写文件的其余部分。

因此可能不值得使用RandomAccessFile,因为这可能比使用更复杂。我只是将BufferedReader和PrintWriter用于该文件的副本。

答案 1 :(得分:1)

我不明白为什么在使用文本文件时使用RandomAccessFile的对象。就像Peter Lawrey所说,我建议您使用BufferedReader对象来阅读文件,而不是PrintWriter

编辑: 我在我的机器上检查了您的代码,它对我来说效果很好,但是通过此修改(lineData.length()-2必须是lineData.length()-1)

while((lineData =raf.readLine()) != null){
                pointer = raf.getFilePointer() - lineData.length()-1;
                if(lineData.indexOf(match) > 0){

                    lineData = lineData.replace(match, replacingString+"\n");
                    raf.seek(pointer);
                    raf.writeBytes(lineData);
                }
            }

但是,尝试使用此代码时,它会使用BufferedReaderPrintWriter个对象执行相同的操作,从而创建一个名为the_new_file_with_replacing.txt的新文件:

public static void replaceStringInFile(String fileName, String match, String replacingString){
        try {
            FileReader file = new FileReader(fileName);

            BufferedReader br = new BufferedReader(file);
            PrintWriter pw = new PrintWriter(new FileWriter("the_new_file_with_replacing.txt"));

            String lineData = "";

            while((lineData = br.readLine()) != null){

                                        pw.println(lineData.replaceAll(match,replacingString));
                }
            file.close();
            br.close();
            pw.close();

            }

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

答案 2 :(得分:0)

我能理解的是,当你写回来时,你正在覆盖字节。

支票khan是一个4个字母的单词,viswajit是7个字母。当您替换连续的3个字节时也会被替换。即,您将丢失'my'和换行符。

考虑这一点并操纵你的行动。