如何在保持换行符的同时将 .txt 文件读入单个 Java 字符串?
Posted
技术标签:
【中文标题】如何在保持换行符的同时将 .txt 文件读入单个 Java 字符串?【英文标题】:How can I read a .txt file into a single Java string while maintaining line breaks? 【发布时间】:2011-09-01 20:10:44 【问题描述】:几乎每个代码示例都会逐行读取 TXT 文件并将其存储在字符串数组中。 我不想要逐行处理,因为我认为这对我的要求来说是不必要的资源浪费:我要做的就是快速有效地将 .txt 内容转储到单个字符串中。下面的方法可以完成这项工作,但是有一个缺点:
private static String readFileAsString(String filePath) throws java.io.IOException
byte[] buffer = new byte[(int) new File(filePath).length()];
BufferedInputStream f = null;
try
f = new BufferedInputStream(new FileInputStream(filePath));
f.read(buffer);
if (f != null) try f.close(); catch (IOException ignored)
catch (IOException ignored) System.out.println("File not found or invalid path.");
return new String(buffer);
... 缺点是换行符被转换为长空格,例如“ ”。
我希望将换行符从 \n 或 \r 转换为 (html 标记)。
提前谢谢你。
【问题讨论】:
我尝试添加此方法以将文本文件中的换行符转换为 HTML 标签,但它不起作用: string.replaceAll("(\r\n|\n)", ""); 逐行处理与转储整个文件一样有效(如果不是更有效),然后返回并用<br/>
标签替换换行符
真的,遍历每一行的循环同样有效吗?有趣..那我可能会去。谢谢!
@slashline - 文件中字符数据的编码是什么?
是从哪里来的?它可能正在剥离您要在这里处理的 \r 和 \n。
【参考方案1】:
如何使用扫描仪并自己添加换行符:
sc = new java.util.Scanner ("sample.txt")
while (sc.hasNext ())
buf.append (sc.nextLine ());
buf.append ("<br />");
我看不出你的长空格是从哪里来的。
【讨论】:
这仍然是逐行处理,但有人说这并不比直接将.txt文件转储为基本String慢。所以我可能会逐行处理,但这会带来一个问题:Scanner 还是 BufferedReader 哪个更快? 如果您没有感觉到差异,也许它没有那么大?对于典型的 html 页面大小,我不希望有相关的差异。有很多可能的影响(硬盘速度、硬盘缓存、操作系统、文件大小、Java 版本,...),您应该在靠近目标系统并具有类似输入的系统上进行测量。 这不是假设文件中的最后一行也应该附加一个换行符吗?在某些情况下这可能很危险。 @Michael.M:没有。你测试过吗?哪个系统?【参考方案2】:你可以直接读入缓冲区,然后从缓冲区中创建一个字符串:
File f = new File(filePath);
FileInputStream fin = new FileInputStream(f);
byte[] buffer = new byte[(int) f.length()];
new DataInputStream(fin).readFully(buffer);
fin.close();
String s = new String(buffer, "UTF-8");
【讨论】:
【参考方案3】:您可以添加以下代码:
return new String(buffer).replaceAll("(\r\n|\r|\n|\n\r)", "<br>");
这是你要找的吗?
【讨论】:
那行不通。我认为问题在于buffer变量是byte,所以它没有\r\n。而不是 \r\n 它有空格..这使得正确插入 . 变得更加困难【参考方案4】:代码将读取文件中出现的文件内容 - 包括换行符。 如果要将中断更改为其他内容,例如在 html 中显示等,则需要对其进行后期处理或通过逐行读取文件来完成。由于您不想要后者,因此您可以按照 which 应该进行转换来替换您的退货 -
return (new String(buffer)).replaceAll("\r[\n]?", "<br>");
【讨论】:
这也没用。我认为问题在于 buffer 变量是 byte,所以 \r\n 可能被剥离了。而不是 \r\n 它有空格..这使得正确插入 . 变得更加困难 \r 和 \n 分别是 ascii 10 和 13。我不同意他们不能适应字节。无论如何都要尝试替换 - 我看不出它为什么不起作用,否则你需要检查你的源文件,如果它有任何这些字符。或者尝试使用记事本等创建的任何其他文本文件的代码。如果您看到任何更改,您需要告诉我们您使用的是哪种文本文件。【参考方案5】:StringBuilder sb = new StringBuilder();
try
InputStream is = getAssets().open("myfile.txt");
byte[] bytes = new byte[1024];
int numRead = 0;
try
while((numRead = is.read(bytes)) != -1)
sb.append(new String(bytes, 0, numRead));
catch(IOException e)
is.close();
catch(IOException e)
您的结果 String
: String result = sb.toString();
然后在 result
中替换您想要的任何内容。
【讨论】:
【参考方案6】:我同意@Sanket Patel 的一般方法,但使用 Commons I/O 您可能需要File Utils。
所以你的代码看起来像:
String myString = FileUtils.readFileToString(new File(filePath));
还有另一个版本可以指定替代字符编码。
【讨论】:
【参考方案7】:您应该尝试 org.apache.commons.io.IOUtils.toString(InputStream is) 将文件内容作为字符串获取。在那里你可以传递你将从中获得的 InputStream 对象
getAssets().open("xml2json.txt") *<<- belongs to android, which returns InputStream*
在您的活动中。要获取字符串,请使用:
String xml = IOUtils.toString((getAssets().open("xml2json.txt")));
所以,
String xml = IOUtils.toString(*pass_your_InputStream_object_here*);
【讨论】:
getAssets
不是 Android 特有的吗?
@demongolem 是的。但是 IOUtils 类是 java 的,它的方法 toString 将作为解决方案。我同意,我需要具体说明ans。谢谢提醒。以上是关于如何在保持换行符的同时将 .txt 文件读入单个 Java 字符串?的主要内容,如果未能解决你的问题,请参考以下文章
现在需要将一个txt文件里的数据读入到MATLAB,第一例为x,第二例为y,并需要保持小数位数不变