Java替换文本文件中的行

Java替换文本文件中的行,java,replace,line,jcheckbox,Java,Replace,Line,Jcheckbox,如何替换文本文件中的一行文本 我有一个字符串,例如: Do the dishes0 我想用以下内容更新它: Do the dishes1 (反之亦然) 我如何做到这一点 ActionListener al = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JCheckBox che

如何替换文本文件中的一行文本

我有一个字符串,例如:

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

}

顺便说一下,我只想替换读过的那一行。不是整个文件。

您需要使用JFileChooser获取一个文件,然后使用扫描仪和hasNext()函数读取文件的行


一旦您这样做了,您就可以将行保存到变量中并操作内容。

在底部,我有一个通用的解决方案来替换文件中的行。但首先,这里是对手头具体问题的答案。辅助功能:

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"));
        StringBuffer inputBuffer = new StringBuffer();
        String line;

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

        System.out.println(inputStr); // display the original file for debugging

        // logic to replace lines in the string (could use regex here to be generic)
        if (type.equals("0")) {
            inputStr = inputStr.replace(replaceWith + "1", replaceWith + "0"); 
        } else if (type.equals("1")) {
            inputStr = inputStr.replace(replaceWith + "0", replaceWith + "1");
        }

        // display the new file for debugging
        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
喂狗0
打扫了我的房间1
----------------------------------
洗碗1
喂狗0
打扫了我的房间1

新文本文件内容:

洗碗1
喂狗0
打扫了我的房间1


请注意,如果文本文件为:

洗碗1
喂狗0
打扫我的房间

您使用了方法
replaceSelected(“洗碗碟”,“1”),,
它不会改变文件


由于这个问题非常具体,我将在这里为将来的读者添加一个更通用的解决方案(基于标题)


如果更换件长度不同:

  • 读取文件,直到找到要替换的字符串
  • 将要替换的文本后的部分读入内存,全部读入内存
  • 在要替换的零件的开头截断文件
  • 写替换
  • 写入步骤2中文件的其余部分
  • 如果更换件长度相同:

  • 读取文件,直到找到要替换的字符串
  • 将文件位置设置为要替换的零件的起点
  • 写替换,覆盖文件的一部分
  • 这是你能得到的最好的答案,因为你的问题是有限制的。然而,至少有一个例子是替换相同长度的字符串,所以第二种方法应该是可行的


    还要注意:Java字符串是Unicode文本,而文本文件是带有一些编码的字节。如果编码是UTF8,而文本不是拉丁1(或纯7位ASCII),则必须检查编码字节数组的长度,而不是Java字符串的长度。

    因为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 fileContent=new ArrayList(Files.readAllLines(FILE_PATH,StandardCharsets.UTF_8));
    对于(int i=0;i
    基本上,您将整个文件读入一个
    列表
    ,编辑列表,最后将列表写回文件


    文件路径
    表示文件的
    路径。

    我正要回答这个问题。然后我看到它被标记为这个问题的一个副本,在我编写代码之后,所以我将在这里发布我的解决方案

    请记住,您必须重新编写文本文件。首先,我读取整个文件,并将其存储在字符串中。然后我将每一行存储为字符串数组的索引,例如第1行=数组索引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;
    }
    
    }
    
    导入java.io.BufferedWriter;
    导入java.io.File;
    导入java.io.FileNotFoundException;
    导入java.io.FileOutputStream;
    导入java.io.FileReader;
    导入java.io.IOException;
    导入java.io.OutputStreamWriter;
    导入java.io.UnsupportedEncodingException;
    导入java.io.Writer;
    公共类changelineinfle{
    public void changeALineInATextFile(字符串文件名、字符串换行符、整数行号){
    字符串内容=新字符串();
    String editedContent=新字符串();
    内容=读取文件(文件名);
    editedContent=editLineInContent(内容、换行、行号);
    writeToFile(文件名、编辑内容);
    }
    私有静态int numberOfLinesInFile(字符串内容){
    int numberOfLines=0;
    int指数=0;
    int lastIndex=0;
    lastIndex=content.length()-1;
    while(true){
    if(content.charAt(index)='\n'){
    numberOfLines++;
    }
    如果(索引==lastIndex){
    numberOfLines=numberOfLines+1;
    打破
    }
    索引++;
    }
    返回行数;
    }
    私有静态字符串[]TurnFileInToArrayOfString(字符串内容,int行){
    字符串[]数组=新字符串[行];
    int指数=0;
    int-tempInt=0;
    int startIndext=0;
    int lastIndex=content.length()-1;
    while(true){
    if(content.charAt(index)='\n'){
    tempInt++;
    String temp2=新字符串();
    对于(int i=0;iimport 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;
    }
    
    }
    
    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();
          }
        }
    
    import java.nio.charset.StandardCharsets;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import java.util.List;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;    
    
    public static void replaceLine(String filePath, String originalLineText, String newLineText) {
                Path path = Paths.get(filePath);
                // Get all the lines
                try (Stream<String> stream = Files.lines(path, StandardCharsets.UTF_8)) {
                    // Do the line replace
                    List<String> list = stream.map(line -> line.equals(originalLineText) ? newLineText : originalLineText)
                            .collect(Collectors.toList());
                    // Write the content back
                    Files.write(path, list, StandardCharsets.UTF_8);
                } catch (IOException e) {
                    LOG.error("IOException for : " + path, e);
                    e.printStackTrace();
                }
            }
    
    replaceLine("test.txt", "Do the dishes0", "Do the dishes1");
    
            //Read the file data
            BufferedReader file = new BufferedReader(new FileReader(filepath));
            StringBuffer inputBuffer = new StringBuffer();
            String line;
    
            while ((line = file.readLine()) != null) {
                inputBuffer.append(line);
                inputBuffer.append('\n');
            }
            file.close();
            String inputStr = inputBuffer.toString();
    
    
            // logic to replace lines in the string (could use regex here to be generic)
    
                inputStr = inputStr.replace(str, " ");
            //'str' is the string need to update in this case it is updating with nothing
    
            // write the new string with the replaced line OVER the same file
            FileOutputStream fileOut = new FileOutputStream(filer);
            fileOut.write(inputStr.getBytes());
            fileOut.close();