【问题标题】:Read a large file in android (~15MB) from external memory in android从 android 的外部存储器中读取 android 中的大文件(~15MB)
【发布时间】:2013-06-15 05:31:19
【问题描述】:

我想加载一个模型文件,该文件将出现在用户的外部存储中。模型文件的大小可以达到 20MB 左右。它包含由 '\n' 分隔的 x,y,z 信息。当我尝试通过我的方法加载一个小文件时,它运行良好。但是对于大文件,应用程序要求强制退出。

File dir = Environment.getExternalStorageDirectory();
        File file = new File(dir,"model_Cube.txt");
        BufferedReader reader = null;
        List<Float> list = new ArrayList<Float>();

        try {
            reader = new BufferedReader(new FileReader(file));
            String text = null;
            while ((text = reader.readLine()) != null) {
                list.add(Float.parseFloat(text));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }
        try {
            reader.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            reader.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        triangleCoords = new float[list.size()];

        for (int i = 0; i < list.size(); i++) {
            Float f = list.get(i);
            triangleCoords[i] = (float) (f.floatValue()/10.0); // Or whatever default you want.
        }

【问题讨论】:

  • ...那么为什么文件需要那么大才能执行您正在执行的操作?将其存储在 SQLite 中不是更好(如果数据太密集)吗?
  • 嗯,它包含一个 3D 模型的点云信息,比如泰姬陵。现在我想做的是阅读点云信息并查看它。为了创建数据库,我仍然需要先读取文件,不是吗?
  • @Makoto 我认为 Android 中的 SQLite BLOB 限制为 1MB。
  • 我在这里使用扫描仪stackoverflow.com/a/54961878/7680587提供了解决方案@

标签: java android file-io


【解决方案1】:

这里的问题不在于你的代码工作,它实际上是线程的问题。

发生这种情况是因为设备发现您正在主用户界面线程中执行大型进程。查看异步任务。 http://developer.android.com/reference/android/os/AsyncTask.html

这就是 Android 在应用程序中处理多线程的方式。在主线程中执行大文件加载或计算可能会导致应用程序无响应,操作系统会认为它已经崩溃。

将此功能拆分为单独的线程将避免此问题。

这是一个不错的教程,其中包含异步任务的示例实现。 http://androidresearch.wordpress.com/2012/03/17/understanding-asynctask-once-and-forever/

【讨论】:

  • 谢谢。我会调查的。
【解决方案2】:

您应该使用 AsyncTask (http://developer.android.com/reference/android/os/AsyncTask.html) 或单独的线程 (http://developer.android.com/reference/java/lang/Thread.html) 来读取此文件。现在您正在主线程(UI 线程)中读取此文件,并且在读取时,UI 没有响应。 另外,请注意,使用 SQLite 而不是这样的大文件可能会更好。

【讨论】:

    猜你喜欢
    • 2012-04-12
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    相关资源
    最近更新 更多