java处理换⾏符_Java⽂件换⾏符识别与转换
项⽬经验,如需转载,请注明作者:Yuloran (t/EGU6c76)
背景
项⽬开发需要⼿动合⼊⼏⼗种语⾔的翻译到 l 中,这是⼀件⾮常痛苦的事情:Copy、Paste,Copy、Paste,Copy、⼈都快疯了!被逼⽆奈写了个⾃动替换翻译的⼯具,原理很简单:解析 Excel中的翻译,替换到 Xml 中。Excel 解析⽤ jxl.jar,Xml 解析与修改⽤ DOM,⼀顿操作,⼀天就写完了!正⾼兴呢,赶紧使⽤ git diff 查看修改对⽐,⼀看坏事了:“坑爹呢!这特么根本不能⽤好嘛!原⽂件的每⼀⾏都被识别成了新⾏(因为换⾏符变了),这代码还怎么审核?⿁知道你改了什么!” 所以,本⽂记录如何使⽤ Java 识别与转换⽂件换⾏符。
⽂件换⾏符分类
Intellij>File>Line Separators:
查看 ASCII 码表:
\r(CR (carriage return)):⼗六进制为 0x0D
\n(LF (NL line feed, new line)):⼗六进制为 0x0A
Windows 换⾏符:\r\n,回车键+换⾏键;
Linux 换⾏符:\n,换⾏键;
Mac 换⾏符:\r,回车键。
没有换⾏符:⽂件的最后⼀⾏可以没有换⾏符
识别⽂件符
按⾏读取⽂件,然后再分别读出接下来的两个字节,判断其 int 值:
package com.yuloran.util;
import java.io.EOFException;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
public final class LineSeparatorHelper{
public enum LINE_SEPARATOR {
WINDOWS, LINUX, MAC, UNKNOWN
}
private LineSeparatorHelper(){
}
public static LINE_SEPARATOR getLineSeparator(File f) throws IllegalArgumentException{
if (f == null || !f.isFile() || !f.exists()) {
throw new IllegalArgumentException("file must exists!");
}
RandomAccessFile raf = null;
try {
raf = new RandomAccessFile(f, "r");
String line = adLine();
if (line == null) {
return LINE_SEPARATOR.UNKNOWN;
}
// 必须执⾏这⼀步,因为 RandomAccessFile 的 readLine() 会⾃动忽略并跳过换⾏符,所以需要先回退⽂件指针位置// "ISO-8859-1" 为 RandomAccessFile 使⽤的字符集,此处必须指定,否则中⽂ length 获取不对
raf.Bytes("ISO-8859-1").length);
byte nextByte = adByte();
if (nextByte == 0x0A) {
return LINE_SEPARATOR.LINUX;
}
if (nextByte != 0x0D) {
return LINE_SEPARATOR.UNKNOWN;
}
try {
nextByte = adByte();
if (nextByte == 0x0A) {
return LINE_SEPARATOR.WINDOWS;unknown怎么处理
}
return LINE_SEPARATOR.MAC;
} catch (EOFException e) {
return LINE_SEPARATOR.MAC;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (raf != null) {
try {
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return LINE_SEPARATOR.UNKNOWN;
}
}
复制代码
使⽤ Intellij 创建⼀个 Java ⼯程,编写⼀个控制台应⽤,测试以上代码:
package com.yuloran;
import com.yuloran.util.LineSeparatorHelper;
import java.io.File;
public class Main{
public static void main(String[] args){
File f = new File("");
System.out.println("line separator: " + LineSeparator(f).name()); }
}
复制代码
< 的换⾏符通过 File>Line Separators 进⾏切换,换⾏符符号可⽤ Notepad 查看,⽐如Windows 换⾏符为:
Notepad 显⽰所有符号⽅法:
测试结果:
转换⽂件换⾏符
读出新⽂件换⾏符,若与原⽂件换⾏符不⼀致,则新建⼀临时⽂件,逐⾏写⼊原⽂件内容,并在⾏尾写⼊原⽂件换⾏符,然后删除原⽂件,重命名临时⽂件:
// 此处省略 LineSeparatorHelper 类其他代码...
@SuppressWarnings("ResultOfMethodCallIgnored")
public static boolean convert(LINE_SEPARATOR oldLs, File f, String charset){
if (oldLs == null || oldLs == LINE_SEPARATOR.UNKNOWN) {
return false;
}
if (f == null || !f.isFile() || !f.exists()) {
return false;
}
if (charset == null || charset.isEmpty()) {
charset = "UTF-8";
}
LINE_SEPARATOR newLs = getLineSeparator(f);
if (newLs == oldLs) {
return false;
}
File temp = new Parent(), "");
if (ists()) {
temp.delete();
}
BufferedReader br = null;
BufferedWriter bw = null;
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream(f), charset));
bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(temp), charset)); String line;
int lineNumber = 0;
while ((line = br.readLine()) != null) {
if (lineNumber != 0) {
switch (oldLs) {
case WINDOWS:
bw.append('\r').append('\n');
break;
case LINUX:
bw.append('\n');
break;
case MAC:
bw.append('\r');
break;
default:
}
}
bw.write(line);
++lineNumber;
}
return true;
} catch (IOException e) {
e.printStackTrace();

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。