如何在保持换行符的同时将 .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,并需要保持小数位数不变

Sqlplus可以将文件内容读入变量吗?

我应该使用哪个函数将非结构化文本文件读入 R? [关闭]

使用 Perl,如何在保持参照完整性的同时从单个表加载多个表?

BufferedReader:将多行读入单个字符串

如何从Java中的文件中删除换行符?