最近使用java做了一个简单的ping的程序,有两种方法可以用来实现
1.直接在java中调用批处理或者执行cmd命令
import java.io.IOException;
public class BatchProcess {
public static void main(String args[]) throws IOException
{
Runtime.getRuntime().exec("dir");
}
}
执行后,发现程序并没有被执行。
从网上查了,需要加入 Process 的waiteFor(),改变代码如下
import java.io.IOException;
public class BatchProcess {
public static void main(String args[]) throws IOException, InterruptedException
{
Process process=Runtime.getRuntime().exec("dir ");
process.waitFor();
}
}
问题又出现了,发现程序一直卡在waitFor()那里。waitFor()会一直等待process线程的终止,如果该线程未终止,则会造成线程的阻塞。可是为什么一个dos命令会造成线程的终止呢。网上参考其他人的解释是,该线程会不断的向标准输出和错误流中写入数据,而数据未被读取的话,最终造成缓冲区满,最终线程堵塞到这里。那就在代码中加入一个读取数据的buffer
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.Buffer;
public class BatchProcess {
public static void main(String args[]) throws IOException, InterruptedException
{
Process process=Runtime.getRuntime().exec("dir ");
BufferedReader bf=new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while((line=bf.readLine() )!= null)
{
System.out.println(line);
}
process.waitFor();
}
}
再次执行,OK.
当然也可以用下面的代码实现
Runtime.getRuntime().exec("cmd /c start dir");
当然这样同样面临这阻塞的问题。
实现ping的功能还可以使用如下的代码,使用java.net.InetAddress中的isReachable()的方法,
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Te
{
public static void main(String args[]) throws IOException
{
byte ip[]={(byte)127,(byte)0,(byte)0,(byte)1};
InetAddress ia=InetAddress.getByAddress(ip);
if(ia.isReachable(3000))
{
System.out.println("OK");
}
else
System.out.println("Sorry");
}
}
1.直接在java中调用批处理或者执行cmd命令
import java.io.IOException;
public class BatchProcess {
public static void main(String args[]) throws IOException
{
Runtime.getRuntime().exec("dir");
}
}
执行后,发现程序并没有被执行。
从网上查了,需要加入 Process 的waiteFor(),改变代码如下
import java.io.IOException;
public class BatchProcess {
public static void main(String args[]) throws IOException, InterruptedException
{
Process process=Runtime.getRuntime().exec("dir ");
process.waitFor();
}
}
问题又出现了,发现程序一直卡在waitFor()那里。waitFor()会一直等待process线程的终止,如果该线程未终止,则会造成线程的阻塞。可是为什么一个dos命令会造成线程的终止呢。网上参考其他人的解释是,该线程会不断的向标准输出和错误流中写入数据,而数据未被读取的话,最终造成缓冲区满,最终线程堵塞到这里。那就在代码中加入一个读取数据的buffer
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.Buffer;
public class BatchProcess {
public static void main(String args[]) throws IOException, InterruptedException
{
Process process=Runtime.getRuntime().exec("dir ");
BufferedReader bf=new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while((line=bf.readLine() )!= null)
{
System.out.println(line);
}
process.waitFor();
}
}
再次执行,OK.
当然也可以用下面的代码实现
Runtime.getRuntime().exec("cmd /c start dir");
当然这样同样面临这阻塞的问题。
实现ping的功能还可以使用如下的代码,使用java.net.InetAddress中的isReachable()的方法,
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Te
{
public static void main(String args[]) throws IOException
{
byte ip[]={(byte)127,(byte)0,(byte)0,(byte)1};
InetAddress ia=InetAddress.getByAddress(ip);
if(ia.isReachable(3000))
{
System.out.println("OK");
}
else
System.out.println("Sorry");
}
}