Java Заменить строку в текстовом файле

19

Как заменить строку текста, найденную в текстовом файле?

У меня есть строка, например:

Do the dishes0

И я хочу обновить его:

Do the dishes1

(и наоборот)

Как это сделать?

ActionListener al = new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    JCheckBox checkbox = (JCheckBox) e.getSource();
                    if (checkbox.isSelected()) {
                        System.out.println("Selected");
                        String s = checkbox.getText();
                        replaceSelected(s, "1");
                    } else {
                        System.out.println("Deselected");
                        String s = checkbox.getText();
                        replaceSelected(s, "0");
                    }
                }
            };

public static void replaceSelected(String replaceWith, String type) {

}

Кстати, я хочу заменить ТОЛЬКО прочитанную строку. НЕ весь файл.

    
задан Eveno 18.11.2013 в 05:15
источник
  • Прочтите файл ENTIRE. Измените линию. Напишите файл ENTIRE. –  nhgrif 18.11.2013 в 05:22
  • Я пытался это сделать, используя RandomAccessFile и BufferedReader и BufferedWriters. Мне действительно нужен код, предназначенный для моей конкретной цели. Кажется, я каждый раз что-то делаю неправильно. –  Eveno 18.11.2013 в 05:23
  • Затем я предлагаю опубликовать код, в котором вы делаете это, и пусть SO поможет вам понять, что вы делаете неправильно. –  nhgrif 18.11.2013 в 05:24
  • Уже давно нет. Как я уже сказал, я пробовал много разных методов. Хранение его во временном массиве .. создание нового файла. Ничего из этого не получилось. –  Eveno 18.11.2013 в 05:25
  • Ну, вам нужно вернуться к реализации этих методов, и когда вы застрянете, вернитесь сюда и опубликуйте это. –  nhgrif 18.11.2013 в 05:26
Показать остальные комментарии

6 ответов

25

Протестировано и работает

public static void replaceSelected(String replaceWith, String type) {
    try {
        // input the file content to the StringBuffer "input"
        BufferedReader file = new BufferedReader(new FileReader("notes.txt"));
        String line;
        StringBuffer inputBuffer = new StringBuffer();

        while ((line = file.readLine()) != null) {
            inputBuffer.append(line);
            inputBuffer.append('\n');
        }
        String inputStr = inputBuffer.toString();

        file.close();

        System.out.println(inputStr); // check that it's inputted right

        // this if structure determines whether or not to replace "0" or "1"
        if (Integer.parseInt(type) == 0) {
            inputStr = inputStr.replace(replaceWith + "1", replaceWith + "0"); 
        }
        else if (Integer.parseInt(type) == 1) {
            inputStr = inputStr.replace(replaceWith + "0", replaceWith + "1");
        } 

        // check if the new input is right
        System.out.println("----------------------------------\n"  + inputStr);

        // write the new String with the replaced line OVER the same file
        FileOutputStream fileOut = new FileOutputStream("notes.txt");
        fileOut.write(inputStr.getBytes());
        fileOut.close();

    } catch (Exception e) {
        System.out.println("Problem reading file.");
    }
}

public static void main(String[] args) {
    replaceSelected("Do the dishes", "1");   
}

Содержимое исходного текстового файла:

  

Сделайте блюда0   
  Подайте собаке0
  Убрал мою комнату1

Вывод:

  

Сделайте блюда0
  Подайте собаке0
  Убрал мою комнату1
  ----------------------------------
  Сделать блюда1
  Подайте собаке0
  Убрал мою комнату1

Содержимое нового текстового файла:

  

Сделайте блюда 1
  Подайте собаке0
  Убрал мою комнату1

И как примечание, если текстовый файл был:

  

Сделайте блюда 1
  Подайте собаке0
  Убрал мою комнату1

, и вы использовали метод replaceSelected("Do the dishes", "1"); , он просто не изменит файл.

    
ответ дан Michael Yaworski 18.11.2013 в 05:47
источник
  • Вам нужно убедиться, что вы закрываете свои потоки, когда закончите с ними. –  Sammy Guergachi 18.08.2014 в 18:34
  • @SammyGuergachi Ты прав. Я всегда ленив и не делаю этого. Если вы предложите редактировать, я его одобрю. –  Michael Yaworski 18.08.2014 в 20:12
  • Вы также должны использовать StringBuilder вместо «while (...) input + = line + '\ n'" для лучших практик stackoverflow.com/questions/1532461/... –  user2602807 15.05.2015 в 12:35
  • Рассмотрите возможность замены «String input» на «StringBuilder input» и используйте его как input.append (строка + «\ n);». Строка - неизменяемый объект, а StringBuilder - нет. Поэтому каждый раз, когда вы изменяете String, вы создаете новый объект. Когда вы закончите с вашими данными, получите строку с «input.toString ()». –  Redauser 31.03.2017 в 12:49
20

Так как Java 7 это очень просто и интуитивно понятно.

List<String> fileContent = new ArrayList<>(Files.readAllLines(FILE_PATH, StandardCharsets.UTF_8));

for (int i = 0; i < fileContent.size(); i++) {
    if (fileContent.get(i).equals("old line")) {
        fileContent.set(i, "new line");
        break;
    }
}

Files.write(FILE_PATH, fileContent, StandardCharsets.UTF_8);

В основном вы читаете весь файл в List , редактируете список и, наконец, записываете список обратно в файл.

FILE_PATH представляет Path файла.

    
ответ дан Tuupertunut 04.06.2016 в 00:02
источник
  • Предложение: Также объясните, как важно писать в временном файле, а затем переместить этот файл на место поверх первого файла, чтобы сделать изменение атомом. (И добро пожаловать в StackOverflow!) –  rrauenza 04.06.2016 в 00:27
  • @rrauenza Это не обязательно и в основном будет излишним. Это, как говорится, конечно, будет непросто реализовать в нескольких строках. Если вы хотите продемонстрировать это, почему бы не сделать свой собственный ответ (или предложить отредактировать)? –  Tuupertunut 04.06.2016 в 20:26
  • Я не знаю Java достаточно хорошо, и вы должны получить кредит на ответ. (Как рецензент, меня просят внести предложения по улучшению «первых сообщений».) –  rrauenza 04.06.2016 в 20:29
  • Мне нужно сослаться на java2s.com/Tutorials/Java/java.nio.file/Files/..., так как ответ выше не был завершен –  vikramvi 05.02.2017 в 12:25
  • Над ответом возникла ошибка: метод write (Path, byte [], OpenOption ...) в типе Files не применим для аргументов (Path, byte [], Charset) –  Max Alexander Hanna 14.08.2017 в 16:08
1

Если замена имеет разную длину:

  1. Прочитайте файл, пока не найдете строку, которую хотите заменить.
  2. Прочитайте в памяти фрагмент после , который вы хотите заменить, и все это.
  3. Усечь файл в начале части, которую вы хотите заменить.
  4. Запишите замену.
  5. Запишите оставшуюся часть файла с шага 2.

Если замена имеет одинаковую длину:

  1. Прочитайте файл, пока не найдете строку, которую хотите заменить.
  2. Задайте позицию файла для начала части, которую вы хотите заменить.
  3. Запишите замену, переписав часть файла.

Это лучшее, что вы можете получить, с ограничениями на свой вопрос. Однако, по крайней мере, рассматриваемый пример заменяет строку той же длины, поэтому второй способ должен работать.

Также имейте в виду: строки Java - это текст Unicode, а текстовые файлы - это байты с некоторой кодировкой. Если кодировка UTF8 и ваш текст не является латинским (или простой 7-разрядный ASCII), вы должны проверить длину закодированного байтового массива, а не длину строки Java.

    
ответ дан hyde 18.11.2013 в 05:48
источник
0

Ну, вам нужно будет получить файл с JFileChooser, а затем прочитать строки файла с помощью сканера и функции hasNext ()

Ссылка

, как только вы сделаете это, вы можете сохранить строку в переменной и манипулировать содержимым.

    
ответ дан Corjava 18.11.2013 в 05:23
источник
  • Я рассмотрю это. Благодарю. Не могли бы вы опубликовать быстрый пример того, что он хотел бы, хотя все вместе, чтобы у меня появилась идея? –  Eveno 18.11.2013 в 05:29
  • Вы можете найти все, что вам нужно в учебнике по Java. –  MarsAtomic 18.11.2013 в 05:44
0

Я собирался ответить на этот вопрос. Затем я увидел, что он стал отмеченным как дубликат этого вопроса, после того как я написал код, поэтому я отправлю свое решение здесь.

Помните, что вам нужно перезаписать текстовый файл. Сначала я прочитал весь файл и сохранил его в строке. Затем я сохраняю каждую строку как индекс строкового массива, ex line one = массив index 0. Затем я редактирую индекс, соответствующий строке, которую вы хотите отредактировать. Как только это будет сделано, я объединю все строки в массиве в одну строку. Затем я пишу новую строку в файл, который пишет поверх старого содержимого. Не беспокойтесь о потере старого контента, поскольку он был снова написан с помощью редактирования. ниже - код, который я использовал.

public class App {

public static void main(String[] args) {

    String file = "file.txt";
    String newLineContent = "Hello my name is bob";
    int lineToBeEdited = 3;

    ChangeLineInFile changeFile = new ChangeLineInFile();
    changeFile.changeALineInATextFile(file, newLineContent, lineToBeEdited);



}

}

И класс.

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;

public class ChangeLineInFile {

public void changeALineInATextFile(String fileName, String newLine, int lineNumber) {
        String content = new String();
        String editedContent = new String();
        content = readFile(fileName);
        editedContent = editLineInContent(content, newLine, lineNumber);
        writeToFile(fileName, editedContent);

    }

private static int numberOfLinesInFile(String content) {
    int numberOfLines = 0;
    int index = 0;
    int lastIndex = 0;

    lastIndex = content.length() - 1;

    while (true) {

        if (content.charAt(index) == '\n') {
            numberOfLines++;

        }

        if (index == lastIndex) {
            numberOfLines = numberOfLines + 1;
            break;
        }
        index++;

    }

    return numberOfLines;
}

private static String[] turnFileIntoArrayOfStrings(String content, int lines) {
    String[] array = new String[lines];
    int index = 0;
    int tempInt = 0;
    int startIndext = 0;
    int lastIndex = content.length() - 1;

    while (true) {

        if (content.charAt(index) == '\n') {
            tempInt++;

            String temp2 = new String();
            for (int i = 0; i < index - startIndext; i++) {
                temp2 += content.charAt(startIndext + i);
            }
            startIndext = index;
            array[tempInt - 1] = temp2;

        }

        if (index == lastIndex) {

            tempInt++;

            String temp2 = new String();
            for (int i = 0; i < index - startIndext + 1; i++) {
                temp2 += content.charAt(startIndext + i);
            }
            array[tempInt - 1] = temp2;

            break;
        }
        index++;

    }

    return array;
}

private static String editLineInContent(String content, String newLine, int line) {

    int lineNumber = 0;
    lineNumber = numberOfLinesInFile(content);

    String[] lines = new String[lineNumber];
    lines = turnFileIntoArrayOfStrings(content, lineNumber);

    if (line != 1) {
        lines[line - 1] = "\n" + newLine;
    } else {
        lines[line - 1] = newLine;
    }
    content = new String();

    for (int i = 0; i < lineNumber; i++) {
        content += lines[i];
    }

    return content;
}

private static void writeToFile(String file, String content) {

    try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "utf-8"))) {
        writer.write(content);
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

private static String readFile(String filename) {
    String content = null;
    File file = new File(filename);
    FileReader reader = null;
    try {
        reader = new FileReader(file);
        char[] chars = new char[(int) file.length()];
        reader.read(chars);
        content = new String(chars);
        reader.close();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    return content;
}

}
    
ответ дан holycatcrusher 16.09.2016 в 00:38
источник
0

просто как заменить строки :), как я делаю first arg будет filename второй целевой строкой, третьей - заменяемой строкой вместо targe

public class ReplaceString{
      public static void main(String[] args)throws Exception {
        if(args.length<3)System.exit(0);
        String targetStr = args[1];
        String altStr = args[2];
        java.io.File file = new java.io.File(args[0]);
        java.util.Scanner scanner = new java.util.Scanner(file);
        StringBuilder buffer = new StringBuilder();
        while(scanner.hasNext()){
          buffer.append(scanner.nextLine().replaceAll(targetStr, altStr));
          if(scanner.hasNext())buffer.append("\n");
        }
        scanner.close();
        java.io.PrintWriter printer = new java.io.PrintWriter(file);
        printer.print(buffer);
        printer.close();
      }
    }
    
ответ дан amar 25.10.2017 в 17:32
источник
  • Должно быть больше объяснений для вашего кода. –  Whitecat 25.10.2017 в 17:35