Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javaandroid快速读取完整文件_Java_Android_Performance_File_Bufferedreader - Fatal编程技术网

javaandroid快速读取完整文件

javaandroid快速读取完整文件,java,android,performance,file,bufferedreader,Java,Android,Performance,File,Bufferedreader,我有以下代码片段将文本文件的全部内容读入字符串。它有效,唯一的问题是。。。它真的很慢(文件大约有1500行长) 目前,我正在一行一行地读取完整文件,然后将其附加到字符串中。有没有更快的方法?我正在寻找一种将整个文件转换成字符串的快速方法。我发现您似乎已经有了一个基于Kevin评论的有效解决方案,但了解您的旧代码速度缓慢的原因可能会有所帮助 问题是,当您直接使用+运算符或concat()方法连接字符串时,实际上是在使用连接结果创建新字符串。这涉及复制要连接的两个字符串的全部内容。因此,当您读入文件

我有以下代码片段将文本文件的全部内容读入字符串。它有效,唯一的问题是。。。它真的很慢(文件大约有1500行长)


目前,我正在一行一行地读取完整文件,然后将其附加到字符串中。有没有更快的方法?我正在寻找一种将整个文件转换成字符串的快速方法。

我发现您似乎已经有了一个基于Kevin评论的有效解决方案,但了解您的旧代码速度缓慢的原因可能会有所帮助

问题是,当您直接使用
+
运算符或
concat()
方法连接字符串时,实际上是在使用连接结果创建新字符串。这涉及复制要连接的两个字符串的全部内容。因此,当您读入文件并构建内容字符串时,每次向其中添加内容时,您都会创建到目前为止内容中所有内容的另一个副本

解决方案是使用StringBuffer类,这是一个动态缓冲区,允许您修改其内容(即在末尾追加新数据),而无需始终分配新的String对象并将所有内容复制到它,我假设您现在正在做的就是这样

您必须记住的主要一点是java中的字符串是不可变的。每当您对java字符串调用某个方法并以某种方式对其进行更改时,它实际上是在创建一个新的字符串副本,该副本带有修改的结果。

用于构建大型字符串

StringBuilder sb_rules = new StringBuilder();
StringBuilder sb_content = new StringBuilder();
while ((readLine = br.readLine()) != null)
{
    sb_rules.append(readLine);
    sb_rules.append(eol);
    if (previousLine.equals(""))
    {
        sb_content.append(readLine);
        sb_content.append(eol);
    }
    previousLine = readLine;
}
content = sb_rules.toString();
content = sb_content.toString();

字符串不允许追加。对字符串调用的每个方法都会创建一个新对象并返回它。这是因为字符串是不可变的-它不能更改其内部状态


假设ApacheCommons在Android上运行良好,您可以使用类似的东西吗

InputStream is = this.getResources().openRawResource(R.raw.comp_rules_glossary);
String text = IOUtils.toString(is, "UTF-8");
(或者你可以使用番石榴和它的CharStreams助手,但通常更详细)


除非您有理由不使用第三方LIB?

请看这只是开玩笑,请看我的解决方案。在这种情况下,最好只编写10行代码,而不包括库。代码非常简单,因此您可以避免将lib jar中的额外大小添加到apk中,从而使移动用户可以使用的代码尽可能小。
InputStream is = this.getResources().openRawResource(R.raw.comp_rules_glossary);
String text = IOUtils.toString(is, "UTF-8");