2013-12-15 2 views
1

Я использую API POI для чтения файла XLSX, который я хочу преобразовать в файл CSV. Файл xlsx удаляется на сервере, разрешения для файлов - rw-r-r--.Java бросает java.io.FileNotFoundException: /dir/file.xlsx "Permission denied"

Это код, я использую:

public void processFirstSheet(String filename) throws Exception { 

    OPCPackage pkg = null; 
    try{ 
     FileUtil.set777Permissions(filename); 
     pkg = OPCPackage.open(filename,PackageAccess.READ_WRITE); 
    }catch(Exception e){ 
     log.warning("OPCPackage: "+ e.getMessage()); 
    } 

    try{ 
     XSSFReader r = new XSSFReader(pkg); 
     SharedStringsTable sst = r.getSharedStringsTable(); 

     // creating the needed parser instance which will 
     // generate the needed rows 
     XMLReader parser = XMLReaderFactory.createXMLReader(ORG_APACHE_XERCES_PARSERS_SAX_PARSER); 
     ContentHandler handler = new RowGenerator(sst); 
     parser.setContentHandler(handler); 

     Iterator<InputStream> sheets = r.getSheetsData(); 
     // if there are no sheets to open, return 
     if(!sheets.hasNext()) 
      return; 
     // for the moment we parse the first sheet 
     InputStream sheet = sheets.next(); 
     try { 
      InputSource sheetSource = new InputSource(sheet); 
      parser.parse(sheetSource); 
     } finally { 
      sheet.close(); 
     } 
    } finally { 
     if(pkg!=null) 
      pkg.close(); 
    } 
} 

При отладке, то pkg.close() бросает исключение следующим образом:

java.io.FileNotFoundException: /dir/file.xlsx (Permission denied) 
      at java.io.FileOutputStream.open(Native Method) 
      at java.io.FileOutputStream.<init>(FileOutputStream.java:212) 
      at java.io.FileOutputStream.<init>(FileOutputStream.java:165) 
      at org.apache.poi.openxml4j.opc.internal.FileHelper.copyFile(FileHelper.java:68) 
      at org.apache.poi.openxml4j.opc.ZipPackage.closeImpl(ZipPackage.java:334) 
      at org.apache.poi.openxml4j.opc.OPCPackage.close(OPCPackage.java:417) 
      at project.format.readers.impl.GCSXlsxReader.processFirstSheet(XlsxReader.java:96) 
      at project.format.readers.impl.XlsxReader.<init>(XlsxReader.java:54) 
      at project.format.impl.FileConverter.readAndConvert(FileConverter.java:135) 
      at project.format.impl.FileConverter.convert(FileConverter.java:66) 
      at project.watcher.impl.GCSDirectoryWatcher.startWatchinginDirectory(DirectoryWatcher.java:66) 
      at project.watcher.impl.GCSDirectoryWatcher.run(DirectoryWatcher.java:31) 
      at java.lang.Thread.run(Thread.java:722) 
    Dec 15, 2013 2:12:24 PM project.watcher.impl.FeedHelper archiveFile 

Что я могу видеть, я не могу установить разрешений 777 к файлу. Пользователь, запускающий приложение, является конкретным пользователем, созданным для этого приложения, работающего на сервере Unix.

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

Рекомендации:

Большое спасибо.

+2

Вы можете добавить вывод ls -ld/dir/и ls -l /dir/file.xlsx, можете ли вы также добавить информацию, которую пользователь использует для запуска java-кода, thx – JosefN

ответ

2

Он пытается сохранить копию файла - я предполагаю, что он пытается сохранить некоторые изменения, внесенные в файл. Для этого у файла должны быть установлены права на запись для пользователя приложения, или владелец должен быть изменен.

+0

Да, действительно ... Это скорее всего, связано с разрешениями на файл ... Спасибо за вашу помощь! –

Смежные вопросы