Java按字节字符读取文本文档在不同操作系统中有关换行的问题

前言

#这是一个小问题,可能突然遇到会感觉比较抽象

问题发现

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);
    }
 }

一般人估计也不会使用这个方法读取数据吧。。。。

  • 14
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想在旧琴房弹不能说的秘密

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值