Отражение в файле замены конкретной строки - PullRequest
1 голос
/ 14 ноября 2011

У меня есть текстовый файл:

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

Теперь я хочу заменить "khan" на "viswajit". Я написал код для него.Мой ожидаемый результат:

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

Мой код фактически заменяет "khan" на "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 ]

1 голос
/ 14 ноября 2011

Я не понимаю, почему вы используете объект RandomAccessFile, когда используете текстовый файл.Как говорит Питер Лоури, я бы предложил вам использовать объект 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);
                }
            }

Однако попробуйте этот код, он делает то же самое, но с объектами BufferedReader и PrintWriter, создавая новый файл с именем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");
        }
}
1 голос
/ 14 ноября 2011

Вы не вставляете дополнительный текст, вы перезаписываете.

Если вы хотите вставить текст, нет короткого пути для перезаписи остальной части файла.

Как таковое, возможно, не стоит использовать RandomAccessFile, поскольку это, вероятно, будет более сложным, чем полезным. Я бы просто использовал BufferedReader и PrintWriter для копирования файла.

0 голосов
/ 14 ноября 2011

Что я могу понять, так это то, что при обратной записи вы перезаписываете байты.

check khan - это 4-буквенное слово, а viswajit - 7 букв.В то время как вы заменяете последовательные 3 байта также заменяются.то есть вы потеряете 'my' и символ новой строки.

Учитывайте это и управляйте своими действиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...