精华内容
下载资源
问答
  • 不多说,下面是一个比较好的、明晰的方法: 编写一个,它是按照包的层次编码的,如果此时想通过javac和java命令来编译运行,就需要如下来做: 1.编译 编译的指令是javac 编译方式:文件根目录 javac 文件名.java ...

    最近看《java编程思想》的时候,使用javac编译了一下带package的java文件,可惜运行失败了。

    不多说,下面是一个比较好的、明晰的方法:

    编写一个类,它是按照包的层次编码的,如果此时想通过javac和java命令来编译运行,就需要如下来做:

    1.编译

          编译的指令是javac

          编译方式:文件根目录 javac 文件名.java

    比如:一个文件名字:EchoClient.java

              文件路径:D:\workspace\MinaTest\com\dvn\li\suntest

              文件包名:com.dvn.li.suntest

    编译过程:

    cmd 回车

    D: 回车

    cd D:\workspace\MinaTest\com\dvn\li\suntest 回车

    javac EchoClient.java 回车      搞定!

    或者,可以通过javac –d . 文件名.java  来生成package目录。

    2. 运行

    运行时候需要注意了,不能文件的根目录,是到文件的包目录的上层目录——可以理解为工程目录下,然后运行,文件名前需要加上包名。

    运行过程:

    cmd 回车

    D: 回车

    cd D:\workspace\MinaTest回车

    java   com.dvn.li.suntest.EchoClient 回车      搞定!

    呵呵。。。。

    不过一般有包名的情况大部分是通过IDE开发的!

    参考:百度空间

    转载于:https://www.cnblogs.com/william-lee/archive/2010/07/27/1785703.html

    展开全文
  • 程序如何动态编译输入的代码并运行?! 如果对runtime.exec方法不了解建议先行阅读上篇文章。 好的,进入正题,我们先来看看Process在API中的解释: java.lang Process java.lang.Object java.lang....

    本篇文章是继我的上一篇文章java Runtime.exec方法详解!程序如何动态编译输入的代码并运行?!

    如果对runtime.exec方法不了解建议先行阅读上篇文章。

    好的,进入正题,我们先来看看Process类在API中的解释:

    java.lang
    类 Process

    java.lang.Object
      java.lang.Process
    

    public abstract class Process extends Object
    

    ProcessBuilder.start()Runtime.exec 方法创建一个本机进程,并返回 Process 子类的一个实例,该实例可用来控制进程并获得相关信息。Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法。

    创建进程的方法可能无法针对某些本机平台上的特定进程很好地工作,比如,本机窗口进程,守护进程,Microsoft Windows 上的 Win16/DOS 进程,或者 shell 脚本。创建的子进程没有自己的终端或控制台。它的所有标准 io(即 stdin、stdout 和 stderr)操作都将通过三个流 (getOutputStream()getInputStream()getErrorStream()) 重定向到父进程。父进程使用这些流来提供到子进程的输入和获得从子进程的输出。因为有些本机平台仅针对标准输入和输出流提供有限的缓冲区大小,如果读写子进程的输出流或输入流迅速出现失败,则可能导致子进程阻塞,甚至产生死锁。

    当没有 Process 对象的更多引用时,不是删掉子进程,而是继续异步执行子进程。

    对于带有 Process 对象的 Java 进程,没有必要异步或并发执行由 Process 对象表示的进程。

    需要我们注意的地方就是“因为有些本机平台仅针对标准输入和输出流提供有限的缓冲区大小,如果读写子进程的输出流或输入流迅速出现失败,则可能导致子进程阻塞,甚至产生死锁。”。这是一个可能出现的BUG,我们只需留意一下。

    以及“当没有 Process 对象的更多引用时,不是删掉子进程,而是继续异步执行子进程。”的意思,我大概理解为,即使在程序运行时已经没有变量引用Process的实例对象时,按java的gc机制,Process应该是被回收的,但是它不会,它会继续独立的运行下去,也就是说,如果我们Process对象已经使用完毕了,我们最好调用它的destroy方法去结束该子进程。

    ProcessBuilder.start()Runtime.exec 方法执行之后都会返回一个Process类的实例,它不代表上述方法创建的进程,但是可以用来操纵该进程。那么既然可以操纵进程,那肯定要调用方法,如下:

    abstract  void destroy()
              杀掉子进程。
    abstract  int exitValue()
              返回子进程的出口值。
    abstract  InputStream getErrorStream()
              获取子进程的错误流。
    abstract  InputStream getInputStream()
              获取子进程的输入流。
    abstract  OutputStream getOutputStream()
              获取子进程的输出流。
    abstract  int waitFor()
              导致当前线程等待,如有必要,一直要等到由该 Process 对象表示的进程已经终止。

    由于Process类是Object类的直接子类,所以除了Object的基础方法外,以上便是Process所有的全部方法。

    看本篇文章的标题大家也都清楚了,重点是如何对正在运行的程序输入数据,并获取输出的数据。在java,数据的传递,主要是以IO的数据流为主,还要JDK1.4中开始提供NIO,以数据块传输,这又是后话了。

    那么,如何获取Process的数据流呢,那便是要依靠getInputStreamgetOutputStream方法了,但是!需要注意的是:

    Input和Output都是针对当前调用Process的程序而言的,而不是针对Process!

    也就是说如果你要往Process进程中输入数据,那么你要调用Process的getOutputStream方法!

    相反,如果你要获取Process进程的输出数据,那么你要调用Process的getInputStream方法!

    在API中也说了,但是并不好理解:

    getOutputStream

    public abstract OutputStream getOutputStream()

    获取子进程的输出流。输出流被传送给由该 Process 对象表示的进程的标准输入流。

    实现注意事项:对输出流进行缓冲是一个好主意。

     

    返回:

    连接到子进程正常输入的输出流。


    getInputStream

    public abstract InputStream getInputStream()

    获取子进程的输入流。输入流获得由该 Process 对象表示的进程的标准输出流。

    实现注意事项:对输入流进行缓冲是一个好主意。

     

    返回:

    连接到子进程正常输出的输入流。

    另请参见:

    ProcessBuilder.redirectErrorStream()

    换成咋们人说的话,站在我们自己写的程序角度来想,如果我们的程序想要往别的程序输入数据,那么就是我们程序要输出对吧,所以我们需要获取输出流也就是调用getOutputStream方法,那么反过来,如果我们要获取别的程序的输出的数据,对于我们程序来说也就是输入的数据,所以我们要获取输入流,调用getInputStream方法。

    这是Process设计者的锅,不怪我们,但是我们也只有这样使用了。

    另外的几个方法也简单介绍一下吧:

    destroy:杀掉该Process对象代表的进程。

     

    exitValue:返回该Process对象代表的进程的出口值,值0表示正常退出,非0非正常。关于该方法,应该是返回System.exit(int)方法中的参数。

     

    waitFor:返回该Process对象代表的进程的出口值,值0表示正常退出,非0非正常。

    该方法很类似exitValue方法,但是他们有个取别很大的地方,那就是exitValue方法会直接返回一个值,但是当前程序有可能还在运行中,所以该值不一定是正确的,而本方法会一直等待Process对象代表的进程退出后才返回值,而且调用本方法的进程将会一直堵塞等待返回值。建议使用本方法!

     

    getErrorStream:与getInputStream的作用差不多,但略有些区别,在程序正常运行后输出的值是在getInputStream流中,但是如果程序出现错误后,输出的错误信息在getInputStream中是看不到的,因为错误信息在getErrorStream中!

    我认为本方法和getInputStream的不同与System.out.println()和System.err.println()是对应的。所以我们在获取Process对象代表的进程的输出时不能只调用getInputStream方法,也应该调用getErrorStream方法,把两个流结合在一起进行查看。这样得到的信息才是完整的。

    最后在来附上一个示例代码:

    import java.io.*;
    
    /**
     *
     * @author black
     */
    public class Test {
    
        public static void main(String[] args) throws IOException, InterruptedException {
    	Runtime rt = Runtime.getRuntime();//获得Runtime对象
    	String arr[] = {"CLASSPATH=D://","Path=C:\\Program Files\\Java\\jdk1.8.0_131\\bin"};//执行exec时的环境变量
            
            //exec方法第一个参数是执行的命令,第二个参数是环境变量,第三个参数是工作目录
    	Process pr = rt.exec("cmd /c javac a.java && java a", arr, new File("D://"));
            
            //获取输出流并转换成缓冲区
            BufferedWriter bout = new BufferedWriter(new OutputStreamWriter(pr.getOutputStream()));
            bout.write("1 2");//输出数据
            bout.close();//关闭流
            
            //SequenceInputStream是一个串联流,能够把两个流结合起来,通过该对象就可以将
            //getInputStream方法和getErrorStream方法获取到的流一起进行查看了,当然也可以单独操作
    	SequenceInputStream sis = new SequenceInputStream(pr.getInputStream(), pr.getErrorStream());
    	InputStreamReader inst = new InputStreamReader(sis, "GBK");//设置编码格式并转换为输入流
    	BufferedReader br = new BufferedReader(inst);//输入流缓冲区
    
    	String res = null;
    	StringBuilder sb = new StringBuilder();
    	while ((res = br.readLine()) != null) {//循环读取缓冲区中的数据
    	    sb.append(res+"\n");
    	}
    	br.close();
    	pr.waitFor();
    	pr.destroy();
    	System.out.print(sb);//输出获取的数据
        }
    }
    

    完毕撒花~~

    有问题可以在评论区问我,随缘上线,看到回复~~

     

     

    展开全文
  • Editplus中直接运行有package包名称的Java类注:以下方法均建立在事先配置了JDK环境变量基础上才有效如何配置JDK环境变量请参照其它文章(网上多得很!!!!)在edipluse中配置Java程序编译运行的命令可以根据...

    Editplus

    中直接运行有

    package

    包名称的

    Java

    注:以下方法均建立在事先配置好了JDK的环境变量基础上才有效

    如何配置JDK环境变量请参照其它文章(网上多得很!!!!)

    在edipluse中配置Java程序编译与运行的命令可以根据实际情况分为两种类型:

    一:源程序中未指定类所在的包名(使用Java默认的包)

    其方法为:

    1,选择edipluse中的工具-》点击首选项-》点击自定义工具出现如下界面:

    blog_15ec6fdc60102wdnh.html

    2:点击上图的“添加工具”按钮-》在“菜单文本”中输入你自定义的工具名称-》在“命令”行中输入命令javac(不可自定义,必须这样输)-》点击“参数”选项后面的“下拉箭头”-》点击“文件名”-》软件便会自动在“参数”文本框中添加“$(FileName)”这样的内容,如下所示:

    blog_15ec6fdc60102wdnh.html

    Editplus

    中直接运行有

    package

    包名称的

    Java

    首先安装并配置好

    Java

    的运行环境,安装好

    Edit

    首先安装并配置好

    Java

    的运行环境,安装好

    Edit

    3:点击“起始目录”后面的下拉箭头-》选择“文件目录”-》软件便会自动在“起始目录”文本框中添加“$(FileDir)”这样的内容。

    4:点击“动作”选项的下拉箭头-》选择捕获控制台输出-》点击最下面的“应用”按钮。

    blog_15ec6fdc60102wdnh.html

    至此,Java程序的”编译命令“便配置完了。随后配置”运行命令“。所需步骤同上,就不用图片详细介绍了,

    具体如下:

    1:点击“添加工具”按钮-》在“菜单文本”中输入你自定义的工具名称-》在“命令”行中输入命令java(不可自定义,必须这样输)-》点击“参数”选项后面的“下拉箭头”-》点击“文件名(不含拓展名)”-》软件便会自动在“参数”文本框中添加“$(FileNameNoExt)”这样的内容。

    2:点击“起始目录”后面的下拉箭头-》选择“文件目录”-》软件便会自动在“起始目录”文本框中添加“$(FileDir)”这样的内容。

    4:点击“动作”选项的下拉箭头-》选择捕获控制台输出-》点击最下面的“应用”按钮-》点击“确定”按钮。

    至此,上面的第一种情况(源程序中未指定类所在的包名)所需要配置的工具便完成了,编写完程序并保存后,按快捷键Ctrl+1,便会执行javac编译命令,生成

    .class文件,按Ctrl+2,便会执行java运行命令,解释 .class文件。

    二:源程序中用package指定了包名

    添加新的

    编译工具 将“参数”栏先手动输入“-d .”然后按下拉箭头选择“文件名”,参数文本框出现“-d .

    $(FileName)”这样的内容,注意“-”是在英文状态下输入的,且不是下划符号(不能同时按shift),“.”的前后均有空格隔开。其余操作同上面的第一种情况。

    添加新的

    运行工具 将“参数”栏 的下拉箭头选择“当前选择内容”-》文本框中便会自动加载$(CurSe)这个内容-》然后手动输入一个“.”-》然后再在下拉箭头中选择“文件名(不含拓展名)”-》此时文本框中的内容便是“$(CurSel).$(FileNameNoExt)”。-》其余配置同第一种情况。最后点击确定即可。

    注:按以上的顺序添加工具的话,此时第二种情况编译工具的快捷键为Ctrl+3,运行工具的快捷键为Ctrl+4

    PS:第二种情况要运行程序前,必须人为在窗口中选中包名如下图,然后再按ctrl+4,否则会报错。

    blog_15ec6fdc60102wdnh.html

    展开全文
  • 初学Java如何快速编译运行打包

    千次阅读 2018-05-10 11:07:28
    初学Java如何快速编译运行打包1.我们写好Java文件后,就面临编译打包问题。那么如何快速编译打包呢?2.在计算机中找到我们的java文件,直接在地址栏输入cmd。3.输入后回车,你就会发现,cmd命令处理程序直接将...
    初学Java如何快速编译运行打包

    1.我们写好Java文件后,就面临的是编译打包的问题。那么如何快速编译打包呢?

    2.在计算机中找到我们的java文件,直接在地址栏输入cmd。


    3.输入后回车,你就会发现,cmd命令处理程序直接将路径定位到了我们java文件所在的目录。


    4.现在,你只用输入javac 文件名就能编译了。

    5.那么如何快速编译多个文件呢?

    6.写一个包含主函数的类,这个类里面包含其他的需要编译的类,直接编译这个包含主函数的类。你就会发现生成了多个.class文件

    展开全文
  • 前言:开发时候基本都是在window上开发,但是代码中有时会因为操作系统不同...在初学java的时候,老师教过通过javac编译,在通过java运行。我想我可不可以在linux上也这么操作呢。一起来测试下。一、操作带有p...
  • 如何用Editplus编译运行Java

    千次阅读 2016-03-06 12:56:20
    java命令行编译执行java代码熟悉人应该是很多吧 每次简单测试,调试api都要打开IDE等上半天很麻烦 使用EditPlus来编译执行java类是不是很方便 下面就来介绍下如何配置吧 工具/原料 EduitPlus jdk 1.8...
  • java和javac编译运行java程序

    千次阅读 2015-08-06 20:59:42
    参考链接前言给自己定了一个月学习JVM虚拟机的计划,不管有没有卵用,学点新东西总是好的。但是在学习过程中,我想在命令行测试一些JVM参数的时候,发现自己脱离了IDE,竟然无法直接编译java程序!!我的原则不能抱怨...
  • 编译时与运行时Compilation就像让工程师审查建筑师建筑计划,然后写出更详细规格.尚无建筑物.现在我们已经准备进行建造,但是直到“运行时”施工人员到达现场才真正建造任何东西.在这个比喻中,您source code是...
  • 如何用eclipse来编译运行Java程序?

    千次阅读 2020-07-11 10:55:40
    1.进入eclipse>>File>>new>>java project 2.设置名称,点击finish保存 3.右击你所创文件,新建一个包(Package),输入包名点击finish。...到这一个Java程序就编译运行完了。 ...
  • :”.java”代码后,会通过编译器将代码编译成.class后缀字节码文件Java是平台无关,实现语言无关性基础就是虚拟机和字节码存储格式只要编译器按照虚拟机规范,编译成对应class文件,这个class文件就能够...
  • 前言:开发时候基本都是在window上开发,但是代码中有时会因为操作系统不同...在初学java的时候,老师教过通过javac编译,在通过java运行。我想我可不可以在linux上也这么操作呢。一起来测试下。 一、操作带...
  • :”.java”代码后,会通过编译器将代码编译成.class后缀字节码文件 Java是平台无关,实现语言无关性基础就是虚拟机和字节码存储格式 只要编译器按照虚拟机规范,编译成对应class文件,这个class文件就...
  • 徐无忌深入JVM虚拟机笔记:Java代码到底是如何运行起来? 完成:第一遍 1.Java代码到底是如何运行起来? Demo.java编写源文件 打包成:Jar包即Demo.class 通过Java-jar运行即是Java系统,把类名放入,执行main...
  • 我还遇到了在它们自己的接口中定义的常量——在接口中,使用常量的类必须实现接口。这种策略通常被称为接口常量设计模式。在本文中,我们将了解在Java中存储常量的两种最常见的策略:整数和枚举。首先也是最重要的,...
  • 这里要说是我们通过文本编辑器写一个“a.java”文件以后,是如何被虚拟机编译为字节码,以及字节码格式。不过先说一下关于java特性问题。一般语言,都是直接编译为本地机器语言,所以一段代码为了运行...
  • 前言:开发时候基本都是在window上开发,但是代码中有时会因为操作系统不同...在初学java的时候,老师教过通过javac编译,在通过java运行。我想我可不可以在linux上也这么操作呢。一起来测试下。一、操作带有p...
  • 前言:开发时候基本都是在window上开发,但是代码中有时会因为操作系统不同...在初学java的时候,老师教过通过javac编译,在通过java运行。我想我可不可以在linux上也这么操作呢。一起来测试下。一、操作带有p...
  • 以下内容来自维基百科,关于静态类型检查和动态类型检查的解释:静态类型检查:...以下代码是一个例子,理解了他,你会更好的理解Java静态类型检查是如何工作的。代码示例假定我们有如下,A和B,B继承A。class A...
  • Java 代码到底是如何运行的呢?看下图理解 Java 代码如何运行:概括一下:程序员小张编写好的 Java 源代码文件经过 Java 编译器编译成字节码文件后,通过加载器加载到内存中...
  • 今天碰到群里小伙伴问,线上程序好像有多个不同版本的Netty包,怎么去看到底加载了哪...java.lang.NoClassDefFoundError:编译时候是好的,但是运行的时候,因为加载的jar版本问题,没有这个java.lang.ClassNotFo
  • 我是java新手。我负责编写Java程序来运行命令行。我在DOS提示符下测试了命令行,因为我还没有访问Linux...即使它编译没有错误,但是当我运行它只显示光标闪烁...我想我需要使用线程异步技术。请提供一些建议,因...
  • 看下图理解 Java 代码如何运行:概括一下:程序员小张编写好的 Java 源代码文件经过 Java 编译器编译成字节码文件后,通过加载器加载到内存中,才能被实例化,然后到 Java 虚拟机中解释执行,最后通过操作系统操作...
  • **现在项目中需要实现,与 [fenby网](http://www.fenby.com/index "") 中的“闪电编程”相同的功能,目前在线编辑器已经实现,但是不知道如何才能把编辑好的JAVA或C之的代码编译运行,并显示出结果,坐等高人...
  • 用eclipse编译好的一个Java项目导出成为一个可以直接双击运行的jar文件。 1.在需要导出的项目上右键->导出,在弹出的界面中找Java下的JAR文件,然后点击下一步,选择将JAR文件导出到什么位置(假如名字Project.jar...
  • (一)终端中如何运行一个java程序(这个是我在mac下运行,windows下原理是一样,大同小异) 做这个事情前提下,一定是jdk已经安装了并且没任何问题。 首先要想运行java类,应先有个java类 1.创建个名为...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 334
精华内容 133
关键字:

java编译好的类如何运行

java 订阅