【问题标题】:Java throws a java.io.FileNotFoundException: /dir/file.xlsx "Permission denied"Java 抛出 java.io.FileNotFoundException: /dir/file.xlsx "Permission denied"
【发布时间】:2014-01-03 04:36:31
【问题描述】:

我正在使用 POI API 读取 XLSX 文件,我想将其转换为 CSV 文件。 xlsx 文件被拖放到服务器中,文件权限为 -rw-r--r--。

这是我正在使用的代码:

    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 代码的用户信息,谢谢

标签: java excel unix apache-poi file-permissions


【解决方案1】:

它正在尝试保存文件的副本 - 我猜它正在尝试保存对文件所做的一些更改。为此,该文件需要为应用程序用户设置写入权限,否则需要更改所有者。

【讨论】:

  • 是的,确实...这更可能与文件的权限有关...感谢您的帮助!
猜你喜欢
  • 2014-03-01
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-05
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多