代码之家  ›  专栏  ›  技术社区  ›  Vivek Nuna Chetan sabhaya

在Android中读取内部存储文件花费了太多时间

  •  -2
  • Vivek Nuna Chetan sabhaya  · 技术社区  · 6 年前

    JSON.stringify 从JavaScript代码)。我正在将这个JSON数据写入Android设备上的一个内部存储文件,稍后再读取它。所以当我读文件的时候花了太多的时间,我不知道它是否在读。还有一件事我只需要在主线程中阅读。

    如果我将数据值“Hello World”传入 WriteFile

    public String ReadFile()
    {
        StringBuffer text = new StringBuffer();
        String FILE_NAME = "file.txt";
        try {
            BufferedReader bReader = new BufferedReader(new InputStreamReader(openFileInput(FILE_NAME)));
            String line;
            int count = 0;
            while ((line = bReader.readLine()) != null) {
                text.append(line + "\n");
                alert("Reading File: " + ++count);
            }
    
        } 
        catch (Exception e) {
            alert(e.toString());
        }
    
        return text.toString();
    }
    
    public String WriteFile(String data)
    {
        String FILE_NAME = "file.txt";
        String result = "";
      try {
          FileOutputStream fos = openFileOutput(FILE_NAME, Context.MODE_PRIVATE);
          fos.write(data.toString().getBytes());
          result = "Success";
          fos.close();
        }
        catch (Exception e) {
            e.printStackTrace();
            result="Error";
       }
    
        return result;
    }
    

    我已经加了一个警报 loop 还有,但我看不到任何警告信息。我甚至没见过 Exception

    所以可能有两个问题。

    1. 写入文件时出错(但我不知道如何验证这一点?因为我不认为有任何方法可以查看内部存储文件)。

    2. 我读代码时出错了。

    如果假设我不能用Java本地代码读取这么大的文件,那么有没有办法从WebView JavaScript代码中读取内部存储Android文件?

    应用要求

    我有一个Android应用程序,其中有一个WebView。我已经将完整的javascript代码(js和HTML文件)复制到应用程序的assets文件夹中。我正在从java本机代码中写入文件,并从java本机代码中读取。我正在应用程序启动时从服务器获取所有数据。我的客户有一个非常慢的互联网连接,它断开了很多次。所以他们希望这个应用在离线模式下运行。意味着应用程序将在发布时获取所有数据,我们将把数据存储在某个地方,然后在整个应用程序中阅读。如果用户再次启动应用程序,它将获得旧的现有数据。实际上,这些数据非常大,所以我将其存储到内部存储文件中。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Stephen C    6 年前

    首先,要真正确定代码为什么要花很长时间,唯一的方法是对它进行概要分析。我们不能为你这么做。

    但这里有一些与代码相关的性能提示:

    1. 除非确实需要,否则不要将整个20MB JSON文件读入Java堆/RAM内存。(我发现很难理解你为什么这么做。例如,典型的JSON解析器 直接从文件读取输入。或者,如果您正在读取此消息以便将其发送到HTTP连接另一端的客户端,则应该能够流式传输数据。)

    2. 一次读取一行文件,然后将这些行缝合在一起是不必要的。它会产生不必要的垃圾。额外的垃圾意味着GC要做更多的工作,这会减慢速度。如果行很长,则可以使用内部 StringBuilder

      读到回收的 char[] 字符[] 满足于 将比附加行快。

    3. 你的 字符串拼接 O(N^2) 行为。但是,扩展仍然会影响性能,并可能导致比实际需要的峰值内存使用率高出3倍。)

      避免这种情况的一种方法是获得要添加的字符数的初始估计值,并设置 字符串拼接 相应的“容量”。您可以根据文件大小估计字符数。(这取决于编码。)

    4. 寻找一种使用现有标准Java库的方法;例如。 Files.copy ByteArrayOutputStream ,或 Files.readAllBytes

    5. IOUtils.toString(Reader) 方法。很可能是 他们 会花很多时间去想怎么做 . 重用一个精心设计、维护良好的库可能会节省您的时间。

    6. 不要留下痕迹 alert 是……)在一个可以被称为数百万次的循环中。(啊!)