Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 文件中替换特定字符串的反射_Java_String_File - Fatal编程技术网

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

Java 文件中替换特定字符串的反射,java,string,file,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”替换“khan”。但是翻译下一行的几个字母。 我收到的O/P为: my name is abhi my name is viswaji

我有一个文本文件:

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”替换“khan”。但是翻译下一行的几个字母。 我收到的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);

你没有插入额外的文本,你写得太多了

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


因此,可能不值得使用RandomAccessFile,因为这可能比有用的更复杂。我只需要使用BufferedReader和PrintWriter来复制文件。

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

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


考虑这一点并操纵您的操作。

我不明白您在使用文本文件时为什么要使用
RandomAccessFile
的对象。正如Peter Lawrey所说,我建议您使用
BufferedReader
对象来读取文件和
PrintWriter

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

但是,请尝试此代码,它执行相同的操作,但使用
BufferedReader
PrintWriter
对象,创建一个名为
的新文件,并使用替换.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");
        }
}

您可能只需将整个文件读入一个字符串,执行string.replace并将替换的字符串写回即可。或者你们正在读一个很大的文件,并且担心内存问题?正如Peter所说,若你们想更新这个方法,只需重写文件的其余部分。但是,您可以考虑删除整个行的其他方法,然后将新的字符串附加到文件。
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");
        }
}