0 0

如何编写一个command line程序?0

如何编写一个command line程序?
用java可以做出command line程序吗?
2014年5月14日 15:38

5个答案 按时间排序 按投票排序

1 0

我之前正好做了一个java 调用shell 脚本或者bat脚本的工具类,供楼主参考
为了防止命令进程阻塞,添加两线程处理输出信息

package utils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.log4j.Logger;

import vo.ResponseData;

public class CallCmdUtils {
	
	private static Logger logger = Logger.getLogger(CallCmdUtils.class);
	
	public static void executeCmd(String cmd){
		if(cmd == null || cmd.equals("")){
			return;
		}
		logger.info("执行命令:"+cmd);

		String[] cmds = new String[]{"/bin/sh","-c",cmd};
		try {
			Runtime.getRuntime().exec(cmds);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 执行本地命令 cmd格式 windows 环境下查询360运行exe程序: cmd /c tasklist | findstr
	 * "360.*[.exe]"
	 * 
	 * @param cmd
	 * @return
	 */
	public static ResponseData executeLocalCmd(String cmd) {
		if(cmd == null || cmd.equals("")){
			return ResponseData.FAIL_NO_DADA;
		}
		logger.info("执行命令:"+cmd);

		String[] cmds = new String[]{"/bin/sh","-c",cmd};
		StringBuffer sb = new StringBuffer(255);
		ResponseData data = ResponseData.FAIL_NO_DADA;
		try {
			Process process = Runtime.getRuntime().exec(cmds);
			process.waitFor();
			int  result = process.exitValue();
			if(result == 0){
				data.setSuccess(true);
				InputStream in = process.getInputStream();
				BufferedReader br = new BufferedReader(new InputStreamReader(in));
				String dataline = null;
				while ((dataline = br.readLine()) != null) {
					sb.append(dataline).append("\n");
				}
				br.close();
				in.close();
				data.setResult(sb.toString().trim());
			}else{
				InputStream in = process.getErrorStream();
				BufferedReader br = new BufferedReader(new InputStreamReader(in));
				String dataline = null;
				while ((dataline = br.readLine()) != null) {
					sb.append(dataline).append("\n");
				}
				br.close();
				in.close();
				data.setErrorMsg(sb.toString().trim());
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return data;
	}

	
	
	public boolean execCommand(String command){
		boolean execFlag = true;
		try {
			Process proc = Runtime.getRuntime().exec(command);
			//为了防止命令进程阻塞,添加两线程处理输出信息
			new StreamGobbler(proc.getErrorStream(),"["+command+"]ERROR").start();
			new StreamGobbler(proc.getInputStream(),"["+command+"]STDOUT").start();
			
        	if(proc.waitFor()==0){
        		logger.error("执行["+command+"]命令成功");
        	}else{
            	logger.error("执行["+command+"]命令出错");
            	execFlag = false;
        	}
        } catch (IOException ex) {
        	logger.error("执行["+command+"]命令IO异常",ex);
        	execFlag = false;
        } catch (InterruptedException ex) {
        	logger.error("执行["+command+"]命令被中断",ex);
        	execFlag = false;
        }
        return execFlag;
	}
}






package utils;

import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.InputStreamReader;  
import java.io.OutputStream;  
import java.io.PrintWriter;  

import org.apache.log4j.Logger;
  
/** 
 * 用于处理Runtime.getRuntime().exec产生的错误流及输出流 
 * @author shaojing 
 * 
 */  
public class StreamGobbler extends Thread {
	static Logger logger = Logger.getLogger(StreamGobbler.class);
	
    InputStream is;  
    String type;  
    OutputStream os;  
          
    public StreamGobbler(InputStream is, String type) {  
        this(is, type, null);  
    }  
  
    public StreamGobbler(InputStream is, String type, OutputStream redirect) {  
        this.is = is;  
        this.type = type;  
        this.os = redirect;  
    }  
      
    public void run() {  
        InputStreamReader isr = null;  
        BufferedReader br = null;  
        PrintWriter pw = null;  
        try {  
            if (os != null)  
                pw = new PrintWriter(os);  
                  
            isr = new InputStreamReader(is);  
            br = new BufferedReader(isr);  
            String line=null;  
            while ( (line = br.readLine()) != null) {  
                if (pw != null)  
                    pw.println(line);  
                logger.info(type + ">" + line);      
            }  
              
            if (pw != null)  
                pw.flush();
        } catch (IOException ioe) {  
            ioe.printStackTrace();    
        } finally{  
            if(pw != null){
            	pw.close();
            	pw = null;
            }
            if(isr != null){
            	try {
					isr.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
            	isr = null;
            }
            if(br != null){
        	    try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
        	    br = null;
            }
        }  
    }  
}






2014年5月15日 00:16
0 0

貌似有个开源的框架可以实现类似的功能,名字我不记得了,你可以查一下

2014年5月23日 22:20
0 0

可以啊,java se 在你不使用 swing 时就是命令行程序啊

2014年5月15日 16:18
0 0

 

2014年5月14日 16:13
0 0

可以的, 给你一个简单的ping google的吧

import java.io.BufferedReader;
import java.io.InputStreamReader;
 
public class ExecuteShellComand {
 
	public static void main(String[] args) {
 
		ExecuteShellComand obj = new ExecuteShellComand();
 
		String domainName = "google.com";
 
		String command = "ping -c 3 " + domainName;
 
 
		String output = obj.executeCommand(command);
 
		System.out.println(output);
 
	}
 
	private String executeCommand(String command) {
 
		StringBuffer output = new StringBuffer();
 
		Process p;
		try {
			p = Runtime.getRuntime().exec(command);
			p.waitFor();
			BufferedReader reader = 
                            new BufferedReader(new InputStreamReader(p.getInputStream()));
 
                        String line = "";			
			while ((line = reader.readLine())!= null) {
				output.append(line + "\n");
			}
 
		} catch (Exception e) {
			e.printStackTrace();
		}
 
		return output.toString();
 
	}
 
}

2014年5月14日 15:44

相关推荐

    The Linux Command Line 中文版

    《The Linux Command Line 中文版》这本书是一部关于Linux命令行操作的经典教程,由William E. Shotts Jr.撰写。它既适合初学者入门学习,也能够帮助有经验的Linux用户进一步提升技能。本书内容全面,涵盖了Linux...

    C#命令行解析CommandLine

    例如,假设我们的程序接受两个参数:一个表示操作类型,另一个表示操作的文件名。我们可以这样处理: ```csharp static void Main(string[] args) { if (args.Length != 2) { Console.WriteLine("Usage: ...

    Command Line File Manager

    "Command Line File Manager" 是一个专门用于文件管理的Java程序,它允许用户通过命令行界面执行常见的文件操作,如浏览目录、创建、移动、复制和删除文件等。这个程序的亮点在于其轻量化和高效性,尤其适合于那些...

    commandlinetools-linux-7583922_latest.zip

    标题中的"commandlinetools-linux-7583922_latest.zip"指的是Android的命令行工具包,这是Google提供的一套用于管理Android SDK的工具集合。这些工具允许开发者在命令行界面执行各种任务,包括但不限于安装、更新、...

    Learn command line.pdf

    总之,"Learn command line.pdf"这本书将引导你进入一个充满可能性的世界,让你学会如何通过命令行界面与计算机进行更深层次的交流,从而打破束缚,重获对电脑的控制。无论是为了日常使用还是专业开发,掌握命令行...

    The Mac OS X Command Line Unix Under the Hood

    终端是Mac OS X中的一个应用程序,允许用户通过命令行界面与系统交互。本书介绍了如何打开终端、执行基本命令、理解命令语法以及如何使用各种Unix命令来管理文件和目录。例如,`ls`用于列出目录内容,`cd`用于切换...

    CommandLine_src

    标题 "CommandLine_src" 暗示我们关注的是与命令行接口相关的源代码,可能是用于创建一个C#应用程序,该程序能够处理命令行参数和选项。在这个项目中,`CommandLine.cs` 文件很可能是主要的源代码文件,包含了处理...

    CommandLineTools

    在给定的场景中,"CommandLineTools_1.6.1.zip"是一个版本为1.6.1的命令行工具包,被压缩成ZIP格式,便于下载和分发。 描述中提到的"黑莓转化工具"暗示这组命令行工具是专门设计来转换与黑莓设备相关的应用程序的。...

    The Linux Command Line中文.pdf

    - **透明度的重要性**: Linux强调透明度,即用户可以了解系统的每一个细节,这对于学习和理解计算机工作原理至关重要。 #### 3. 命令行界面(CLI)的价值 - **高效性**: 与图形用户界面(GUI)相比,命令行界面允许...

    xcode Command-Line-Tools-macOS-10.14-for-Xcode-10.1.rar

    2. 安装DMG文件:双击打开“Command_Line_Tools_macOS_10.14_for_Xcode_10.1.dmg”,这将挂载一个虚拟磁盘映像到系统的Finder中。 3. 安装工具:在挂载的磁盘映像中,找到并运行“Install Command Line Developer ...

    xilinx:ISE Command Line Tools User Guide

    例如,使用-f选项可以指定执行命令文件,这样可以将一系列命令预先编写在一个文件中,通过命令行快速执行。-h选项用于显示帮助信息,帮助用户更好地理解如何使用命令行工具。而-intstyle选项则涉及到ISE的集成样式,...

    The Linux Command Line A Complete Introduction

    《The Linux Command Line: A Complete Introduction》这本书通过易懂、短小精悍的章节帮助读者逐步掌握这些技能,克服对命令行的初始恐惧(通常被称作"shell shock"),并发现命令行与计算机沟通的自然和富有表现力...

    Introduction to the Command Line

    进程是操作系统中的一个执行实体,掌握进程的创建、终止以及资源分配是系统管理的必备技能。此外,本章节还会讲解如何使用cron进行定时任务的设置,这在自动化运维中非常实用。 ### 七、启动与关闭(Section7) ...

    ORACLE10G Enterprise Manager Command Line Interface(官方文档)

    ORACLE 10G Enterprise Manager Command Line Interface(简称EM CLI)是Oracle 10g Release 5(10.2.0.5)版本中提供的一个命令行工具集,用于管理数据库实例、监听器以及执行各种数据库管理任务。通过EM CLI,用户...

    Labview Command line操作代码

    3. **Get Command Line.vi**:这是一个LabVIEW虚拟仪器,其名称表明它的主要功能是获取命令行输入。在LabVIEW中,我们可以创建一个VI来读取并解析命令行参数。通常,这个VI会包含一个或多个子VI,用于处理不同的参数...

    Apress - Beginning The Linux Command Line, 2009.zip

    《Apress - Beginning The Linux Command Line, 2009》是一本专为初学者设计的Linux命令行指南。这本书全面介绍了Linux操作系统的基础知识,特别是关于命令行界面的使用,帮助用户掌握在没有图形化界面的情况下操作...

    Command_Line_Tools_macOS_10.14_for_Xcode_10.1.dmg

    该压缩包中的"Command_Line_Tools_macOS_10.14_for_Xcode_10.1.dmg"文件是一个可挂载的磁盘映像,其中包含了所有必要的命令行工具。安装这个工具包后,开发者可以在终端中使用如gcc、clang、git等一系列工具,进行...

    The Linux Command Line英文版_terminal_linux_

    4. **管道和重定向**:学习如何使用管道(`|`)将一个命令的输出作为另一个命令的输入,以及重定向(`>`、`、`>>`)来控制输入和输出流。 5. **正则表达式**:理解正则表达式的基本语法,这对于在命令行中进行文本...

Global site tag (gtag.js) - Google Analytics