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()
得到结果时,这些符号就会丢失。这是一个文件。您可以一次读取所有文件,请参见(因为您将整个文件放入内存中)