Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android处理InputStream和文件_Java_Android_File_Inputstream - Fatal编程技术网

Java Android处理InputStream和文件

Java Android处理InputStream和文件,java,android,file,inputstream,Java,Android,File,Inputstream,首先,我只是在学习,不太明白我在做什么。 我想要的是在内存中创建一个Excel文件,然后可以使用ActionBarSherlock的ShareActionProvider将其发送到mail,例如 但我有一个例外: 11-24 18:45:52.112: W/System.err(22073): java.io.FileNotFoundException: /Competition.xls: open failed: EROFS (Read-only file system) 当我在网上搜索答案

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

但我有一个例外:

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;
}
再一次,请不要否决我,我只是在学习


<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
根据你发布的错误日志,我猜你没有仔细阅读。它说的是只读文件系统。您需要在android清单中至少添加上述权限


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

我怀疑可能是错的

outputStream = openFileOutput("Competition.xls",
            Context.MODE_WORLD_READABLE | Context.MODE_APPEND);
您使用的是
Context.MODE\u WORLD\u READABLE
它的可读性,所以以后如何在写模式下访问它。是这样吗? 检查这个


使用来消除您对文件创建的疑虑

不,这不是问题所在。您未能理解错误消息。预期目标不是外部存储器,而是根目录(错误地),这就是为什么它是只读文件系统投诉而不是权限投诉的原因。11-24 18:45:52.112:W/system.err(22073):java.io.FileNotFoundException:/Competition.xls:open failed:EROFS(只读文件系统)“open failed:EROFS(只读文件系统)”.这是你的错误。我已经在引号中为您引用了它,其次您正在调用getFile方法。您的错误是声明该文件不存在。很抱歉,我没有将其包含在我的帖子中,但我在清单中拥有该权限-再次不是这种情况,这不是触发该错误消息的问题。直接的问题是代码试图在根目录中创建文件,而不是在外部存储器上。如果且仅当代码更改为在外部存储器上创建文件时,则需要此权限。我很确定,在共享之前,您需要将其保存到磁盘。您无法访问某种系统范围的“内存”,您只能在其中放置其他应用程序可以访问的内容。@KenWolf-事实上,这是不正确的。Android支持文字共享内存,也支持通过意图传递数据结构的一些方式。但一般来说,这可以通过在外部存储器上创建一个文件来完成。@ChrisStratton有趣的是,我必须查找文字共享内存(这肯定有一些安全隐患?)。基本上,我不知道如何在不写入磁盘的情况下创建excel文件并与其他应用程序共享,但可能我误解了要求。我同意理想的做法是将其写入磁盘,否则大多数目标应用程序将无法接受。我刚才指出,共享内存映射实际上是允许的,还有其他机制,如序列化要传递的对象,或传递类似于内容提供程序的回调,理论上可以在合作开发的应用程序之间使用。@user2976267文件的路径是什么?不,这不是问题所在。请阅读已经发布的解释。