Закройте текстовый файл и удалите его - PullRequest
0 голосов
/ 07 июня 2019

У меня проблема с последними 2 строками кода в этой функции, поскольку файл file.txt все еще открыт и не удаляется, а tmpFile.txt не меняет имя.Копирование с file.txt на tmpFile.txt прекрасно работает.Прошу помощи

public static void transfer(Client client) throws FileNotFoundException, IOException{
        File file = new File("file.txt");
        File tmpFile = new File("tmpFile.txt");

        BufferedReader reader = new BufferedReader(new FileReader(file));
        BufferedWriter writer = new BufferedWriter(new FileWriter(tmpFile));

        try{
            String lineToRemove = client.id + ";" + client.pin + ";" + 
                    client.money + ";" + client.name + ";";
            String currentLine;

            while((currentLine = reader.readLine()) != null) {
                String trimmedLine = currentLine.trim();
                if(trimmedLine.equals(lineToRemove)) continue;
                writer.write(currentLine + "\n");
            }
        }
        finally{
            writer.close();
            reader.close();
        }

        file.delete();
        tmpFile.renameTo(file);

        /*File oldFile = new File("tmpFile.txt");
        File newFile = new File(oldFile.getParent(), "file.txt");
        Files.move(oldFile.toPath(), newFile.toPath());*/
    }

Ответы [ 2 ]

1 голос
/ 07 июня 2019

Если я запускаю ваш код без Client, он работает как положено.

Причина, по которой вы все еще видите, что ваш file.txt открыт, заключается в том, что это НЕ ваш начальный file.txt.Это переименованное tmpFile.txt, которое теперь называется file.txt.

С кодом ниже у вас есть файл, который был переименован с tmpFile.txt на file.txt, и он содержит "HALLO \ n".Исходный файл file.txt фактически удален и больше не существует.- это ожидаемое поведение.

public static void main(String[] args) throws Exception {

        File file = new File("src/file.txt");
        File tmpFile = new File("src/tmpFile.txt");

        BufferedReader reader = new BufferedReader(new FileReader(file));
        BufferedWriter writer = new BufferedWriter(new FileWriter(tmpFile));

        try{
                writer.write("HALLO" + "\n");
        }
        finally {
            writer.close();
            reader.close();
        }

        file.delete();
        tmpFile.renameTo(file);

    /*File oldFile = new File("tmpFile.txt");
    File newFile = new File(oldFile.getParent(), "file.txt");
    Files.move(oldFile.toPath(), newFile.toPath());*/
}
0 голосов
/ 07 июня 2019

Невозможно воспроизвести. Я запустил ваш код, и он заменил файл.

Но попробуйте обновить код, чтобы использовать более новые методы NIO.2:

public static void transfer(Client client) throws IOException {
    Path file = Paths.get("file.txt");
    Path tmpFile = Paths.get("tmpFile.txt");

    try (BufferedReader reader = Files.newBufferedReader(file);
         BufferedWriter writer = Files.newBufferedWriter(tmpFile)) {

        String lineToRemove = client.id + ";" + client.pin + ";" + 
                client.money + ";" + client.name + ";";
        for (String currentLine; (currentLine = reader.readLine()) != null; ) {
            if (! currentLine.trim().equals(lineToRemove))
                writer.write(currentLine + "\n");
        }
    }

    Files.move(tmpFile, file, StandardCopyOption.REPLACE_EXISTING);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...