Java:重写文件时如何保存CR?

Java:重写文件时如何保存CR?,java,Java,我尝试用更改重写文件。对于此任务,我使用下一个代码: 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

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

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符号?

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


编辑:这里是,它清楚地表明它删除了尾随换行符。

当您追加新行时,还应追加
\n

while((line = br.readLine()) != null) {
    builder.append(line);
    builder.append("\n");
}
独立于平台的新线将是

builder.append(System.getProperty("line.separator"));
另请参见:


    • 我建议采用这种解决方案

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

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

      下面是一个简单的示例,演示如何通过跳过一些前导字节来按字节复制文件(如您的示例中所示)。根据您想要进行的进一步操作,您可以放大bytebuffer以满足您的需要,但是您应该检查读取字节的计数。

      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();
              }
          }
      }
      
      公共类FileCopyTest{
      公共静态void main(字符串[]args)引发IOException{
      copyFile(3,“c:/file.txt”,“c:/fileCopy.txt”);
      }
      公共静态void copyFile(int skipFirst、String src、String dst)引发IOException{
      int-toSkip=skipFirst;
      try(FileInputStream fileIn=newfileinputstream(src);
      FileOutputStream fileOut=新的FileOutputStream(dst)){
      字节读取[]=新字节[1];
      而(-10){
      托斯基--;
      继续;
      }
      写(读,0,1);
      }
      }捕获(例外e){
      e、 printStackTrace();
      }
      }
      }
      
      br.readLine()
      读取一行,不带左前的CR。因此,当连续调用
      br.readLine()
      得到结果时,这些符号就会丢失。这是一个文件。您可以一次读取所有文件,请参见(因为您将整个文件放入内存中)