【问题标题】:Java Android working with InputStream and FileJava Android 使用 InputStream 和 File
【发布时间】:2013-12-09 04:38:51
【问题描述】:

嗯,首先,我只是在学习,不太明白我在做什么。 我想要的是在内存中创建一个 Excel 文件,然后可以将其与 ActionBarSherlock 的 ShareActionProvider 一起发送到邮件中。

但我得到了例外:

11-24 18:45:52.112: W/System.err(22073): java.io.FileNotFoundException: /Competition.xls: open failed: EROFS (Read-only file system)

当我在网上搜索答案时 - 这是在只读系统区域中创建文件的问题。但我想在内存中创建它..不知何故。再一次,我不太明白它是如何工作的——我看到它的方式——我在内存的某个地方创建了 .xls 文件。所以解释会很有帮助。

所以,这里是代码:

private void createFileTosend() {
    InputStream inputStream = null;
    FileOutputStream outputStream = null;
    try {
        File toSend=null;
        try {
            toSend = getFile();
        } catch (WriteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    inputStream = new BufferedInputStream(new FileInputStream(toSend));


        outputStream = openFileOutput("Competition.xls",
                Context.MODE_WORLD_READABLE | Context.MODE_APPEND);
        byte[] buffer = new byte[1024];
        int length = 0;
        try {
            while ((length = inputStream.read(buffer)) > 0){
                outputStream.write(buffer, 0, length);
            }
        } catch (IOException ioe) {
            /* ignore */
        }
    } catch (FileNotFoundException fnfe) {
        /* ignore */
    } finally {
        try {
            inputStream.close();
        } catch (IOException ioe) {
           /* ignore */
        }
        try {
            outputStream.close();
        } catch (IOException ioe) {
           /* ignore */
        }
    }
}
public File getFile()  throws IOException, WriteException{
    File file=new File("Competition.xls");

    WritableWorkbook  workbook = Workbook.createWorkbook(file); 
    //then goes creation of Excel 's xls file which is not important for the question
    workbook.write();
    workbook.close(); 

    return file;
}

再一次,请不要对我投反对票,我只是在学习

【问题讨论】:

  • 我很确定您需要在共享之前将其保存到磁盘。您无法访问某种系统范围的“内存”,您只能在其中放置其他应用可以访问的内容。
  • @KenWolf - 实际上,这是不正确的。 Android 支持文字共享内存,以及一些通过 Intent 传递数据结构的方式。但通常这是通过在外部存储上创建文件来完成的。
  • @ChrisStratton 很有趣,我将不得不查找文字共享内存(这一定有一些安全隐患?)。基本上我看不到如何在不写入磁盘的情况下创建 Excel 文件并与其他应用程序共享,但也许我误解了这个要求。
  • 我同意将它写入磁盘是可取的 - 大多数目标应用程序将无法接受它。我只是指出实际上允许共享内存映射,并且还有其他机制,例如要传递的序列化对象或传递类似回调的内容提供程序,理论上可以在合作开发的应用程序之间使用。
  • @user2976267 文件路径是什么?

标签: java android file inputstream


【解决方案1】:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

根据您发布的错误日志,我猜您没有仔细阅读。它是说只读文件系统。您需要将上述权限 ATLEAST 放入您的 android 清单中。

做这么多,看看是否还有错误

【讨论】:

  • 不,这不是问题所在。您未能理解错误消息。预期目标不是外部存储,而是(错误地)根目录,这就是为什么它是只读文件系统投诉而不是权限投诉。
  • 11-24 18:45:52.112:W/System.err(22073):java.io.FileNotFoundException:/Competition.xls:打开失败:EROFS(只读文件系统)“打开失败:EROFS(只读文件系统)”。这是你的错误。我已经给你加了引号
  • 其次,您正在调用 getFile 方法。并且您的错误是说明该文件不存在。
  • 对不起,我没有在我的帖子中包含它,但我在清单中拥有该权限 - 事实并非如此
  • 同样,这不是触发该错误消息的问题。直接的问题是代码试图在根目录中创建文件,而不是在外部存储上。当且仅当更改代码以在外部存储上创建文件时,才需要此权限。
【解决方案2】:

我怀疑可能是错的

outputStream = openFileOutput("Competition.xls",
            Context.MODE_WORLD_READABLE | Context.MODE_APPEND);

您正在使用Context.MODE_WORLD_READABLE 它是可读的,那么以后如何以写入模式访问它。这样对吗? 检查这个link

使用http://developer.android.com/guide/topics/data/data-storage.html 清除您对文件创建的疑虑

【讨论】:

  • 不,这不是问题所在。请阅读已经发布的说明。
猜你喜欢
  • 1970-01-01
  • 2013-08-04
  • 2013-05-11
  • 2016-06-18
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 2023-01-25
  • 2020-10-06
相关资源
最近更新 更多