Я использую 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 в файл. Похоже, это проблема пользователя, но не знаю, как ее преодолеть.
Рекомендации:
Большое спасибо.
Вы можете добавить вывод ls -ld/dir/и ls -l /dir/file.xlsx, можете ли вы также добавить информацию, которую пользователь использует для запуска java-кода, thx – JosefN