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 из файла.
Если замена имеет разную длину:
- читать файл, пока не найдете строку, которую вы хотите заменить.
 - читать в память часть после текст, который вы хотите заменить, все это.
 - обрезать файл в начале части, которую вы хотите заменить.
 - пишите замены.
 - напишите остальную часть файла с шага 2.
 
Если замена такой же длины:
- читать файл, пока вы найдете строку, которую хотите заменить.
 - установите положение файла для запуска детали, которую вы хотите заменить.
 - написать замену, перезапись части файла.
 
Это лучшее, что вы можете получить, с ограничениями вашего вопроса. Однако, по крайней мере, рассматриваемый пример заменяет строку одинаковой длины, поэтому должен работать второй способ.
также имейте в виду: строки 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();
      }
    }