用如何,这些 JAVA 程序的生命周期都是这样的: *编程人员在一定的操作系统上选择一个合适的编辑软件来实现源程序代码并以.java 扩展名保存在操作系统 中,例如我们在中文 win2k 中用记事本编辑一个 java 源程序; *编程人员用 JDK 中的 javac.exe 来编译这些
源代码,形成.class 类(JSP 文件是由容器调用 JDK 来编译的); *直接运行这些类或将这些类布署到 WEB 容器中去运行,并输出结果。 那么,在这些过程中,JDK 和 JVM 是如何将这些文件如何编码和解码并运行的呢?
这里,我们以中文 win2k 操作系统为例说明 JAVA 类是如何来编码和被解码的。 第一步,我们在中文 win2k 中用编辑软件如记事本编写一个 Java 源程序文件(包括以上五类 JAVA 程序),程 序文件在保存时默认采用了操作系统默认支持 GBK 编码格式(操作系统默认支持的格式为 file.encoding 格式)形成 了一个.java 文件, 也即, java 程序在被编译前, 我们的 JAVA 源程序文件是采用操作系统默认支持的 file.encoding 编码格式保存的,java 源程序中含有中文信息字符和英文程序代码;要查看
系统的 file.encoding 参数,可以用以 下代码: public class ShowSystemDefaultEncoding { public static void main(String[] args) { String encoding = System.getProperty("file.encoding"); System.out.println(encoding); }} 第二步,我们用 JDK 的 javac.exe 文件编译我们的 Java 源程序,由于 JDK 是国际版的,在编译的时候, 如果我们没有用-encoding 参数指定我们的 JAV
A 源程序的编码格式,则 javac.exe 首先获得我们操作系统默认采 用的编码格式,也即在编译 java 程序时,若我们不指定源
程序文件的编码格式,JDK 首先获得操作系统的 file.encoding 参数(它保存的就是操作系统默认的编码格式,如 WIN2k,它的值为 GBK),然后 JDK 就把我们的 java 源程序从 file.encoding 编码格式转化为 JAVA 内部默认的 UNICODE 格式放入内存中。然后,javac 把转换后 的 unicode 格式的文件进行编译成.class 类文件,此时.class 文件是 UNICODE 编码的,它暂放在内存中,紧接着, JDK 将此以 UNICODE 编码的编译后的 class 文件保存到我们的操作系统中形成我们见到的.class 文件。 对我们来 说,我们最终获得的.class 文件是内容以 UNICODE 编码格式保存的类文件,它内部包含我们源程序中的中文字 符串,只不过此时它己经由 file.encoding 格式转化为 UNICODE 格式了。 这一步中,对于 JSP 源程序文件是不同的,对于 JSP,这个过程是这样的:即 WEB 容器调用 JSP 编译 器,JSP 编译器先查看
JSP 文件中是否设置有文件编码格式,如果 JSP 文件中没有设置 JSP 文件的编码格式,则 JSP 编译器调用 JDK 先把 JSP 文件用 JVM 默认的字符编码格式(也即 WEB 容器所在的操作系统的默认的 file.encoding)转化为临时的 Servlet 类,然后再把它编译成 UNICODE 格式的 class 类,并保存在临时文件夹中。 如:在中文 win2k 上,WEB 容器就把 JSP 文件从 GBK 编码格式转化为 UNICODE 格式,然后编译成临时保存的 Servlet 类,以响应用户的请求。 第三步,运行第二步编译出来的类,分为三种情况: A、 B、 C、 D、 直接在 console 上运行的类 EJB 类和不可以直接运行的支持类(如 JavaBean 类) JSP 代码和 Servlet 类 JAVA 程序和数据库之间
下面我们分这四种情况来看。 A、直接在 console 上运行的类 这种情况, 运行该类首先需要 JVM 支持, 即操作系统中必须安装有 JRE。 运行过程是这样的: 首先 java 启动 JVM,此时 JVM 读出操作系统中保存的 class 文件并把内容读入内存中,此时内存中为 UNICODE 格式的 class 类,然后 JVM 运行它,如果此时此类需要接收用户输入,则类会默认用 file.encoding 编码格式对用户输入 的串进行编码并转化为 unicode 保存入内存(用户可以设置输入流的编码格式) 。程序运行后