java程序 java编程用什么软件
今天给各位分享java程序的知识,其中也会对java编程用什么软件进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
什么是JAVA程序
分类:电脑/网络>>程序设计>>其他编程语言
问题描述:
手机也用得着这个程序吗?
解析:
Java手机软件平台采用的基本Java平台是CLDC(Connected Limited Device Configuration)和MIDP(Mobile Information Device Profile),是J2ME(Java 2 Micro Edition)的一部分,在中国一般称为“无线Java”技术。此前,有人把它叫做“K-Java”;其实,K-Java的叫法只是Sun公司在开发 KVM Java虚拟机时的项目代号,在该技术被正式命名为KVM后,就不再用K-Java了。
Java技术的开放性、安全性和庞大的社会已有资源,以及其跨平台性,即“编写一次,到处运行”的特点,使Java技术成为智能手机软件平台的事实标准。
Java,是一种可以编写跨平台应用软件的面向对象的程序设计语言,由升阳(太阳微电子,Sun Microsystems)公司的James Gosling等人于1990年代初开发
参考资料:zh.***/wiki/Java
Java好象随处可见-甚至在TV中。尽管如此,说清楚Java是什
么和它能做什么却不那么容易。刚开始接触Java的人通常有三
个问题:
什么是Java?
Java能做什么?
Java怎样改变我的生活?
让我们先回答第一个问题:什么是Java?
Java既是一种编程语言,又是一个平台。
Java程序语言
Java是具有以下特征的高级程序语言:
*简单
*面向对象
*可分布
*可解释
*强壮
*安全性
*结构化
*轻便
*功能强大
*多线程
*动态
Java既可以被编译,也可以被解释。通过编译器,可以把Java
程序翻译成一种中间代码-称为字节码-可以被Java解释器
解释的独立于平台的代码。通过解释器,每条Java字节指令被
分析,然后在计算机上运行。只需编译一次,程序运行时解释
执行。下图说明了它是如何工作的:
1flow.gif(3652 bytes)
可以把Java字节码看作运行在Java虚拟机(Java VM)上的机器
代码指令。每中Java解释器,不管是Java开发工具还是可以运
行Java小应用程序的Web浏览器,都是一种Java VM的实例。Java
VM也可以由硬件实现。
Java字节码使“写一次,到处运行”成为可能。可以在任何有
Java编译器的平台上把Java程序编译成字节码。这个字节码可以
运行在任何Java VM上。例如,同一个Java程序可以运行在Windows
NT、Solaris和Macintosh上。
2p.gif(6076 bytes)
Java平台
平台是程序运行的硬件或软件环境。Java平台与大多数其它平台
不同之处在于它是运行于其它基于硬件平台的纯软件平台。大
多数其它平台是硬件和操作系统的结合。
Java平台由两部分组成:
* Java虚拟机(Java VM)
* Java应用程序界面(Java API)
我们已经介绍了Java VM,它是Java平台的基础,可以移植到各
种基于硬件的平台上。
Java API是软件组件的***,它们提供了很多有用的功能,如图
形用户界面(GUI)。Java API被分组为相关组件的库(包)。
下图描述了一个运行在Java平台上的Java程序,如应用程
序(application)或小应用程序(applet)。如图中显示的,Java
API和VM把Java程序从硬件依赖中分离出来。
3play.gif(1479 bytes)
作为一种独立于平台的环境,Java比本地代码慢一些。然而,聪
明的编译器、很好地调制过的解释器和即时字节码编译器可以
在不牺牲可移植性的条件下使Java的表现接近本地代码。
java程序是什么
Java是一门编程语言,是一门连接人与计算机的语言。
由于计算机只认识二进制(只有0和1)的信息,对于我们来说,二进制的信息与我们平时所说的话比较起来就太难懂了,所以为了能够很好的和电脑交流,就产生了各种各样的计算机编程语言,其中就包括Java。
Java之所以可以让计算机识别,是因为Java的编译器和Java虚拟机,它会将人按照一定规范写成的信息翻译成机器所能识别二进制的信息,这样就可以让我们很好的和计算机进行交流了,而这种规范我们称之为Java语言。
Java是一种面向对象的语言,所谓的面向对象指的是Java编程中,所有的操作都是以对象进行操作的,这样在我们编程的时候,可以将某个功能当成一个类,可以给这类东西设置自己的属性。
由于计算机高级语言种类很多(C/C++、JAVA、Python、C#等等),不同的语言所侧重的领域不相同,Java所侧重的范围是互联网行业企业级应用开发。
像我们经常使用的购物平台、一些公司的管理平台等,大部分都是使用Java来开发的。而且我们现在所使用的安卓手机的系统和APP,也都是用Java语言来开发的。
近些年来,Java在编程语言排行榜上一直位列前三,而且Java的使用人数非常多,市面上对Java开发工程师的需求量也很大。
如何在Java中执行其它程序
在编写Java程序时,有时候需要在Java程序中执行另外一个程序。
1、启动程序Java提供了两种方法用来启动其它程序:
(1)使用Runtime的exec()方法
(2)使用ProcessBuilder的start()方法
不管在哪种操作系统下,程序具有基本类似的一些属性。一个程序启动后就程序操作系统的一个进程,进程在执行的时候有自己的环境变量、有自己的工作目录。Runtime和ProcessBuilder提供了不同的方式来启动程序,设置启动参数、环境变量和工作目录。
能够在Java中执行的外部程序,必须是一个实际存在的可执行文件,对于shell下的内嵌命令是不能直接执行的。
采用Runtime的exec执行程序时,首先要使用Runtime的静态方法得到一个Runtime,然后调用Runtime的exec方
法。可以将要执行的外部程序和启动参数、环境变量、工作目录作为参数传递给exec方法,该方法执行后返回一个Process代表所执行的程序。
Runtime有六个exec方法,其中两个的定义为:
public Process exec(String[] cmdarray, String[] envp, File dir)
public Process exec(String command, String[] envp, File dir)
cmdarray和command为要执行的命令,可以将命令和参数作为一个字符串command传递给exec()方法,也可以将命令和参数一个一个的方在数组cmdarray里传递给exec()方法。
envp为环境变量,以name=value的形式放在数组中。dir为工作目录。
可以不要dir参数,或者不要envp和dir参数,这样就多出了其它4个exec()方法。如果没有dir参数或者为null,那么新启动的
进程就继承当前java进程的工作目录。如果没有envp参数或者为null,那么新启动的进程就继承当前java进程的环境变量。
也可以使用ProcessBuilder类启动一个新的程序,该类是后来添加到JDK中的,而且被推荐使用。通过构造函数设置要执行的命令以及
参数,或者也可以通过command()方法获取命令信息后在进行设置。通过directory(File directory)
方法设置工作目录,通过environment()获取环境变量信息来修改环境变量。
在使用ProcessBuilder构造函数创建一个新实例,设置环境变量、工作目录后,可以通过start()方法来启动新程序,与Runtime的exec()方法一样,该方法返回一个Process对象代表启动的程序。
ProcessBuilder与Runtime.exec()方法的不同在于ProcessBuilder提供了
redirectErrorStream(boolean redirectErrorStream)
方法,该方法用来将进程的错误输出重定向到标准输出里。即可以将错误输出都将与标准输出合并。
2、Process
不管通过那种方法启动进程后,都会返回一个Process类的实例代表启动的进程,该实例可用来控制进程并获得相关信息。Process类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法:
(1) void destroy()
杀掉子进程。
一般情况下,该方法并不能杀掉已经启动的进程,不用为好。
(2) int exitValue()
返回子进程的出口值。
只有启动的进程执行完成、或者由于异常退出后,exitValue()方法才会有正常的返回值,否则抛出异常。
(3)InputStream getErrorStream()
获取子进程的错误流。
如果错误输出被重定向,则不能从该流中读取错误输出。
(4)InputStream getInputStream()
获取子进程的输入流。
可以从该流中读取进程的标准输出。
(5)OutputStream getOutputStream()
获取子进程的输出流。
写入到该流中的数据作为进程的标准输入。
(6) int waitFor()
导致当前线程等待,如有必要,一直要等到由该 Process对象表示的进程已经终止。
通过该类提供的方法,可以实现与启动的进程之间通信,达到交互的目的。
3、从标准输出和错误输出流读取信息
从启动其他程序的Java进程看,已启动的其他程序输出就是一个普通的输入流,可以通过getInputStream()和getErrorStream来获取。
对于一般输出文本的进程来说,可以将InputStream封装成BufferedReader,然后就可以一行一行的对进程的标准输出进行处理。
4、举例
(1)Runtime.exec()
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
public class Test1{
public static void main(String[] args){
try{
Process p= null;
String line= null;
BufferedReader stdout= null;
//list the files and directorys under C:\
p= Runtime.getRuntime().exec("CMD.exe/C dir", null, new File("C:\\"));
stdout= new BufferedReader(new InputStreamReader(p
.getInputStream()));
while((line= stdout.readLine())!= null){
System.out.println(line);
}
stdout.close();
//echo the value of NAME
p= Runtime.getRuntime().exec("CMD.exe/C echo%NAME%", new String[]{"NAME=TEST"});
stdout= new BufferedReader(new InputStreamReader(p
.getInputStream()));
while((line= stdout.readLine())!= null){
System.out.println(line);
}
stdout.close();
} catch(Exception e){
e.printStackTrace();
}
}
(2)ProcessBuilder
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class Test2{
public static void main(String[] args){
try{
List list= new ArrayList();
ProcessBuilder pb= null;
Process p= null;
String line= null;
BufferedReader stdout= null;
//list the files and directorys under C:\
list.add("CMD.EXE");
list.add("/C");
list.add("dir");
pb= new ProcessBuilder(list);
pb.directory(new File("C:\\"));
p= pb.start();
stdout= new BufferedReader(new InputStreamReader(p
.getInputStream()));
while((line= stdout.readLine())!= null){
System.out.println(line);
}
stdout.close();
//echo the value of NAME
pb= new ProcessBuilder();
mand(new String[]{"CMD.exe","/C","echo%NAME%"});
pb.environment().put("NAME","TEST");
p= pb.start();
stdout= new BufferedReader(new InputStreamReader(p
.getInputStream()));
while((line= stdout.readLine())!= null){
System.out.println(line);
}
stdout.close();
} catch(Exception e){
e.printStackTrace();
}
}
}
5、获取进程的返回值
通常,一个程序/进程在执行结束后会向操作系统返回一个整数值,0一般代表执行成功,非0表示执行出现问题。有两种方式可以用来获取进程的返回
值。一是利用waitFor(),该方法是阻塞的,执导进程执行完成后再返回。该方法返回一个代表进程返回值的整数值。另一个方法是调用
exitValue()方法,该方法是非阻塞的,调用立即返回。但是如果进程没有执行完成,则抛出异常。
6、阻塞的问题
由Process代表的进程在某些平台上有时候并不能很好的工作,特别是在对代表进程的标准输入流、输出流和错误输出进行操作时,如果使用不慎,有可能导致进程阻塞,甚至死锁。
如果将以上事例中的从标准输出重读取信息的语句修改为从错误输出流中读取:
stdout= new BufferedReader(new InputStreamReader(p
.getErrorStream()));
那么程序将发生阻塞,不能执行完成,而是hang在那里。
当进程启动后,就会打开标准输出流和错误输出流准备输出,当进程结束时,就会关闭他们。在以上例子中,错误输出流没有数据要输出,标准输出流中
有数据输出。由于标准输出流中的数据没有被读取,进程就不会结束,错误输出流也就不会被关闭,因此在调用readLine()方法时,整个程序就会被阻
塞。为了解决这个问题,可以根据输出的实际先后,先读取标准输出流,然后读取错误输出流。
但是,很多时候不能很明确的知道输出的先后,特别是要操作标准输入的时候,情况就会更为复杂。这时候可以采用线程来对标准输出、错误输出和标准输入进行分别处理,根据他们之间在业务逻辑上的关系决定读取那个流或者写入数据。
针对标准输出流和错误输出流所造成的问题,可以使用ProcessBuilder的redirectErrorStream()方法将他们合二为一,这时候只要读取标准输出的数据就可以了。
当在程序中使用Process的waitFor()方法时,特别是在读取之前调用waitFor()方法时,也有可能造成阻塞。可以用线程的方法来解决这个问题,也可以在读取数据后,调用waitFor()方法等待程序结束。
总之,解决阻塞的方法应该有两种:
(1)使用ProcessBuilder类,利用redirectErrorStream方法将标准输出流和错误输出流合二为一,在用start()方法启动进程后,先从标准输出中读取数据,然后调用waitFor()方法等待进程结束。
如:
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class Test3{
public static void main(String[] args){
try{
List list= new ArrayList();
ProcessBuilder pb= null;
Process p= null;
String line= null;
BufferedReader stdout= null;
//list the files and directorys under C:\
list.add("CMD.EXE");
list.add("/C");
list.add("dir");
pb= new ProcessBuilder(list);
pb.directory(new File("C:\\"));
//merge the error output with the standard output
pb.redirectErrorStream(true);
p= pb.start();
//read the standard output
stdout= new BufferedReader(new InputStreamReader(p
.getInputStream()));
while((line= stdout.readLine())!= null){
System.out.println(line);
}
int ret= p.waitFor();
System.out.println("the return code is"+ ret);
stdout.close();
} catch(Exception e){
e.printStackTrace();
}
}
}
(2)使用线程
import java.util.*;
import java.io.*;
class StreamWatch extends Thread{
InputStream is;
String type;
List output= new ArrayList();
boolean debug= false;
StreamWatch(InputStream is, String type){
this(is, type, false);
}
StreamWatch(InputStream is, String type, boolean debug){
this.is= is;
this.type= type;
this.debug= debug;
}
public void run(){
try{
PrintWriter pw= null;
InputStreamReader isr= new InputStreamReader(is);
BufferedReader br= new BufferedReader(isr);
String line= null;
while((line= br.readLine())!= null){
output.add(line);
if(debug)
System.out.println(type+">"+ line);
}
if(pw!= null)
pw.flush();
} catch(IOException ioe){
ioe.printStackTrace();
}
}
public List getOutput(){
return output;
}
}
public class Test5{
public static void main(String args[]){
try{
List list= new ArrayList();
ProcessBuilder pb= null;
Process p= null;
// list the files and directorys under C:\
list.add("CMD.EXE");
list.add("/C");
list.add("dir");
pb= new ProcessBuilder(list);
pb.directory(new File("C:\\"));
p= pb.start();
// process error and output message
StreamWatch errorWatch= new StreamWatch(p.getErrorStream(),
"ERROR");
StreamWatch outputWatch= new StreamWatch(p.getInputStream(),
"OUTPUT");
// start to watch
errorWatch.start();
outputWatch.start();
//wait for exit
int exitVal= p.waitFor();
//print the content from ERROR and OUTPUT
System.out.println("ERROR:"+ errorWatch.getOutput());
System.out.println("OUTPUT:"+ outputWatch.getOutput());
System.out.println("the return code is"+ exitVal);
} catch(Throwable t){
t.printStackTrace();
}
}
}
7、在Java中执行Java程序
执行一个Java程序的关键在于:
(1)知道JAVA虚拟机的位置,即java.exe或者java的路径
(2)知道要执行的java程序的位置
(3)知道该程序所依赖的其他类的位置
举一个例子,一目了然。
(1)待执行的Java类
public class MyTest{
public static void main(String[] args){
System.out.println("OUTPUT one");
System.out.println("OUTPUT two");
System.err.println("ERROR 1");
System.err.println("ERROR 2");
for(int i= 0; i< args.length; i++)
{
System.out.printf("args[%d]=%s.", i, args[i]);
}
}
}
(2)执行该类的程序
import java.util.*;
import java.io.*;
class StreamWatch extends Thread{
InputStream is;
String type;
List output= new ArrayList();
boolean debug= false;
StreamWatch(InputStream is, String type){
this(is, type, false);
}
StreamWatch(InputStream is, String type, boolean debug){
this.is= is;
this.type= type;
this.debug= debug;
}
public void run(){
try{
PrintWriter pw= null;
InputStreamReader isr= new InputStreamReader(is);
BufferedReader br= new BufferedReader(isr);
String line= null;
while((line= br.readLine())!= null){
output.add(line);
if(debug)
System.out.println(type+">"+ line);
}
if(pw!= null)
pw.flush();
} catch(IOException ioe){
ioe.printStackTrace();
}
}
public List getOutput(){
return output;
}
}
public class Test6{
public static void main(String args[]){
try{
List list= new ArrayList();
ProcessBuilder pb= null;
Process p= null;
String java= System.getProperty("java.home")+ File.separator+"bin"+ File.separator+"java";
String classpath= System.getProperty("java.class.path");
// list the files and directorys under C:\
list.add(java);
list.add("-classpath");
list.add(classpath);
list.add(MyTest.class.getName());
list.add("hello");
list.add("world");
list.add("good better best");
pb= new ProcessBuilder(list);
p= pb.start();
System.out.println(mand());
// process error and output message
StreamWatch errorWatch= new StreamWatch(p.getErrorStream(),
"ERROR");
StreamWatch outputWatch= new StreamWatch(p.getInputStream(),
"OUTPUT");
// start to watch
errorWatch.start();
outputWatch.start();
//wait for exit
int exitVal= p.waitFor();
//print the content from ERROR and OUTPUT
System.out.println("ERROR:"+ errorWatch.getOutput());
System.out.println("OUTPUT:"+ outputWatch.getOutput());
System.out.println("the return code is"+ exitVal);
} catch(Throwable t){
t.printStackTrace();
}
}
}
java程序的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java编程用什么软件、java程序的信息别忘了在本站进行查找哦。