【问题标题】:Internal Storage with a file was working and now it is not带有文件的内部存储正在工作,但现在不行
【发布时间】:2012-06-21 22:42:38
【问题描述】:

我需要紧急帮助。我有一个应用程序在几个小时前运行良好,可以写入和读取内部存储文件。现在我回家了,在我的设备上运行它,它开始强制关闭!这对我来说根本没有任何意义。我唯一的猜测是它试图读取的文件现在不知何故不存在?我正在尝试在应用程序的许多位置读取和写入此文件。这是我在 LogCat 中收到的错误。

    06-21 18:14:34.666: W/dalvikvm(5349): threadid=1: thread exiting with uncaught exception (group=0x40015560)
06-21 18:14:34.682: E/AndroidRuntime(5349): FATAL EXCEPTION: main
06-21 18:14:34.682: E/AndroidRuntime(5349): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.wglxy.example.dash1/com.wglxy.example.dash1.F2Activity}: java.lang.NullPointerException
06-21 18:14:34.682: E/AndroidRuntime(5349):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
06-21 18:14:34.682: E/AndroidRuntime(5349):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
06-21 18:14:34.682: E/AndroidRuntime(5349):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
06-21 18:14:34.682: E/AndroidRuntime(5349):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
06-21 18:14:34.682: E/AndroidRuntime(5349):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-21 18:14:34.682: E/AndroidRuntime(5349):     at android.os.Looper.loop(Looper.java:130)
06-21 18:14:34.682: E/AndroidRuntime(5349):     at android.app.ActivityThread.main(ActivityThread.java:3683)
06-21 18:14:34.682: E/AndroidRuntime(5349):     at java.lang.reflect.Method.invokeNative(Native Method)
06-21 18:14:34.682: E/AndroidRuntime(5349):     at java.lang.reflect.Method.invoke(Method.java:507)
06-21 18:14:34.682: E/AndroidRuntime(5349):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:850)
06-21 18:14:34.682: E/AndroidRuntime(5349):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
06-21 18:14:34.682: E/AndroidRuntime(5349):     at dalvik.system.NativeStart.main(Native Method)
06-21 18:14:34.682: E/AndroidRuntime(5349): Caused by: java.lang.NullPointerException
06-21 18:14:34.682: E/AndroidRuntime(5349):     at java.io.Reader.<init>(Reader.java:65)
06-21 18:14:34.682: E/AndroidRuntime(5349):     at java.io.InputStreamReader.<init>(InputStreamReader.java:122)
06-21 18:14:34.682: E/AndroidRuntime(5349):     at java.io.InputStreamReader.<init>(InputStreamReader.java:59)
06-21 18:14:34.682: E/AndroidRuntime(5349):     at com.wglxy.example.dash1.Grid.readRawText(Grid.java:214)
06-21 18:14:34.682: E/AndroidRuntime(5349):     at com.wglxy.example.dash1.F2Activity.onCreate(F2Activity.java:75)
06-21 18:14:34.682: E/AndroidRuntime(5349):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
06-21 18:14:34.682: E/AndroidRuntime(5349):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
06-21 18:14:34.682: E/AndroidRuntime(5349):     ... 11 more

在包含方法 readRawText 的 Grid 类中,它抱怨某行:InputStreamReader inputReader = new InputStreamReader(his)。 “fis”在上面声明时考虑了一个特定的目录。

这是 readRawText 方法的代码.....

public static String readRawText(Context context)
  {

      FileInputStream fis = null;
    try {
        fis = new FileInputStream("/data/data/com.wglxy.example.dash1/app_myDir/output.txt");
    } catch (FileNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

      InputStreamReader inputReader = new InputStreamReader(fis);
      BufferedReader buffReader = new BufferedReader(inputReader);
      String line;
      StringBuilder textFile = new StringBuilder();

      try
      {
          while((line = buffReader.readLine()) != null)
          {
              textFile.append(line);
             // textFile.append('\n');

          }
      }
      catch (IOException e)
      {
          return null;
      }

      return textFile.toString();
  } 

}

由于它给我的错误是空指针错误,我一直在想文件可能会以某种方式消失或其他什么。如果有人能帮助我解决这个问题,我将非常感激。我只是花了一整天的时间让这个应用程序正常工作,但现在不行了。这简直令人沮丧!你认为你已经完成了一些事情,但你没有......

再次,如果有人能告诉我如何解决此问题或给我一些宝贵的建议,我将不胜感激。

这里更新我在 F2Activity 中的 WRITEGRIDS 方法....

public void writeGrids(List<Grid> grids) throws IOException
{
    String data;
    FileOutputStream fos = null;

     try
     {
     File dir = getDir("myDir", Context.MODE_PRIVATE);
     Log.d("SEE",dir.getAbsolutePath());
     File myFiles = new File(dir, "output.txt");


     fos = new FileOutputStream(myFiles);




     for(Grid grid : grids)
     {
         data = grid.getGridNickName() + ";" + grid.getGridName() + ";" +
                  grid.getFirstName() + ";" + grid.getLastName() + ";" +
                  grid.getPassword()+ ";" + grid.getLoginURI() + ";"; 
         fos.write(data.getBytes());
     }
     }


      catch (Exception e)
     {
         System.err.println("Error: " + e.getMessage());
     }

     fos.close();

}

所以我猜我需要将 File dir etc..... 放在我的代码顶部?但它不应该每次我运行程序时都创建一个新文件吗?如果我听起来很无知,我很抱歉。我对 android 还很陌生,到目前为止,它一直是一个爆炸。

【问题讨论】:

  • 如果您认为文件丢失,请检查文件系统是否存在,然后报告。
  • 您的设备是否通过 USB 数据线连接到计算机?如果是这样,如果断开它会发生什么?
  • 你认为是因为我使用的是 FileInputStream 而不是 openFileInput 吗?我不知道....我有什么方法可以实际查看文件是否存在?
  • 我检查了文件资源管理器并获得了数据/数据/com.wglxy.example.dash1,然后有名为“files”和“lib”和“shared_prefs”的文件. “files”和“lib”什么都没有,而“shared_prefs”有我的共享偏好。有没有办法进入那个 app_myDir 文件夹???这是隐藏的还是什么?此外,连接到设备或未连接时也会发生同样的错误。
  • @user1461393 :我从未探索过内部存储,但您确定名为app_myDir 的目录是标准目录吗?如果不是,那么肯定是其他地方创建了它 - 大概是创建 output.txt 文件的代码。另外,顺便说一句,不要对文件/目录路径进行硬编码 - 不能保证它们在不同的设备或 Android 版本中是相同的。

标签: android fileinputstream


【解决方案1】:

你得到一个 NullPointerException 就行了

InputStreamReader inputReader = new InputStreamReader(fis);

您在初始化 FileInputStream 时也会遇到 FileNotFoundException。我的猜测是 FileNotFoundException 被抛出是因为文件根本不存在导致引用变量“fis”被分配给 null。

output.txt 来自哪里?它是在哪里创建的?您的应用程序中是否有一个地方正在创建文件 /app_myDir/output.txt,但此时尚未到达?

另外,为了简单解决强制关闭的问题,您需要检查“fis”是否为空。如果不为 null,则继续处理(即使您相对确信文件存在,这也是一个好习惯):

if (fis != null) {
    InputStreamReader inputReader = new InputStreamReader(fis);
    BufferedReader buffReader = new BufferedReader(inputReader);
    String line;
    StringBuilder textFile = new StringBuilder();

    try
    {
        while((line = buffReader.readLine()) != null)
        {
            textFile.append(line);
            // textFile.append('\n');
        }
    }
    catch (IOException e)
    {
        return null;
    }

    return textFile.toString();
} else 
    return null;

【讨论】:

  • 啊啊啊啊。好吧,我发现了我在哪里创建了我臭名昭著的“output.txt”。它是在我的 F2Activity 的 writeGrids 方法中创建的。这几乎听起来就像我正在尝试在创建之前阅读某些内容。但后来我不明白为什么这在几个小时前有效。目录“data/data/app_Dir 来自我在 writeGrids 方法中使用 getDir 命令时。让我编辑和更新页面以包含我的 writeGrids 方法............
  • 可能是您在构建项目时从您的设备中删除了该文件。那你重建后没有重建。
  • 这肯定会解释很多。我需要在各种论坛上进行书面阅读。你会建议我在哪里重新创建我的文件?在主屏幕上?
  • 在它所在的地方创建可能很好。但问题是,每次您想要访问该文件时,您都需要在尝试处理它之前检查它是否存在。我尽量不创建任何数据库或文件,除非用户给出了这样做的命令(即不在应用程序启动后立即创建这些资源),并且如果用户想要执行需要文件或数据库的操作尚不存在,您只需检查该资源是否存在,如果不存在则通知用户那里没有任何内容或以您认为合适的其他方式处理它。
  • 非常感谢您的帮助。在将内容存储在内部存储方面我是新手,因为我通常将所有内容存储在数据库中,但这不是这个应用程序想要的。我离解决问题更近了,再次感谢您。
猜你喜欢
  • 2018-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
  • 2017-07-15
  • 1970-01-01
相关资源
最近更新 更多