Android 以字符串形式读取文件
我需要在android中以字符串形式加载一个xml文件,以便将其加载到TBXML解析器库并对其进行解析。现在,即使对于一些KBs的非常小的xml文件,将文件作为字符串读取的实现也需要大约2秒钟。在Java/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
这是我现在拥有的代码:
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
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;
}