我已经从.txt文件中读取了以下内容:
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*" to-ports="*" />
</cross-domain-policy>
但是在阅读并输出后,我得到了:
null<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*" to-ports="*" />
</cross-domain-policy>
开头为null,这是方法:
public class Filer {
private static String str;
public static String read(String file) {
BufferedReader br = null;
try {
String sCurrentLine;
br = new BufferedReader(new FileReader(file));
while ((sCurrentLine = br.readLine()) != null) {
str += sCurrentLine;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)br.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
return str;
}
}
返回的字符串由其输出 System.out.println
我尝试按str.indexOf("null");
或检查该字符串,str.indexOf("\0");
但得到-1
有想法该怎么解决这个吗?
考虑循环的第一次迭代。的值str
是空的,价值sCurrentLine
就是"<?xml version="1.0"?>"
。
在字符串连接中,空引用将转换为字符串“空”。例如:
String x = null;
String y = "a";
String z = x + y; // "nulla"
因此,在您的第一次迭代中,当您执行时:
str += sCurrentLine;
的价值str
将是"null<?xml version="1.0"?>"
您 可以将其 初始化str
为""
…但我不会。
无论如何,没有理由为什么它应该是静态变量-即使再次调用该方法,您是否真的想保持旧值不变?那将是非常奇怪的。它应该是一个 局部 变量。
另外,您不应该在这样的循环中使用字符串连接-在性能方面太糟糕了,因为它需要不断复制旧数据。请StringBuilder
改用。
我也不会捕获这样的异常-您是否真的希望呼叫者不知道发生任何错误?只需声明您的方法可以抛出IOException
。
此外,我不会用FileReader
自己的语言-它使您无法控制用于读取文件的编码-
它将始终使用平台默认编码,这可能是不合适的。我会用一个FileInputStream
包装在InputStreamReader
。然后,您可以使用try- with-resources
Java 7中的语句来FileInputStream
自动关闭。
因此,经过所有这些更改,您的代码将变成这样:
public static String read(String file) throws IOException {
StringBuilder builder = new StringBuilder();
try (InputStream input = new FileInputStream(file)) {
BufferedReader reader = new BufferedReader(
new InputStreamReader(input, "UTF-8"));
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
}
return builder.toString();
}
请注意,这会将多行文件转换为 单行 文本-
builder.append("\n")
如果您要保留行数(请不要在意行分隔符),请在循环中使用或类似的方法。如果要保留确切的行尾,请不要使用readLine
-只需将字符读入缓冲区即可。
另外,考虑使用第三方库(例如Guava)来代替所有这些操作-
例如,您可以使用Files.toString()
。
我必须写一个程序: 提示用户输入输入文件的名称, 从输入文件中读取数据,并将有关汽车的信息存储在汽车对象数组列表中, 将数组列表中未排序的数据打印到屏幕上,如下所示: 我想不出前三步该怎么做。 我也有两个类,与这个项目,并将添加他们,如果需要/需要。因此,基本上只需要帮助了解如何从用户那里读取文本文件,将文本文件的内容添加到ArrayList中,并以格式化的方式打印出ArrayList的内容(我的
我的项目中有这样一段代码: 没有错误,应用程序运行正常,但是变量中从来没有任何文本,我确信txt文件中有文本! 我已经尝试过不同的方法来读取文本文件(使用BufferedReader、Scanner、FileInputStream和FileReader),但都不起作用。 另外,我几乎可以肯定问题不在变量中,因为我尝试通过代码(使用运行时)打开文件,它正常打开了正确的文件。 好的,我尝试添加,但是仍
问题内容: 我正在尝试在Android Studio的res \ raw文件中保留一个.txt文件,并读取/解析该文件。我在“ res”目录(未创建)中创建的名为“ raw”的文件夹中有一个文件“ my_file.txt”。 我认为我的主要问题是:创建File对象(与Scanner对象一起使用)时,应该为文本文件传递什么路径? 这是我的代码: 问题答案: 认为您正在寻找符合以下条件的东西 其中ct
问题内容: 我有一个类QuoteBank,需要使用扫描仪读取txt文件,但是它 给了我一个文件未找到异常 Java文件位于app / src / main / java / nate.marxBros / QuoteBank.java中 txt文件位于app / src / main / assets / Quotes.txt 该代码是 应该像其他任何Java程序一样工作吗?但是它给文件 找不到异
问题内容: 我可以用来从图像(JPEG,PNG)文件中提取文本的最佳开源Java库是什么? 问题答案: 有GOCR和tesseract,但我不确定它们的当前版本如何堆叠-尝试同时尝试您需要处理的一些典型输入并通过此试验进行选择吗?
问题内容: 我有一个文本文件。我想从一行到另一行检索内容。例如,文件可以是200K行。我想从第78行到第2735行读取内容。由于文件可能很大,所以我不想将整个内容读取到内存中。 问题答案: 这是一个可能的解决方案的开始: