【问题标题】:Java: How to save CR when rewrite file?Java:重写文件时如何保存CR?
【发布时间】:2015-04-12 03:08:07
【问题描述】:

我尝试用更改重写文件。对于这个任务,我使用下一个代码:

FileReader reader = new FileReader(file);
BufferedReader br = new BufferedReader(reader);
String line;
StringBuilder builder = new StringBuilder();
while((line = br.readLine()) != null) {
    builder.append(line);
}
builder.delete(0, 3);
FileWriter writer = new FileWriter(file);
writer.write(builder.toString());
writer.flush();
writer.close();

但我的代码删除了所有 CR(行尾)符号,我得到了

bbb ccc

而不是

bbb ccc 如何让 Java 跳过删除 CR 符号?

【问题讨论】:

  • this br.readLine() 读取一行,没有 LF 的 CR。因此,当您将连续调用的结果连接到br.readLine() 时,您会失去这些迹象。这是一个文件。您可以一次阅读所有内容,请参阅stackoverflow.com/questions/14169661/…(因为无论如何您都将整个文件放入内存中)

标签: java


【解决方案1】:

不使用br.readline(),它似乎读取一行并删除尾随换行符,或者在将其添加到字符串生成器之前将其重新插入。

编辑:这里是BufferedReader.readLine()'s documentation,它清楚地表明它会删除你的尾随换行符。

【讨论】:

    【解决方案2】:

    当您附加新行时,也附加\n

    while((line = br.readLine()) != null) {
        builder.append(line);
        builder.append("\n");
    }
    

    独立于平台的换行符

    builder.append(System.getProperty("line.separator"));
    

    另请参阅:

    【讨论】:

      【解决方案3】:

      我建议这个解决方案

          byte[] bytes = Files.readAllBytes(Paths.get(file));
          try (FileOutputStream out = new FileOutputStream(file)) {
              out.write(bytes, 3, bytes.length - 3);
          }
      

      【讨论】:

        【解决方案4】:

        如其他答案中所述,您不应将 readLine 用于此文件复制操作以保留换行符和回车符。
        但除了处理小文件外,我也不建议将整个文件内容保存在缓冲区中(byte[]、StringBuilder、...)。

        这是一个简单的例子,展示了如何通过跳过一些前导字节来按字节复制文件(就像你的例子一样)。根据您想要做的进一步操作,您可以扩大字节缓冲区以满足您的需要,但您应该检查读取字节数。

        public class FileCopyTest {
        
            public static void main(String[] args) throws IOException {
                copyFile(3,"c:/file.txt","c:/fileCopy.txt");
            }
        
        
            public static void copyFile(int skipFirst, String src, String dst) throws IOException {
                int toSkip = skipFirst;
                try (FileInputStream fileIn = new FileInputStream(src); 
                     FileOutputStream fileOut = new FileOutputStream(dst)) {
                    byte read[] = new byte[1];
                    while (-1 < fileIn.read(read, 0, 1)) {
                        if(toSkip > 0 ) {
                            toSkip--;
                            continue;
                        }
                        fileOut.write(read,0,1);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多