如何在Java上更新txt文件

时间:2018-11-12 08:12:25

标签: java javafx file-io text-files

我有一个文本文件,我想每次仅更新最后3个标签

更改将通过ID(1,2等)进行

p.g。(对于ID = 1 更改:10,18 / 10 / 18,7到12,21 / 10 / 18,2)

User.txt:

1,alex,pass,Admin,Alexandros,Karatzas,Male,18/10/1990,A'Likeiou,Antreas,Karatzas,6945952301,10,18/10/18,7
2,maria,pass1,User,Maria,Karatza,Female,18/10/1990,B'Likeiou,Antreas,Karatzas,6945952381,20,18/10/18,5

所以运行后,我想把它作为输出:

1,alex,pass,Admin,Alexandros,Karatzas,Male,18/10/1990,A'Likeiou,Antreas,Karatzas,6945952301,12,21/10/18,2
2,maria,pass1,User,Maria,Karatza,Female,18/10/1990,B'Likeiou,Antreas,Karatzas,6945952381,20,18/10/18,5

代码搜索ID,读写数据,但是我如何每次都能替换最后3个标签?

源代码:

    @FXML 
         TextField ID3,abs,Dabs,Fabs
    @FXML
    public void UseAddAbs() throws IOException {                //Kanei Add tis Apousies sinfona me to ID
        String searchText = ID3.getText();
        Path p = Paths.get("src", "inware", "users.txt");
        Path tempFile = Files.createTempFile(p.getParent(), "usersTemp", ".txt");
        try (BufferedReader reader = Files.newBufferedReader(p);
                BufferedWriter writer = Files.newBufferedWriter(tempFile)) {
            String line;

            // copy everything until the id is found
            while ((line = reader.readLine()) != null) {
                writer.write(line);
                if (line.contains(searchText)) {
                    writer.write("," + Fabs.getText());
                    writer.write("," + Dabs.getText());
                    writer.write("," + abs.getText());
                    break;
                }
                writer.newLine();
            }

            // copy remaining lines
            if (line != null) {
                writer.newLine();
                while ((line = reader.readLine()) != null) {
                    writer.write(line);
                    writer.newLine();
                }
            }
        }

        // copy new file & delete temporary file
        Files.copy(tempFile, p, StandardCopyOption.REPLACE_EXISTING);
        Files.delete(tempFile);
    }

2 个答案:

答案 0 :(得分:1)

分割线并处理字段:

        while ((line = reader.readLine()) != null) {
            String[] fields = line.split("[,]");
            if (fields[0].equals(searchID)) {
                fields[12] = "12";
                fields[13] = "21/10/18";
                fields[14] = "2";
            }
            writer.println(String.join(",", fields));
        }

更新:我的代码:

public static void main(String[] args) {
    try {
        String searchText = "1";
        Path p = Paths.get(".", "users.txt");
        Path tempFile = Files.createTempFile(p.getParent(), "usersTemp", ".txt");
        try (BufferedReader reader = Files.newBufferedReader(p);
                BufferedWriter writer = Files.newBufferedWriter(tempFile)) {
            String line;

            // copy everything until the id is found
            while ((line = reader.readLine()) != null) {
                String[] fields = line.split("[,]");
                if (searchText.equals(fields[0])) {
                    for (int i = 0; i < fields.length; ++i) {
                        System.out.println(i + ": " + fields[i]);
                    }
                    fields[12] = "12";
                    fields[13] = "21/10/18";
                    fields[14] = "2";
                }
                writer.write(String.join(",", fields));
                writer.newLine();
            }
        }

        // copy new file & delete temporary file
        Files.copy(tempFile, p, StandardCopyOption.REPLACE_EXISTING);
        Files.delete(tempFile);
    } catch (IOException ex) {
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    }
}

答案 1 :(得分:0)

您可以将行拆分为数组,并更新最后3个数组元素。 然后,您所要做的就是从该数组中构建新行,然后编写此行而不是旧行。

示例:。

while ((line = reader.readLine()) != null) {
    if (line.contains(searchText)) {
        String updatedLine = updateLastNStrings(line, 3);
        writer.write(updatedLine);
        break;
    } else {
        writer.write(line);
    }
    writer.newLine();
}

private String updateLastNStrings(String line, int n) {
    String [] parts = line.split(",");
    for (int i = parts.length - n; i < parts.length; i++) {
        // update String
        String newPart = parts[i] + "_UPDATED";
        parts[i] = newPart;
    }
    return String.join(",", parts);
}

输入:

1,alex,pass,Admin,Alexandros,Karatzas,Male,18/10/1990,A'Likeiou,Antreas,Karatzas,6945952301,10,18/10/18,7
2,maria,pass1,User,Maria,Karatza,Female,18/10/1990,B'Likeiou,Antreas,Karatzas,6945952381,20,18/10/18,5

结果

1,alex,pass,Admin,Alexandros,Karatzas,Male,18/10/1990,A'Likeiou,Antreas,Karatzas,6945952301,12_UPDATED,21/10/18_UPDATED,2_UPDATED
2,maria,pass1,User,Maria,Karatza,Female,18/10/1990,B'Likeiou,Antreas,Karatzas,6945952381,20,18/10/18,5

请注意用_UPDATED

更新了字符串

注意

除此之外,您发现的代码还有缺陷,因为要查找ID,它正在搜索行是否包含charSequence。如果ID是行的内容怎么办?

示例:

1,some_content,2,3
2,some_content,1

您尝试查找ID为2的行,第一行将被更新,而不是第二行。