前言
#这是一个小问题,可能突然遇到会感觉比较抽象
问题发现
FileInputStream fis = new FileInputStream("src/hello/out.md");
int a;
while ((a = fis.read()) != -1){
System.out.print((char) a );
}
fis.close();
这是out.md中的文件内容
这是一个简单的字节流的java程序,在windows系统中运行此代码,会得到理想的情况,输出
md文件中的所有内容,并且换行成功,但是在macos下,可能打印出md的最后一行:
关于换行
这个问题其实是由于不同计算机系统的换行符不一致导致的
在Java编译环境中,回车(CR)的ASCII码值是13(\r)。换行(LF)的ASCII码值是10(\n)
然而
- windows的换行为 \r\n (二者在一起)
相当于先回车(回到行首)再换行(换到下一行)
- mac为 \r
- linux为 \n 这两个单独符号就实现实际意义的回车
在程序中的体现
- 在mac中
FileInputStream fis = new FileInputStream("src/hello/out.md"); int a; while ((a = fis.read()) != -1){ System.out.println(a); } fis.close();
a 为读取的单个字符,不对它进行char强转,并换行输出,查看ASCll码
-
只有一个 \r
- 在windows中
会存在13 和 10
总结
windows系统下,读取文本文档,在换行处\r\n在java环境中可以实现换行
但是在macos下,换行处读到 mac的换行"\r",但是这个操作在java中只实现了回退,回到行首。
所以每次输出下一行内容时,光标回退到了本行的最前面,并没有向下换行,所以把上一行给覆盖了,因此输出只剩下了最后一行
下面也许是一个mac下可能的解决方案
fis = new FileReader("src/hello/out.md");
while ((result = fis.read()) != -1){
if (result == 13){
System.out.println();
continue;
}
else{
System.out.print((char)result);
}
}
一般人估计也不会使用这个方法读取数据吧。。。。