java.io.FileNotFoundException: (Permission denied) 使用 ObjectOutputStream 写入对象时

java.io.FileNotFoundException: (Permission denied) when writing an object using ObjectOutputStream

我已经尝试解决这个问题几个小时了,但我非常沮丧,所以我来找你们寻求指导。

我正在尝试保存和检索我创建的用户对象。我想做到这一点,以便我可以在整个应用程序的任何意图中保存和检索此 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;
    }
}

注意:这两种方法都位于我的用户 class 中,它也实现了 Serializable。

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

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

<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 上测试了这个应用程序,我得到了同样的错误。

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

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

您已经在清单中添加了权限,所以我确定您没有要求运行时权限。如果您使用的是 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();
            }
        }
    }
}

Beginning in Android 6.0 (API level 23), users grant permissions to apps while the app is running

你想知道的都在:

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

其他错误与此无关

java.io.FileNotFoundException: /storage/emulated/0myFile.ser 看起来你在路径中缺少一个“/”。

使用

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