Java RandomAccessFile - PullRequest
       15

Java RandomAccessFile

2 голосов
/ 21 февраля 2009
    public void exportUrlsToFile(String file, String urls) throws IOException {
    String[] urlsArray = urls.split("\\s+");// split on one or more white space characters.

    // create a fresh file
    RandomAccessFile raf = new RandomAccessFile(file, "rw");

    for (String line : urlsArray) {
        line = line.trim();
        if (line.isEmpty()) {// this won't happen!
            continue;
        }
        raf.writeBytes(line);
        raf.writeBytes(newline);
    }
    // close the file handler
    raf.close();
}

В основном я использую этот класс, чтобы что-то делать. Это часть приложения, которое работает внутри JVM tomcat. Я заметил, что каждый раз, когда вызывается этот метод, он создает файл с тем же именем, что и аргумент, и после raf.close () он все еще там. Как я могу убедиться, что временный файл удален.

Заранее спасибо.

Ответы [ 4 ]

5 голосов
/ 21 февраля 2009

Лучший вопрос - почему вы захотите пройти через все трудности создания файла, записи чего-либо в файл, а затем просто удалить файл?!

Независимо от того, вам не нужен файл с произвольным доступом - FileWriter был бы лучше.

Чтобы убедиться, что файл удален, сделайте так, как предлагает Эдди, и поместите удаление в блок finnaly - но вам также необходимо убедиться, что обработана IOException raf.close () ... что-то вроде:

} finally {
    try
    {
        raf.close();
    }
    catch(final IOException ex)
    {
         // in 14 years of Java programming I still don't know what to do here! ;-)
    }
    finally
    {
        File todelete = new File(file);
        if (!todelete.delete()) {
            // Log a complaint that we couldn't delete the temp file
        }
    }
}

Edit:

Вы также можете иметь в виду, что после завершения процесса Tomcat файл все еще там, и вы хотите, чтобы он исчез. Если это так, посмотрите на java.io.File.deleteOnExit (). Это должно удалить файлы, когда JVM Tomcat существует.

2 голосов
/ 21 февраля 2009

Я собираюсь предположить, что вы показываете только небольшую часть кода и есть веская причина, по которой вы используете RandomAccessFile, когда не видно, что какой-либо произвольный доступ выполняется.

Я бы сделал что-то вроде этого:

public void exportUrlsToFile(String file, String urls) throws IOException {
  String[] urlsArray = urls.split("\\s+");

  // create a fresh file
  RandomAccessFile raf = new RandomAccessFile(file, "rw");

  try {
    for (String line : urlsArray) {
      line = line.trim();
      if (line.isEmpty()) { // this won't happen!
        continue;
      }
      raf.writeBytes(line);
      raf.writeBytes(newline);
    }
  } finally {
    // don't leak file handles on Exception -- put close in "try/finally"
    try { raf.close(); } catch (IOException e) { /* ignore */ }
    File todelete = new File(file);
    if (!todelete.delete()) {
      // Log a complaint that we couldn't delete the temp file
    }
  }
}

РЕДАКТИРОВАТЬ: я согласен, мы не хотим, чтобы теоретическое IOException при close () вызывало проблему. Лучше, чем игнорировать это, было бы записать «Мы никогда не ожидали увидеть это…» за исключением. Я часто создаю метод closeWithoutException (), чтобы обернуть это. Закрытие, теоретически создание IOException, кажется злоупотреблением проверенными исключениями, потому что вы ничего не можете ожидать от вызывающей стороны в ответ.

1 голос
/ 21 февраля 2009

Использовать File.createTempFile () вместо?

Я понимаю, что это не даст вам те же функции, что и RandomAccessFile, но вы можете построить то, что вам нужно, поверх этого.

На самом деле я даже не уверен, почему вы пишете эти вещи в файл. Это что-то вроде отслеживания использования? Почему бы просто не сохранить его в памяти?

0 голосов
/ 20 июля 2011

Вы пробовали это?

 File temp = File.createTempFile("file", ".tmp");
 temp.deleteOnExit( );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...