【问题标题】:Keep new lines when reading in a file读取文件时保留新行
【发布时间】:2017-03-13 16:49:32
【问题描述】:

我正在尝试读取文件并修改文本,但这样做时我需要保留新行。例如,如果我要读取包含以下内容的文件:

这是一些文字。

还有一些文字。

它只是读作

这是一些文字。这是一些文字。

如何保留该空间?我认为这与 /n 转义字符有关。我见过使用 BufferReader 和 FileReader,但我们还没有在课堂上学习过,那么还有其他方法吗?我尝试过的是这样的:

if (ch == 10)
{
   ch = '\n';
   fileOut.print(ch);
}

10 是换行的 ASCII 表代码,所以我认为 Java 可以识别它,但事实并非如此。

【问题讨论】:

  • 转义字符以反斜杠开头,而不是正斜杠:它是\n,而不是/n
  • 代码在哪里?
  • 如果ch == 10 那么ch = '\n'(你说的是10)?将ch 分配给它已经是什么没有多大意义。文件是用什么操作系统编写的,Windows 使用\r\n。就像@weston 所说,请包含minimal reproducible example,以便我们了解发生了什么。
  • *检查 @BackSlash 是否是寻找 BackSlash-ForwardSlash 错误的机器人

标签: java


【解决方案1】:

在 Java 8 中:

您可以使用以下方法读取行:

List<String> yourFileLines = Files.readAllLines(Paths.get("your_file"));

然后收集字符串:

String collect = yourFileLines.stream().filter(StringUtils::isNotBlank).collect(Collectors.joining(" "));

【讨论】:

  • 这会将所有行加载到内存中。使用直接创建流的Files::lines 方法要好得多。另外,OP 说他们还没有学过BufferedReader,所以应该假设他们也没有学过 Java 8 流。
【解决方案2】:

问题是您(可能)想一次读取文件一行,然后想一次将其写回一行(保持空行)。

下面的源代码会这样做,它一次读取输入文件一行,然后一次写回一行(保持空行)。

唯一的问题是...它可能会更改新行,也许您正在读取一个 unix 文件并写入一个 dos 文件,反之亦然,具体取决于您运行的系统和文件的源类型阅读。

保留原始换行符会带来很多复杂性,请阅读 BufferedReader 和 PrintWriter api 文档了解更多信息。

public void process(File input , File output){
    try(InputStream in = new FileInputStream(input);
            OutputStream out = new FileOutputStream(output)){
        BufferedReader reader = new BufferedReader(new InputStreamReader(in, "utf-8"),true);
        PrintWriter writer = new PrintWriter( new OutputStreamWriter(out,"utf-8"));
        String line=null;
        while((line=reader.readLine())!=null){
            String processed = proces(line);
            writer.println(processed);
        }

    } catch (IOException e) {
        // Some exception management
    }
}
public String proces(String line){
    return line;
}

【讨论】:

    【解决方案3】:

    /n 应该是\n

    if (ch == 10)
    {
       ch = '\n';
       fileOut.print(ch);
    }
    

    【讨论】:

      【解决方案4】:

      这是笔误吗?

      ch = '/n';
      

      否则使用

      ch = '\n';
      

      【讨论】:

      • 这是一个错字,我的错。无论如何它都不起作用
      • 好的,您是否尝试使用 ch == '\n' 进行比较
      猜你喜欢
      • 2020-06-29
      • 1970-01-01
      • 1970-01-01
      • 2020-07-02
      • 1970-01-01
      • 2022-01-03
      • 2015-03-30
      • 1970-01-01
      • 2016-05-21
      相关资源
      最近更新 更多