你真的会输出“hello world“吗?

1.梦开始的地方--"hello world"

当你的孩子见到这个世界的第一眼说的不是"hello world"时,他已经输在了起跑线上。


我们不管在学习什么编程语言,老师总会第一步教我们输出一个"hello world!"

在这里我们同样也复习一下java是如何输出"hello world"的:

System.out.println("hello f***king world!!!");

2.hello world的底层逻辑

下面,我们来学习一下,计算机是如何正确生成一个"hello world"的:

我们在此处打一个断点,进入我们debug模式,并且我们不断地往底层深入。

我们输出时调用的System的成员out是一个PrintStream的实例化对象(PrintStream继承了FilterOutputStream.是"装饰类"的一种,所以属于字节流体系中,为其他的输出流添加功能.使它们能够方便打印各种数据值的表示形式)。然后,他将我们的hello world传入了writeln方法中,writeln方法是PrintStream的特有方法。此时我们的"hello world"进入writeln方法,让我们继续往下走。 

来到writeln方法中:来到这个方法时,我们第一眼会发现这个方法内部有一个同步锁,这个锁的目的就是为了防止java在多线程的情况下,防止其他线程的字符串进入这个方法内部从而造成数据混乱的情况。我们的第一行会执行一个ensureOpen()方法(这个方法的大体意思是看一下你的资源管理器是否打开,以防止你的文件受到损坏,如果没有打开,他会给你抛出一个异常)。

让我们继续往下走进入我门的write方法。这里我们可以看到,此方法内有三个参数,第一个使我们传入的hello world,第二个是0,第三个是我们的字符串的长度。让我们继续向下走。

 此时我们可以看到这个地方是与点复杂的,首先他依然有一个锁和一个ensureOpen()方法。当我们再往下看时:

  •  他首先定义了一个变量b和t,将我们的off=0赋值给了b,然后又将off加上我们的字符串的长度len。
  • while内,他会取 我们一次性写入的最长的长度 和 t-b 的 最小值,当最小值使我们字符串的长度时,他会让b加上我们的这个最小长度,然后结束循环。
  • 当我们的最小值是一次性可以写入的最大长度时,直接写入最大长度,这是我们在江上写入长度的时候,发现循环条件仍然是城里的,指导b<t为止。               

2.那我们输出一个hello world到此就结束了吗?

答案肯定是没有的,我们经过这么多层的反复调用,最终的目的还是将我们的参数传入write的方法中去。接下来我们就要深入到java的jdk内幕去一探究竟。

为了不麻烦,我直接让gpt帮我搞了一份c语言的源代码,为什么要用c语言来编写呢,当jdk需要与操作系统进行交互的时候,我们通过c语言调用时更加方便的。

对于FileOutputStream来说,在调用write方法时,会首先使用fopen函数打开要写入的文件,并将文件指针保存在一个私有成员变量中。然后,在调用write方法时,实际上是调用了底层的C++实现,该实现会将要写入的字节数组数据通过fwrite函数写入到文件指针对应的文件中,最后通过fflush函数将数据刷新到磁盘上。


3.下面来到最最最底层

我们的计算机在工作时,程序要想向磁盘中写入数据,就要先要被缓存的内存中,随后通过磁盘缓存机制,将我们的数据写入到磁盘区域。在磁盘写操作完成之后,操作系统会将数据从磁盘缓存中删除,并通知程序数据写入操作已经完成。

对于java而言,当数据写入完成之后,Java I/O库会调用fflush函数将数据从缓存中刷新到磁盘中,确保数据已经被写入磁盘。


4.总结

虽然我们牵扯到了这么多的方法调用以及源代码但hello world的实现远不止如此,我们省略了大部分的jdk源代码以及liunx的Gilbc中的方法。

无论怎么样,我们的电脑都在做一件非常重要的事,就是让我们的数据在写入到硬件时正确、高效、可靠并遵守I/O的规范

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值