2

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

4

3 回答 3

2

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

因此,人类读者会发现查看具有换行符的源代码非常不愉快,或者在任何合法的地方都有换行符 - 对于编译器来说,正如所说的:没关系。

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

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

于 2018-03-06T18:09:15.760 回答
0

不,它所做的只是处理行尾。

于 2018-03-06T17:45:16.787 回答
0

实际测试

首先,我创建了一个带有 Linux 行结尾的测试文件,名为Main.java.

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 可以编译任何一行都成功结束的源文件。
于 2018-03-06T17:50:08.783 回答