Java 个文件上的 Dos2unix

Dos2unix on Java files

如果 dos2unix 命令在 Java 源文件被编译之前 运行,是否有任何影响或反响? Java 文件将从 Linux 中的 CVS 存储库下载,然后通过 Ant 脚本编译为 jar。谢谢

没有。它所做的只是处理行尾。

实际测试

首先,我创建了一个带有 Linux 行结尾的测试文件,名为 Main.java,不出所料 Linux 此编译。

0x63 [ c]  0x6c [ l]  0x61 [ a]  0x73 [ s]  0x73 [ s]  
0x20 [  ]  0x4d [ M]  0x61 [ a]  0x69 [ i]  0x6e [ n]  
0x20 [  ]  0x7b [ {]  0x0a [\n]  0x7d [ }]  0x0a [\n]  
0x0a [\n]

转换为 DOS 结尾得到了这个:

0x63 [ c]  0x6c [ l]  0x61 [ a]  0x73 [ s]  0x73 [ s]  
0x20 [  ]  0x4d [ M]  0x61 [ a]  0x69 [ i]  0x6e [ n]  
0x20 [  ]  0x7b [ {]  0x0d [\r]  0x0a [\n]  0x7d [ }]  
0x0d [\r]  0x0a [\n]  0x0d [\r]  0x0a [\n]

仍然编译,转换回来给出:

0x63 [ c]  0x6c [ l]  0x61 [ a]  0x73 [ s]  0x73 [ s]  
0x20 [  ]  0x4d [ M]  0x61 [ a]  0x69 [ i]  0x6e [ n]  
0x20 [  ]  0x7b [ {]  0x0a [\n]  0x7d [ }]  0x0a [\n]  
0x0a [\n]

和之前一样

行尾

Windows (dos) 和 Linux / Mac (unix) 行尾之间的区别在于,在 unix 上行尾是 \n 而行以dos结尾的是\r\n.

结果

  • 因为 unix2dos / dos2unix 只改变行尾,它不改变内容
  • 至少在 Linux,javac 可以成功编译任何一行结束的源文件。

甚至不需要对此进行测试(理论上):在 Java 语言中,换行符没有任何语义意义。因此存在是无关紧要的(对编译器而言)。

因此,人类 reader 认为查看具有 个换行符的源代码或在它们所在的任何地方都有换行符 是非常不愉快的git - 对于编译器,如前所述:没关系。

因此,像 dos2unix 这样的工具不应该对源代码进行任何可能产生 "semantical" 差异的更改。

当然:真正的答案是:不要花时间担心换行符。投资于将整个系统从 1999 年转移到 2018 年(例如,将 CVS 替换为 git,将 Ant 替换为 maven/gradle)。