0

在我的 android 应用程序中,每次加载新游戏时,我都会从内部存储中读取文件。我这样做的前 4 次,它工作正常,但在第五次它强制关闭。这是我的代码

private String readFromInternalStorage(String filename) {
    FileInputStream fis=null;
    byte[] bytes = new byte[1000000];
    try {
        fis=startGame.openFileInput(filename);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }       
    try {
        fis.read(bytes);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return new String(bytes);

}

在弄乱代码时,我注意到如果我改变字节数组的长度,它会改变我在不强制关闭的情况下读取文件的次数。如果我将长度更改为 2000000,它会在第二次后关闭,如果我将其更改为 100000,它会在第八次后关闭。我对为什么会发生这种情况一无所知,因为每次调用该方法时我都会创建一个新的字节数组,所以我认为大小不会改变任何东西。

更新:

在返回并进行更多测试后,文件输入似乎与我的应用程序强制关闭的原因无关。当这段代码被注释掉时,应用程序将连续加载五个级别而不会强制关闭,所以我认为这是问题所在,但在八次尝试后它仍然强制关闭,所以很明显还有其他东西不起作用。还是要谢谢你的帮助。

4

3 回答 3

3

我在您的代码中没有看到“close()”:

于 2012-08-17T20:07:29.943 回答
1

您不应该对数组大小进行硬编码。此外,您应该使用 finally,以确保FileInputStream即使失败也已关闭。

这是一个代码示例,显示了它应该如何完成:

        FileInputStream fis;
        String info = "";
        try {
            fis = mContext.openFileInput(this.fileName);
            byte[] dataArray = new byte[fis.available()];
            if (dataArray.length > 0) {
                while (fis.read(dataArray) != -1) {
                    info = new String(dataArray);
                }
                Log.i("File Reading" , "Success!");
                isOk = true;
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        } finally {
            fis.close();
        }
于 2012-08-17T20:12:10.410 回答
0

您所做的安全版本是例如:

private String readFromInternalStorage(String filename) {
    FileInputStream fis = null;
    File file = new File(startGame.getFilesDir(), filename);

    long size = file.length();
    // impossible to have more than that (= 2GB)
    if (size > Integer.MAX_VALUE) {
        Log.d("XXX", "File too big");
        return null;
    }

    int iSize = (int) size;
    try {
        fis = new FileInputStream(file);

        // part of Android since API level 1 - buffer can scale
        ByteArrayBuffer bb = new ByteArrayBuffer(iSize);

        // some rather small fixed buffer for actual reading
        byte[] buffer = new byte[1024];

        int read;
        while ((read = fis.read(buffer)) != -1) {
            // just append data as long as we can read more
            bb.append(buffer, 0, read);
        }

        // return a new string based on the large buffer
        return new String(bb.buffer(), 0, bb.length());
    } catch (FileNotFoundException e) {
        Log.w("XXX", e);
    } catch (IOException e) {
        Log.w("XXX", e);
    } catch (OutOfMemoryError e) {
        // this could be left out. Keep if you read several MB large files.
        Log.w("XXX", e);
    } finally {
        // finally is executed even if you return in above code
        // fis will be null if new FileInputStream(file) throws
        if (fis != null) {
            try {
                fis.close();
            } catch (IOException e) {
                // ignored, nothing can be done if closing fails
            }
        }
    }
    return null;
}
于 2012-08-17T21:01:55.850 回答