关于使用Java中 read函数遇到idea中enter键的问题

本文详细探讨了换行符( )的历史及其在不同操作系统中的表现,包括Unix、Windows和Mac系统下的差异。并通过Java示例代码展示了如何处理用户输入中的换行问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前置知识

换行符号(\r\n)的历史 - 小林野夫 - 博客园
\r\n与\n是有区别的。 如果要通用的则是\r\n,因为有些编辑器它不认\n

“回车”(carriage return)和“换行”(line feed)这两个概念的来历和区别: 在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。

于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。

这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。

后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。

Unix系统里,每行结尾只有“<换行>”,即“\n”;

Windows系统里面,每行结尾是“<换行><回车>”,即“\n\r”;然后下面的情况却不是这样

控制台应用程序 换行\n

Mac系统里,每行结尾是“<回车>”,即\r。

一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。

c语言编程时(windows系统)\r 就是return 回到 本行 行首 这就会把这一行以前的输出 覆盖掉 如: int main() { cout << “hahaha” << “\r” << “xixi” ; } 最后只显示 xixi 而 hahaha 被覆盖了 \n 是回车+换行 把光标 先移到 行首 然后换到下一行 也就是 下一行的行首拉 int main() { cout << “hahaha” << “\n” << “xixi” ; } 则 显示 hahaha xixi \r\n是输出的HTML代码换行,客户看到的效果没有换行。 则相反 效果: 我是内容\r\n我是内容

我是内容 我是内容

================================================== \r 表示:回车符(ACSII:13 或0x0d),就是我们常说的硬回车。 \n 表示:换行(ACSII:10 或0x0a),就是我们常说的软回车。

在页面里这两个是看不到效果的.右键查看源文件可以看到代码换行

================================================== 如果是输出给浏览器,就用 如果是输出到自己的文件里,就用"\n",windows下是"\r\n"

================================================== \n,好比你在DreamWeaver里做一个网页,在源代码里按一下回车,是给源代码换行。 是输出一个(HTML标记性语言),在HTML中解释为输入的字换行。 \n的作用是给源代码换行,输入后,查看HTML源代码,就看会到有换行,而HTML解释器(浏览器)认为它是没用的东西,用不用都一样显示。

问题探究

import java.io.*;

public class Accept {
    public static void main(String[] args) {
        int c = 0;
        String s = "";
        System.out.println("输入摄氏度:(0<数值<100)");
        try {
            while (c != 10) {
                
                c = System.in.read();//idea里按下enter只有\n,没有\r,eclipse里是\r\n其他的也是,应该是idea的特性吧
                //System.out.println(c);
                s += String.valueOf((char) c);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        int celsius = Integer.parseInt(s.trim());//trim()去掉头尾空白字符,也能去除一些转义字符如:\n,\t;
        double f = 1.8 * celsius + 32;
        System.out.println("转化成华氏度为: " + f);

问题的出现及分析

遇到的问题是也就是enter键的问题,刚刚上面提到

Windows系统里面,每行结尾是“<换行><回车>”,即“\n\r”;然后下面的情况却不是这样

也是说,当你按下Enter键的时候,会输入“\n\r”
先读入
\n,然后是\r,对应这1013(对应的ASCII码),然后我遇到的问题就是Enter键按下的时候只有\n,却没有\r,调试了半天,找了各种资料,才发现是idea编译器的问题,这里感谢这个人文章,读了他的文章之后,试了试Eclipse,发现Enter符合上述描述,没有问题,看来就是idea的问题。

代码讲解

首先,这个代码的所用是把摄氏度转换成华氏度。
然后要求是用read()函数来读取,所以写的有点麻烦。
这里讲一下代码中的函数的用法:
1.read()和read(byte[] b):
这两个方法在抽象类InputStream中都是作为抽象方法存在的
JDK API中是这样描述两者的:
read() : 从输入流中读取数据的下一个字节,返回0到255范围内的int字节值。如果因为已经到达流末尾而没有可用的字节,则返回-1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。

read(byte[] b) : 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。在输入数据可用、检测到文件末尾或者抛出异常前,此方法一直阻塞。

如果 b 的长度为 0,则不读取任何字节并返回 0;否则,尝试读取至少一个字节。如果因为流位于文件末尾而没有可用的字节,则返回值 -1;否则,至少读取一个字节并将其存储在 b 中。

将读取的第一个字节存储在元素 b[0] 中,下一个存储在 b[1] 中,依次类推。读取的字节数最多等于b 的长度。设 k 为实际读取的字节数;这些字节将存储在 b[0] 到 b[k-1] 的元素中,不影响 b[k] 到b[b.length-1] 的元素。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值