mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6mobile wallpaper 7mobile wallpaper 8mobile wallpaper 9mobile wallpaper 10
1692 字
4 分钟
从 scanf 到 Scanner,繁琐路线的切换
2026-03-22

Intro#

环境配好了,Hello,world 也跑通了,根据我以前的学习路线,该学怎么输入输出了。

我看到教程里的代码之后,我对 Java 的唯一感觉是:严谨,但是有点啰嗦。

底层逻辑#

好的是,程序的逻辑不用重新学,intchardouble 等等这些数据都不需要重新啃,还有if...else, for, while 等语句……在 Java 里面用法和 C 一模一样。大概可以复用我原来写的小小算法(x)。

但是,有一点我不太习惯。那就是if()里面不认if(1)这种写法。它的里面必须是bool类型,只能是true或者是false。比较死板,不过能让程序更加健壮,少很多Bug。

输入输出#

既然来了 Java,作为小镇做题家,不妨看看它的独特的输入输出。

致敬#

先说输出。我看的很多教程,输出一般用会让你直接System.out.println(),然后告诉你,插入变量直接用”+“链接:

int a=10, b=20;
System.out.println("a="+a+"b="+b);

对于习惯格式化的人来说,现在只接两个变量就已经很卡手了。万一卡输出格式,那就是究极卡手。

不过我折腾之后发现,Java 有一个致敬了 C 的元素:它原封不动地保留了 C 语言的 printf

不需要改变任何的习惯,不需要记新的规则,只需要复用之前学的就好:

int a=10,b=20;
System.out.printf("a=%d,b=%d\n",a,b);
//DNA动了
double p=3.1415926;
System.out.printf("p=%.2f\n",p);
//直接控制精度,真的顺手

在 IDEA 里,敲下 souf 按回车就能直接生成这个模板。在这个满是陌生长单词、动辄几十行起步的 Java 世界里,能看到 printf,就像一个人在异国他乡突然听到了熟悉的乡音,极度安心。

妥协#

输出可以用我之前学的,但是输入就是另外一个东西了。

在 C 语言里,输出两个整数非常简单,只需要scanf就可以了。

int a,b;
scanf("%d %d",&a,&b);

在 Java 里,没有这么简单的函数了。不仅寄了,Java 连指针都不让你碰。

为了从键盘中读取一个数,我得去造一个对象,让这个“对象”帮你扫描这个数。这个对象叫Scanner

这感觉就像什么呢?就像我平时折腾那些E5洋垃圾一样。你不能指望主板凭空去读取外面的信号,你得先买个外设插上去,再打上驱动,最后才能让它干活。

在 Java 里,这个“插外设”的过程极其充满仪式感(且啰嗦):

import java.util.Scanner; //先把别人写好的Scanner库拿过来
public class Main {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
//造一台名叫input的扫描机器,并把它插到系统的标准输入接口(System.in)上
int a=input.nextInt();
int b=input.nextInt();
//指挥这台机器,去帮我读取下一个整数
System.out.printf("读到了%d %d%n",a,b);
//输出
}
}

就为了读两个数字,居然要写这么多行代码。以前写 C 的时候,scanf 带着取地址符 & 直接把数据往内存里一塞,简单粗暴。现在手敲这句 Scanner input = new Scanner(System.in);,总感觉像是在打游戏放了一个极长的施法前摇,或者是在念什么冗长的召唤咒语。

在 Java 的世界观里,设定大概就是这样。你不能像 C 那样直接对系统底层进行“物理输出”。你想读取一个数字,就得老老实实召唤出一个名叫 Scanner 的使魔(也就是对象),把它绑定在系统的输入端,然后才能按部就班地给它下指令。

说实话,真的有点走流程的感觉。

不过仔细想想,以前敲 C 语言确实无拘无束,但要是手一抖指针飞了,或者数组稍微越点界,程序直接乱套了(一堆神秘错误)。Java 这种万物皆要“召唤对象”的强迫症设定,其实就是官方强行没收了你随便乱戳内存的权限,把那些容易擦枪走火的危险动作全给ban掉了。

实战#

既然输入输出已经勉强摸清楚了,换了新语言总得去试个刀。

直接上洛谷,搜索P1001

毫无悬念,代码跑通了。把下面这段新鲜出炉的 Java 代码丢进评测机:

import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int a=input.nextInt();
int b=input.nextInt();
System.out.printf("%d",a+b);
}
}

直接一把AC。

如果在以前用 C 语言,这段代码满打满算加上头文件也就最多 5 行代码。但在 Java 里,硬生生撑到了 7 行。各种 publicclassstatic 的前缀堆叠在一起,还有那个极其占地方的 Scanner 实例化,让一个最简单的 A+B 看起来像是个大工程。

但不管外壳怎么变重,底层终究还是那个经典的 A+B。

总结#

第一篇博客结尾的时候我说,代码的世界没有潜规则,能让人觉得平静。但今天被 Java 这一堆长长的输入输出代码折腾完,我好像稍微有点别的感觉了。

平时生活里,我其实是个连跟人打交道都要做很久心理建设的人。因为人际交往没有明确的提示,我总是害怕自己哪句话没说对,不小心就越了界。

以前写 C 语言的时候,确实很自由,但那种自由其实挺让人提心吊胆的。一个野指针,或者数组稍微一出界,程序连个招呼都不打直接就闪退崩溃了。那种半夜对着一团乱码不知所措的瞬间,真的很折磨神经。

Java 就不一样。它是真的啰嗦,连读个数字都要规规矩矩地先 new 一个 Scanner 出来。

但也正因为啰嗦,它把所有的底线和规矩都明明白白地摆在了台面上。它不让你乱碰内存,不让你省略步骤。虽然敲着麻烦,但只要你乖乖顺着它的规矩来,它就绝对不会突然给你甩脸子看,或者搞出什么莫名其妙的崩溃。

对于我这种总是患得患失、一点点突发状况就会缺乏安全感的人来说,这种笨拙但又死板的确定感,其实挺让人安心的。

在这个只属于我自己的小屏幕里,不需要去费心猜测别人的想法,只要安安静静地把代码敲对就行了。

今天就先写到这里吧。关掉 IDEA,明天还得继续去面对那些怎么看都看不懂的高数和线代。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

从 scanf 到 Scanner,繁琐路线的切换
https://neotetra.top/posts/从-scanf-到-scanner繁琐路线的切换/
作者
NeonSaya
发布于
2026-03-22
许可协议
MIT

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00