Android 以字符串形式读取文件

Android 以字符串形式读取文件,android,string,optimization,Android,String,Optimization,我需要在android中以字符串形式加载一个xml文件,以便将其加载到TBXML解析器库并对其进行解析。现在,即使对于一些KBs的非常小的xml文件,将文件作为字符串读取的实现也需要大约2秒钟。在Java/Android中,有没有已知的快速方法可以将文件读取为字符串 这是我现在拥有的代码: public static String readFileAsString(String filePath) { String result = ""; File file = new Fi

我需要在android中以字符串形式加载一个xml文件,以便将其加载到TBXML解析器库并对其进行解析。现在,即使对于一些KBs的非常小的xml文件,将文件作为字符串读取的实现也需要大约2秒钟。在Java/Android中,有没有已知的快速方法可以将文件读取为字符串


这是我现在拥有的代码:

public static String readFileAsString(String filePath) {
    String result = "";
    File file = new File(filePath);
    if ( file.exists() ) {
        //byte[] buffer = new byte[(int) new File(filePath).length()];
        FileInputStream fis = null;
        try {
            //f = new BufferedInputStream(new FileInputStream(filePath));
            //f.read(buffer);

            fis = new FileInputStream(file);
            char current;
            while (fis.available() > 0) {
                current = (char) fis.read();
                result = result + String.valueOf(current);
            }
        } catch (Exception e) {
            Log.d("TourGuide", e.toString());
        } finally {
            if (fis != null)
                try {
                    fis.close();
                } catch (IOException ignored) {
            }
        }
        //result = new String(buffer);
    }
    return result;
}

最终使用的代码如下所示:

http://www.java2s.com/Code/Java/File-Input-Output/ConvertInputStreamtoString.htm

public static String convertStreamToString(InputStream is) throws Exception {
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();
    String line = null;
    while ((line = reader.readLine()) != null) {
      sb.append(line).append("\n");
    }
    reader.close();
    return sb.toString();
}

public static String getStringFromFile (String filePath) throws Exception {
    File fl = new File(filePath);
    FileInputStream fin = new FileInputStream(fl);
    String ret = convertStreamToString(fin);
    //Make sure you close all streams.
    fin.close();        
    return ret;
}

您可以使用
org.apache.commons.io.IOUtils.toString(InputStream是,Charset chs)
来实现这一点

e、 g

对于Maven回购协议,请参见->

有关直接jar下载的信息,请参见->

这对我有用

i use this path

String FILENAME_PATH =  "/mnt/sdcard/Download/Version";

public static String getStringFromFile (String filePath) throws Exception {
    File fl = new File(filePath);
    FileInputStream fin = new FileInputStream(fl);
    String ret = convertStreamToString(fin);
    //Make sure you close all streams.
    fin.close();        
    return ret;

}

对于文件,我们预先知道大小,所以只需一次阅读所有文件

String result;
File file = ...;

long length = file.length();
if (length < 1 || length > Integer.MAX_VALUE) {
    result = "";
    Log.w(TAG, "File is empty or huge: " + file);
} else {
    try (FileReader in = new FileReader(file)) {
        char[] content = new char[(int)length];

        int numRead = in.read(content);
        if (numRead != length) {
            Log.e(TAG, "Incomplete read of " + file + ". Read chars " + numRead + " of " + length);
        }
        result = new String(content, 0, numRead);
    }
    catch (Exception ex) {
        Log.e(TAG, "Failure reading " + this.file, ex);
        result = "";
    }
}
字符串结果;
文件=。。。;
long length=file.length();
if(长度<1 | |长度>整数最大值){
结果=”;
Log.w(标记“文件为空或巨大:”+文件);
}否则{

try(FileReader in=newfilereader(文件)){ 字符[]内容=新字符[(int)长度]; int numRead=in.read(内容); 如果(numRead!=长度){ Log.e(标记“+文件+”的不完全读取。读取“+长度”的字符“+numRead+”; } 结果=新字符串(内容,0,numRead); } 捕获(例外情况除外){ Log.e(标记“读取失败”+此文件,例如); 结果=”; } }
重新处理了源自->

@JaredRummler对你的评论的回答是:


这不会在字符串末尾添加一个额外的新行吗

为了防止在末尾添加换行符,您可以在第一个循环中使用一个布尔值集,就像您在代码示例中所做的那样
Boolean firstLine

public static String convertStreamToString(InputStream is) throws IOException {
   // http://www.java2s.com/Code/Java/File-Input-Output/ConvertInputStreamtoString.htm
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();
    String line = null;
    Boolean firstLine = true;
    while ((line = reader.readLine()) != null) {
        if(firstLine){
            sb.append(line);
            firstLine = false;
        } else {
            sb.append("\n").append(line);
        }
    }
    reader.close();
    return sb.toString();
}

public static String getStringFromFile (String filePath) throws IOException {
    File fl = new File(filePath);
    FileInputStream fin = new FileInputStream(fl);
    String ret = convertStreamToString(fin);
    //Make sure you close all streams.
    fin.close();
    return ret;
}

如果您使用Kotlin,这非常简单:

val textFile = File(cacheDir, "/text_file.txt")
val allText = textFile.readText()
println(allText)
readText()
文档:

使用UTF-8或以字符串形式获取此文件的整个内容 指定的字符集。不建议在大型文件上使用此方法。信息技术 具有2 GB文件大小的内部限制



选中此选项取决于当前读取文件的方式。发布你的代码以便有人能帮助你。我现在没有代码。我以后再发。但在此之前,任何建议都是受欢迎的:)Panos,我不知道如何解析XML文件,但请尝试在每行添加一个StringBuffer对象,而不是添加到字符串中。StringBuffer更快。请检查我正在使用的代码并给出建议。我看到这里有字符串连接。我会改变的。还有其他建议吗?我觉得你的第一个fn关闭了一个没有打开的流是不对的。换句话说,我认为getStringFromFile应该关闭流。@Tom实际上,这个答案中的重要部分是显示循环中发生的事情并创建字符串。无论如何,您是对的,关闭getStringFromFile中的流更好,所以我编辑了答案。谢谢。这不会在字符串的末尾增加一行吗?@Jaredrummer是的,会的。另外,它将始终将文件的行尾修改为“\n”,这可能不是您想要的。同样,用java做一些事情比它需要的要难。在Android中使用
Uri
更安全。文件路径可能有效,也可能无效。什么是
convertStreamToString
?不知道为什么会被否决。当然,代码是杂乱无章的,但这是可行的(如果他没有足够的内存为一个大文件分配缓冲区,那么使用StringBuffer的示例也是如此)。它也不会增加一个额外的新行,这是投票最多的答案所做的。numRead和length末尾的比较将字符与字节进行比较。当读取整个文件时,可能会出现这些不相等的情况。FileReader in=new FileReader(file)requires api level 19方法已被弃用,只需将Charset->
公共静态字符串添加到字符串(InputStream输入,Charset编码)
请参见->commons.apache.org/proper/commons io/apidocs/org/apache/commons/io/IOUtils.html#toString(java.io.InputStream,java.nio.charset.charset)可能现在是,在撰写此答案时不是。如果你不介意,我可以用你评论中的信息更新答案。或者你可以写你自己的答案:)我不介意,如果我这样做了也没关系,IMHO,你应该更新答案以保持它的相关性,就像我一样。我确实写了我自己的答案,其中包含用于获取资产的来源…尽管对于给定的问题,我相信你的答案简洁明了,这是最好的…你能澄清什么是“资源ID”吗?我在/main下创建了一个名为/assets的目录,并在那里有一个sampleText.txt文件。如何将该文件称为输入?请帮助。这仍然会将行尾修改为“\n”。这似乎不是一个简单的方法。他没有使用科特林。问题是关于Java的。@StealthRabbi在问题中,op询问如何在Java/Android中做到这一点。当时Java是Android的主要语言,所以现在发布Kotlin版本是有意义的。另外,问题标签只包括Android,我认为这是更重要的。对,他没有使用Java标签,因为这是假设的,考虑到问题的年龄。这就好比我在1870年问你如何在城市间快速旅行,而你在100年后告诉我乘飞机。@StealthRabbi对于一个在100年后阅读上述假设问题的人来说,乘飞机是公认的正确答案。我在19世纪写了最初的问题。我们以前有一些很好的解决方案。但这也是一个非常好的可接受的解决方案,因此我们可以看到JVMAPI和解决方案的发展
public static String convertStreamToString(InputStream is) throws IOException {
   // http://www.java2s.com/Code/Java/File-Input-Output/ConvertInputStreamtoString.htm
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();
    String line = null;
    Boolean firstLine = true;
    while ((line = reader.readLine()) != null) {
        if(firstLine){
            sb.append(line);
            firstLine = false;
        } else {
            sb.append("\n").append(line);
        }
    }
    reader.close();
    return sb.toString();
}

public static String getStringFromFile (String filePath) throws IOException {
    File fl = new File(filePath);
    FileInputStream fin = new FileInputStream(fl);
    String ret = convertStreamToString(fin);
    //Make sure you close all streams.
    fin.close();
    return ret;
}
val textFile = File(cacheDir, "/text_file.txt")
val allText = textFile.readText()
println(allText)
public static String readFileToString(String filePath) {
    InputStream in = Test.class.getResourceAsStream(filePath);//filePath="/com/myproject/Sample.xml"
    try {
        return IOUtils.toString(in, StandardCharsets.UTF_8);
    } catch (IOException e) {
        logger.error("Failed to read the xml : ", e);
    }
    return null;
}