Java Заменяет Строку В Текстовом Файле

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

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

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) {

}

кстати, я хочу заменить только строку, которая была прочитана. Не весь файл.

6 ответов


и

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");   
}

Содержание Исходного Текстового Файла:

сделайте dishes0
Кормить dog0
Чистить мой room1

выход:

сделайте dishes0
Кормить dog0
Чистить мой room1
----------------------------------
Сделайте dishes1
Кормить dog0
Почистила room1

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

сделать dishes1
Кормить dog0
Чистить мой room1


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

сделать dishes1
Кормить dog0
Чистить мой room1

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


так как 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 из файла.


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

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

Если замена такой же длины:

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

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

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


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

имея в виду, что вам нужно переписать текстовый файл. Сначала я прочитал весь файл и сохранил его в виде строки. Затем я сохраняю каждую строку как индекс строкового массива, ex line one = array 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;
}

}

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

http://docs.oracle.com/javase/7/docs/api/javax/swing/JFileChooser.html

после этого вы можете сохранить строку в переменную и изменять содержимое.


просто как заменить строки :) как я делаю первый arg будет именем файла вторая целевая строка третья строка, которая будет заменена вместо 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();
      }
    }