2017-06-28 34 views
0

我一直在试图解决此几个小时,我感到非常沮丧,所以我来到你们的一些指导对象时(拒绝)。java.io.FileNotFoundException:编写使用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; 
    } 
} 

注:这两种方法都存在我的User类,这也实现Serializable内。

整体误差与文件路径是这样的:java.io.FileNotFoundException: /storage/emulated/0myFile.ser (Permission denied),它出现在这一行:FileOutputStream fos = new FileOutputStream(newFile);当我把它叫做从不同的意图,像这样:User.serializeDataOut(addingUser);其中addingUser是一个有效的用户对象。

在异常日志中看到(Permission denied)后我做的第一件事就是进入我的清单并检查我是否允许我的应用程序读取和写入存储,事实上我确实这样做了。我已经包括了我的权限如下:

<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虽然我只能假设这不是问题的根源,但我只是想添加它,以防万一。由于

+1

请提供[MCVE。用单词解释你的代码是很好的,只要你还提供完整的代码。例如,说明“注意:这两种方法驻留在我的User类中,它们也实现了Serializable”,可以通过'public class User implements Serializable {...'来更容易地显示。 –

回答

3

你已经添加在清单中的权限,所以我敢肯定,你是不是要求运行权限。如果您使用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(); 
      } 
     } 
    } 
} 
+0

我无法相信所有我读的东西都没有评论你如何最可能需要运行时权限......谢谢! – cjnash

3

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

使用

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

我希望我能把两个答案标记为正确的,因为我确实需要改变两件事情。添加运行时权限后,我的应用程序无法工作,直到我添加额外的'/'谢谢! – cjnash

相关问题