FileOutputStream создает исключение FileNotFoundException - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь создать новый файл вместе с каталогом, но когда я вызываю "fos = new FileOutputStream (file);" всегда выдает ошибку "файл не найден". Вот код

FileOutputStream fos = null;
String getName = "User";
String filePath="D:/New file";
File file;
Date date = new Date();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
String headerDate = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(date);

try {
  WritableWorkbook w = Workbook.createWorkbook(outputStream);
  WritableSheet s = w.createSheet("Report generate", 0);
  s.addCell(new Label(0, 0, "New File" + getName));
  s.addCell(new Label(0, 2, "Response Date: " + headerDate));
  w.write();
  w.close();

  String resultFileName = "NewFileToGenerate" +getName+headerDate+ ".xls";
  String fileName = filePath.concat(resultFileName);
  file = new File(fileName);
  file.mkdirs();
  file.createNewFile();
  fos = new FileOutputStream(file);

  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  baos = outputStream;
  // Put data in your baos
  baos.writeTo(fos);

} catch (Exception e) {

} finally {
  outputStream.close();
  fos.close();
}

Здесь у меня есть filepath, но внутри этого filePath мне нужно создать другую папку, добавив в нее дату, а затем я должен сохранить файл.

Вот это стекTrace

D: / Новый файл / NewFileToGenerateUser26 / 2018 20: 00: 14.xls (это каталог)

Ответы [ 4 ]

0 голосов
/ 26 октября 2018

Как сказал BrokenEarth, вы создали каталог с именем файла, который вы хотели создать. Таким образом, вы должны действовать в два этапа:

  1. создать каталог назначения
  2. создать файл внутри каталога

Чтобы сделать такую ​​вещь, вы можете сделать что-то вроде:

String filePath = "D:" + File.separator + "someDir";
File dir = new File(filePath);
if (dir.exists() || dir.mkdirs()) {
    // assuming that resultFileName contains the absolute file name, including the directory in which it should go
    File destFile = new File(resultFileName);
    if (destFile.exists() || destFile.createNewFile()) {
        FileOutputStream fos = new FileOutputStream(destFile);
        // ...
    }
}
0 голосов
/ 26 октября 2018

Когда вы использовали

file.makeDirs();

Созданы все несуществующие каталоги, включая "NewFileToGenerate" +getName+headerDate+ ".xls". Да, файл, который вы хотите создать, создается как каталог.

И затем вы вызвали file.createNewFile (), который вернет false, поскольку существует каталог с тем же именем, что и файл.

Попытка использовать FileOutputStream с каталогом не будет работать, будет выдано исключение.

Следовательно, вы увидите это сообщение об ошибке: D: / Новый файл / NewFileToGenerateUser26 / 2018 20: 00: 14.xls (является каталогом)

Возможное исправление:

Сначала создайте родительский каталог, а затем создайте файл, который вы хотели создать после того, как родительский каталог создан в другом операторе. Такие как:

File file = new File("parent1/parent2");
file.mkDirs();

File desiredFile = new File("parent1/parent2/desiredfile.extensionhere");
desiredFile.createNewFile();
0 голосов
/ 26 октября 2018

Ваш файл создается как каталог. Я исправил ваш код и добавил комментарии

    File root = new File(filePath);
    //Check if root exists if not create it
    if(!root.exists()) root.mkdirs();
    String resultFileName = "NewFileToGenerate" +getName+headerDate+ ".xls";
    File xlsFile = new File(root, resultFileName);
    //check if xls File exists if not create it
    if(!xlsFile.exists()) {
        try {
            xlsFile.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
0 голосов
/ 26 октября 2018

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

Причина в том, что вы используете / в имени файла, который является разделителем пути. Даже Windows с \ также поддерживает стандарт Posix и не позволяет его.

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