Файл Java file.createNewFile не создан и исключений нет - PullRequest
5 голосов
/ 01 апреля 2012

Следующий код не всегда создает файл. Насколько я заметил, при первом запуске этого кода, хотя исключение не генерируется и созданный FileSucceeded == true, файл не создается.

Я запускаю код в Windows, Java 6.

Любой вклад может быть полезным

File file = new File(tmpDir, fileName);

try {
if (tmpDir == null) {
  String environmentHomePath // = somePath;
  tmpDir = new File(environmentHomePath, "SampleDumps");

  if (! tmpDir.exists() || ! tmpDir.isDirectory()) {
    boolean mkdirSucceeded = tmpDir.mkdir();
    if (! mkdirSucceeded) {
      throw new IOException("Failed creating directory: '" + tmpDir.getAbsolutePath() + "'");
    }
  }
}

if (file.exists()) {
  boolean deleteFileSucceeded = file.delete(); 
  if (! deleteFileSucceeded) {
    throw new IOException("Unable to delete pre existing sample file: '" + fileName + "'");
  }
}

boolean createFileSucceeded = file.createNewFile();
if (! createFileSucceeded) {
  throw new IOException("Unable to create sample file: '" + fileName + "'");
}

fw = new FileWriter(file);
bw = new BufferedWriter(fw);

StringBuilder sb = new StringBuilder("something...");

bw.write(sb.toString());
bw.flush();
}
catch (IOException ioe) {
log.warn("Unable to file invalid sample to file: '" + fileName + "'", ioe);
}
finally {
if (bw != null) {
  try {
    bw.close();
  } catch (IOException e) {
    log.warn("Unable to close Writer to file: '" + fileName + "'", e);
  }
}
else if (fw != null) {
  try {
    fw.close();
  } catch (IOException e) {
    log.warn("Unable to close Writer to file: '" + fileName + "'", e);
  }
}
}

Ответы [ 4 ]

6 голосов
/ 01 апреля 2012

Если file.createNewFile() возвращает true, то файл был создан.

Наиболее вероятное объяснение того, что файл создается, но не там, где вы ожидаете.Я ожидаю, что вы используете относительный путь к файлу ...


Если присмотреться к вашему коду и вашим комментариям, я думаю, что это именно то, что происходит.Посмотрите, как вы создаете временный каталог.Сначала вы создаете файл, используя tmpdir в качестве родительского каталога.Затем вы проверяете, есть ли tmpdir, является ли null, и создаете каталог.Но затем вы продолжаете использовать объект File, который все еще имеет родительский каталог null !!

Вам нужно создать File объект ПОСЛЕ проверки tmpdir и создания его при необходимости.

2 голосов
/ 01 апреля 2012

После некоторого теста я нашел ошибку и исправил ее:

try {
    //create tmpDir if its null
    if (tmpDir == null) {
        String environmentHomePath = "D:/"; //change to somepath
        //tmpDir must be a directory path
        tmpDir = new File(environmentHomePath);

        if (!tmpDir.exists() || !tmpDir.isDirectory()) {
            boolean mkdirSucceeded = tmpDir.mkdir();
            if (!mkdirSucceeded) {
                throw new IOException("Failed creating directory: '" + tmpDir.getAbsolutePath() + "'");
            }
        }
    }
    //create the path
    File file = new File(tmpDir, fileName);
    if (file.exists()) {
        boolean deleteFileSucceeded = file.delete();
        if (!deleteFileSucceeded) {
            throw new IOException("Unable to delete pre existing sample file: '" + fileName + "'");
        }
    }
    boolean createFileSucceeded = file.createNewFile();
    if (!createFileSucceeded) {
        throw new IOException("Unable to create sample file: '" + fileName + "'");
    }

    fw = new FileWriter(file);
    bw = new BufferedWriter(fw);

    StringBuilder sb = new StringBuilder("something...");
    bw.write(sb.toString());
    bw.flush();
} catch (IOException ioe) {
    log.warn("Unable to file invalid sample to file: '" + fileName + "'", ioe);
} finally {
    try {
    if (bw != null) {
        try {
            bw.close();
        } catch (IOException e) {
            log.warn("Unable to close Writer to file: '" + fileName + "'", e);
        }
    }
    else if (fw != null) {
        try {
            fw.close();
        } catch (IOException e) {
            log.warn("Unable to close Writer to file: '" + fileName + "'", e);
    }
}
2 голосов
/ 01 апреля 2012

Ваш подход к tmpDir несовершенен.Файл создается где-то .

Из Javadocs для File(String, String):

Если parent равен null, то новый экземпляр File создается, как если бывызов конструктора файла с одним аргументом для заданной дочерней строки пути.

0 голосов
/ 17 февраля 2017

Проверьте имя вашего файла. Он не должен содержать двоеточие : или любой другой подобный символ, который вызывает исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...