java.io.FileNotFoundException :(允许拒绝)使用ObjectOutputStream编写对象时

时间:2017-06-28 17:19:22

标签: java android android-permissions

我一直在努力解决这个问题几个小时,我非常沮丧,所以我来找你们一些指导。

我正在尝试保存并检索我创建的User对象。我想这样做,以便我可以从我的应用程序中的任何意图保存和检索此User对象,所以我决定使用FileInput和Output流。我在下面列出了我的代码。

这是我的输出数据方法:

public static void serializeDataOut(User ish) {
    try {
        String path = Environment.getExternalStorageDirectory().getAbsolutePath();
        File newFile = new File(path + "myFile.ser");
        FileOutputStream fos = new FileOutputStream(newFile);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(ish);
        oos.flush();
        oos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

这是我的输入数据方法:

public static User serializeDataIn(){
    try{
        String path = Environment.getExternalStorageDirectory().getAbsolutePath();
        FileInputStream fin = new FileInputStream(path + "myFile.ser");
        ObjectInputStream ois = new ObjectInputStream(fin);
        User iUser = (User) ois.readObject();
        ois.close();
        return iUser;
    } catch (IOException | ClassNotFoundException e) {
        e.printStackTrace();
        return null;
    }
}

注意:这两个方法都驻留在我的User类中,它也实现了Serializable。

文件路径的整个错误如下所示:java.io.FileNotFoundException: /storage/emulated/0myFile.ser (Permission denied)它出现在这一行:FileOutputStream fos = new FileOutputStream(newFile);当我从一个不同的意图调用它时:User.serializeDataOut(addingUser);,其中addsUser是一个有效的用户对象。

我在异常日志中看到(权限被拒绝)之后做的第一件事是进入我的清单并检查我是否允许我的应用程序读取和写入存储,我实际上做了。我在下面列出了我的权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

然后我读到有些人遇到错误,如果他们有错误的路径,更具体地说不包括绝对路径,然后我编辑了我的代码以包含Environment.getExternalStorageDirectory().getAbsolutePath();部分,我很确定我我正确使用。

我还确保,因为我在模拟器上测试它,我已经启用了SD卡,并且模拟器有一个SD文件夹。我检查了它确实有一个SD卡文件夹,我也在S8上测试了这个应用程序,我得到了同样的错误。

我到底错在了什么?我想要做的就是保存一个User对象并将其检索到其他地方,并且我完全可以使用之前的文件被覆盖并且一次只保存一个用户。

还有一些可能与我刚刚注意到的相关:在我的Android监视器中大约每3-5秒,即使在我杀死我的应用程序后,仍会出现错误。错误如下所示:onFatalError, processing error from engine(4) com.google.android.apps.gsa.shared.speech.a.g: Error reading from input stream虽然我只能假设这不是问题的根源,但我只想添加它,以防它可以提供帮助。感谢

3 个答案:

答案 0 :(得分:7)

您已在清单中添加了权限,因此我确定您不会询问运行时权限。如果您使用的是SDK 23或更高版本,请询问运行时权限。作为参考,我在这里添加一些片段:

if(Build.VERSION.SDK_INT>22){
     requestPermissions(new String[] {YOUR_PERMISSIONS AS STRING}, 1);
}

要检查是否授予权限,您需要使用onRequestPermissionResults()方法。

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 1: {
            if (!(grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED)) {
                Toast.makeText(addAlarm.this, "Permission denied to access your location.", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

答案 1 :(得分:5)

java.io.FileNotFoundException: /storage/emulated/0myFile.ser看起来在路径中缺少'/'。

使用

String path = Environment.getExternalStorageDirectory().getAbsolutePath() + '/';

答案 2 :(得分:2)

  

从Android 6.0(API级别23)开始,用户授予权限   应用程序运行时的应用程序

您需要知道的一切都在:

https://developer.android.com/training/permissions/requesting.html

另一个错误与它无关