Java - Удалить файл после чтения из него - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь понять, почему мой inputFile.delete () не удаляет файл. После просмотра множества тем выяснилось, что что-то все еще использует файл и, следовательно, не удаляется. Но я не могу этого понять. Что мне не хватает ??

File inputFile = new File("data/Accounts.txt");
File tempFile = new File("data/tmp.txt");

try {
    tempFile.createNewFile();
    BufferedReader reader = new BufferedReader(new FileReader(inputFile));
    BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
    String line;

    int i = 0;
    for (User u : data) {
        String toRemove = getIDByUsername(username);
        while ((line = reader.readLine()) != null) {
            if (line.contains(toRemove + " ")) {
                line = (i + " " + username + " " + getStatusByUsername(username) + " " + password);
            }
            writer.write(line + "\n");
            i++;
        }
    }
    reader.close();
    writer.close();
} catch (FileNotFoundException e) {
    ex.FileNotFound();
} catch (IOException ee) {
    ex.IOException();
} finally {
    inputFile.delete();
    tempFile.renameTo(inputFile);
}

Ответы [ 2 ]

3 голосов
/ 26 мая 2020

Вы можете сделать это намного короче и проще, используя java.nio:

public static void main(String[] args) {
    // provide the path to your file, (might have to be an absolute path!)
    Path filePath = Paths.get("data/Accounts.txt");

    // lines go here, initialize it as empty list
    List<String> lines = new ArrayList<>();

    try {
        // read all lines (alternatively, you can stream them by Files.lines(...)
        lines = Files.readAllLines(filePath);
        // do your logic here, this is just a very simple output of the content
        System.out.println(String.join(" ", lines));
        // delete the file
        Files.delete(filePath);
    } catch (FileNotFoundException fnfe) {
        // handle the situation of a non existing file (wrong path or similar)
        System.err.println("The file at " + filePath.toAbsolutePath().toString()
                + " could not be found." + System.lineSeparator()
                + fnfe.toString());
    } catch (FileSystemException fse) {
        // handle the situation of an inaccessible file
        System.err.println("The file at " + filePath.toAbsolutePath().toString()
                + " could not be accessed:" + System.lineSeparator()
                + fse.toString());
    } catch (IOException ioe) {
        // catch unexpected IOExceptions that might be thrown
        System.err.println("An unexpected IOException was thrown:" + System.lineSeparator()
                + ioe.toString());
    }
}

Это распечатывает содержимое файла и затем удаляет его.
Вместо этого вы захотите сделать что-то другое. просто распечатывает контент, но это тоже будет возможно ;-) Попробуйте ...

0 голосов
/ 26 мая 2020

Я пытаюсь понять, почему мой inputFile.delete () не удаляет файл.

Это потому, что старый файловый API дрянный именно в этом смысле: у него нет способность сказать вам, почему что-то не получается. Все, что он может сделать, это вернуть false, что он и сделает.

См. Другой ответ от @deHaar, в котором показано, как это сделать с новым API. Помимо более чистого кода и более нового API, предоставляющего вам больше возможностей, новый API также решает эту проблему, когда различные методы, такие как File.delete(), не могут сказать вам причину, по которой он не может делать то, что вы просите.

Есть много-много проблем с вашим кодом, поэтому я настоятельно рекомендую go попробовать deHaar. А именно:

  1. Вы неправильно закрываете свои ресурсы; если произойдет исключение, ваши обработчики файлов останутся открытыми.
  2. И чтение, и запись здесь выполняются с «кодировкой по умолчанию для платформы», какой бы она ни была. По сути, никогда не используйте конструкторы FileReader и FileWriter. К счастью, новый API по умолчанию использует UTF_8, если вы не можете указать кодировку, что более разумно.
  3. ваша обработка исключений не очень хороша (вы отбрасываете все полезные сообщения, что бы ни могло делать здесь) - и вы все равно пытаетесь удалить и заменить, даже если возникают исключения, которые затем терпят неудачу, поскольку ваши дескрипторы файлов все еще открыты.
  4. Метод должен называться getIdByUsername
  5. Ваша строка toRemove каждый раз одна и та же, или, по крайней мере, переменная username, похоже, не обновляется, когда вы l oop через. Если он действительно никогда не обновляется, переместите эту строку из вашего l oop.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...