为什么用txt打开.class文件会乱码,而打开.java文件却不会乱码?

计算机的文件分为字符文件和字节文件

首先需要说明的是:计算机的文件类型分为两类:字符文件和字节(二进制)文件。最常用的字符文件如.txt文件。它直接存储着人可以识别的文字。(汉语,英语,符号等)

但是计算机将所有的数据都视为0或1,它本身并不识别这些字符,那就需要把这些字符转换成字节格式,这个过程为编码。反过来,将字节按照一定规则翻译成字符的过程称之为解码。(下文也许还会称反编码,反编译,解码)

而计算机中大部分的文件:诸如电影,音乐,图像等文件无法用简单的字符文件格式保存。因此这些文件都是字节文件保存的,而多媒体处理软件会用avi, mp3, mp4, jpeg等编码格式规定了应该如何浏览它们。如何编码,就应当如何解码,这才能还原文件内容。

.java文件属于和.txt同类型的字符文件。因此程序员只需像写文章一样构建代码即可,避免了用复杂的01代码来编写程序。(想想都害怕)

我们编写的是字符而非字节

javac承担了编译的任务,将其转换成了.class文件。显然.class文件是给JVM”读”的,而程序员早就在编写.java文件的时候就设定了这个程序的功能,因此他现在只要将.class文件交给JVM运行就可以了。

我很好奇.class文件里写了哪些内容!

但是若直接打开.class文件,那么结果会令人失望:里面大部分的内容都是乱码。为什么会这样?正如之前所述:怎么将它编译的,就应当怎么将它解码。可是电脑并不知道javac是如何编译它的。(大部分人也不知道,但是至少JVM知道)

电脑:我太难了

因此若直接以txt文本的形式将.class字节文件打开,计算机只好按它认为正确的方式去解码,但很显然它解码地并不对。

正确的编码 vs 错误的编码

所以如果你想一窥.class文件的真面目:不妨去试试一些软件,它们如果知道javac是何种方式编译的,就可以“反其道行之”,将其反编译。Jd-gui.exe就是一个这样的反编译器:它能精准翻译绝大部分的内容,同时也提供将.class文件反向输出为.java文件的功能。

这起码要比乱码看着舒服多了~

附上一个传送门:
[1]java反编译原理浅析

猜你喜欢

转载自juejin.im/post/5e6627a46fb9a07c9205405d
今日推荐