`
zhangljerry
  • 浏览: 144394 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java命令行运行

阅读更多
现在服务器远程控制一般都是web方式实现的,这种方式体现的最明显的是J2EE应用服务器;当然为了操作方便,有些服务器也提供GUI客户端,
不过笔者比较喜欢字符终端,我想有很多人同笔者一样,在这里,向大家介绍一个Java实现的命令行程序,这是笔者当时阅读OBE(一个Workflow Engine)
的源代码时的收获,把代码调整了一下,版权就不属于Adrian.Price的了,哈哈!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

public class CommandClient {

    //返回菜单
    protected static final Object[] BACK = {"Q", "Back to previous menu", null};
    protected static final String UNDERLINE = "-----------------------------------------------------------------------------";
   
    //设置菜单
    private static final Object[][] SET_MENU = {
        // mnemonic, description, method
        {"1", "Load Default value", "loadDefault"},
        {"2", "Set Remote Host and Port(example,localhost:8191)", "setHost"},
        {"3", "Set Welcome message", "setMessage"},
        BACK
    };
  //主菜单 
private static final Object[][] MAIN_MENU = {
        // mnemonic, description, method
        {"1", "Set", SET_MENU},
        {"2", "Check Server Status", "checkServerStatus"},
        {"3", "Shutdown Server", "shutdownServer"},
        {"Q", "Quit", "quit"}
    };

protected BufferedReader _stdin;
    protected FormattingPrintWriter _stdout;
    protected String title = null;

   
    public void setHost()
     throws IOException
    {
     System.out.println("please enter connection string:");
     BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
     System.out.println("The host you set is " + stdin.readLine());
    }
    public void shutdownServer()
    {
     System.out.println("server has been shut down");
    }
    public void checkServerStatus()
    {
     System.out.println("server is OK");
    }
    public CommandClient()
    {
     _stdin = new BufferedReader(new InputStreamReader(System.in));
        _stdout = new FormattingPrintWriter(System.out, true);
        title = "Command Client";
        _stdout.println("\n--- "+title+"  ---");
    }
    protected void quit() {
        System.exit(0);
    }
    private Method findMethod(String name) {
        Class cl = getClass();
        Method method = null;
        while (method == null) {
            try {
                method = cl.getDeclaredMethod(name, null);
            } catch (NoSuchMethodException e) {
                System.out.println("no method define");
                cl = cl.getSuperclass();
                if (cl == null) {
                    e.printStackTrace();
                    System.exit(1);
                }
             /*
                try
             {
              return cl.getDeclaredMethod("done", null);
             }
                catch (NoSuchMethodException ex) {ex.printStackTrace();}
                */
            }
        }
        return method;
    }
    protected String getChoice(String choices)
     throws IOException {
        while (true) {
            _stdout.print("> ");
            _stdout.flush();
            String line = _stdin.readLine().trim();
            if (line.length() == 1) {
                int choice = Character.toUpperCase(line.charAt(0));
                int index = choices.indexOf(choice);
                if (index != -1)
                    return choices.substring(index, index + 1);
            }
            _stdout.println("\007*** Choice must be one of: " + choices);
        }
    }
    //选择菜单选项,动态调用某个方法
    public void doMenu(Object[][] menu, boolean main)
    {
     this.doMenu(this.title,menu,main);
    }
    public void doMenu(String pTitle,Object[][] menu, boolean main)
    {
        synchronized (System.in) {
            Map actions = new HashMap();
            StringBuffer sb = new StringBuffer(menu.length);
            for (int i = 0; i < menu.length; i++) {
                Object mnemonic = menu[i][0];
                sb.append(mnemonic);
                Object action = menu[i][2];
                if (action instanceof String)
                    action = findMethod((String)action);
                actions.put(mnemonic, action);
            }
            String choices = sb.toString();

            while (true) {/////////////////////////////////////////////////////////////
                try {
                    String mnemonic;

                    _stdout.clearTabs();
                    _stdout.println("\n---   " + pTitle + "   ---");
                    _stdout.println("\nEnter choice:");
                    for (int i = 0; i < menu.length; i++)
                        _stdout.println(menu[i][0] + ") " + menu[i][1]);

                    // Get the user's selection.
                    mnemonic = getChoice(choices);
                    //System.out.println("mnemonic="+mnemonic);
                    for (int i = 0; i < menu.length; i++) {
                        Object[] entry = menu[i];
                        if (entry[0].equals(mnemonic)) {
                            Object action = actions.get(mnemonic);
                            if (action == null) {
                                return;
                            } else if (action instanceof Method) {
                                //System.out.println("selected,will do");
                                // Cast required to suppress JDK1.5 varargs compiler warning.
                                ((Method)action).invoke(this, (Object[])null);
                            } else {
                                doMenu((String)entry[1], (Object[][])action,
                                    false);
                            }
                        }
                    }
                } catch (Exception e) {
                    Throwable t = e;
                    if (e instanceof InvocationTargetException)
                        t = ((InvocationTargetException)e).getTargetException();
                    _stdout.println("\007*** Caught exception: " + t);
                }
            }////////////////////////////////////////////////////////////////////////////
        }
    }
/**
  * @param args
  */
public static void main(String[] args)
{
  new CommandClient().doMenu(MAIN_MENU,true);
}
public void setMessage()
  throws IOException
{
  System.out.println("please enter welcome message:");
     BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
     System.out.println("welcome message  is " + stdin.readLine());
}
public void loadDefault()
{
  System.out.println("default setting is loaded");
}

}



附另外一个类(javaeye的blog有点令我失望,加个附件也很痛苦)

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.Stack;

/**
* A PrintWriter class that supports tab stops and programmable indentation.
* The writer interprets tab characters in the usual way, by emitting spaces to
* align the following characters at the next tab stop to the right of the
* current print position. The default tab stops are at every 8 characters,
* that is, in columns 9, 17, 25, ... 81. The {@link #setTabs} method allows
* custom tab stops to be specified. Indentation can be controlled via the
* {@link #pushIndent()}, {@link #pushIndent(int)} and {@link #popIndent()}
* methods.
*


* The writer scans all arguments for newline characters, and achieves the
* desired indentation level by inserting a corresponding number of spaces into
* the output before continuing with the characters following the newline.
* Indentation settings are held internally on a stack so that cancelling the
* current setting automatically restores the previous one.
*
* @author Adrian Price
*/
public class FormattingPrintWriter extends PrintWriter {
    private static final String NEWLINE =
        System.getProperty("line.separator", "\r\n");
    // Standard tab settings
    private static final int[] STD_TABS =
        {9, 17, 25, 33, 41, 49, 57, 65, 73, 81};

    private boolean _autoFlush;
    private int[] _tabs = STD_TABS;
    private Stack _stack = new Stack();
    private int _indent;
    private int _pos;

    /**
     * Returns a string consisting of the specified number of spaces.
     *
     * @return The requested whitespace string.
     */
    private static String spaces(int n) {
        char[] ca = new char[n];
        for (int i = 0; i < n; i++)
            ca[i] = ' ';
        return new String(ca, 0, ca.length);
    }

    /**
     * Constructs a new FormattingPrintWriter, without automatic line flushing.
     *
     * @param out A character-output stream.
     */
    public FormattingPrintWriter(Writer out) {
        super(out);
    }

    /**
     * Constructs a new FormattingPrintWriter.
     *
     * @param out       A character-output stream.
     * @param autoFlush If true, the println() methods will flush
     *                  the output buffer.
     */
    public FormattingPrintWriter(Writer out, boolean autoFlush) {
        super(out, autoFlush);
        _autoFlush = autoFlush;
    }

    /**
     * Constructs a new PrintWriter, without automatic line flushing, from an
     * existing OutputStream. This convenience constructor creates the necessary
     * intermediate OutputStreamWriter, which will convert characters into bytes
     * using the default character encoding.
     *
     * @param out An output stream.
     */
    public FormattingPrintWriter(OutputStream out) {
        super(out);
    }

    /**
     * Constructs a new PrintWriter from an existing OutputStream. This
     * convenience constructor creates the necessary intermediate
     * OutputStreamWriter, which will convert characters into bytes using the
     * default character encoding.
     *
     * @param out       An output stream.
     * @param autoFlush if true, the println() methods will flush
     *                  the output buffer.
     */
    public FormattingPrintWriter(OutputStream out, boolean autoFlush) {
        super(out, autoFlush);
        _autoFlush = autoFlush;
    }

    /**
     * Restores the default tab stops.
     */
    public void clearTabs() {
        setTabs(null);
    }

    /**
     * Sets custom tab stops. At output positions past the rightmost tab stop,
     * tab characters are converted into single spaces.
     *
     * @param tabs Unity-based tab stop positions, as an ascending sequence of
     *             positive integers.
     */
    public void setTabs(int[] tabs) {
        synchronized (lock) {
            if (tabs == null) {
                _tabs = STD_TABS;
            } else {
                for (int i = 0, n = tabs.length - 1; i < n; i++) {
                    if (tabs[i] <= 0 || tabs[i] >= tabs[i + 1])
                        throw new IllegalArgumentException(
                            "Tab stops must be an ascending sequence of positive integers.");
                }
                _tabs = new int[tabs.length];
                System.arraycopy(tabs, 0, _tabs, 0, tabs.length);
            }
            if (_pos != 0)
                println();
        }
    }

    /**
     * Returns unity-based tab stop positions, as an ascending sequence of
     * positive integers.
     *
     * @return Current tab stops.
     */
    public int[] getTabs() {
        return (int[])_tabs.clone();
    }

    /**
     * Increases the indentation level by the specified amount.
     *
     * @param i Number of columns by which to increase indentation.
     */
    public void pushIndent(int i) {
        if (i <= 0) {
            throw new IllegalArgumentException(
                "Indentation must be a positive integer");
        }
        synchronized (lock) {
            _stack.push(new Integer(i));
            _indent += i;
        }
    }

    /**
     * Increases the indentation level to the next tab stop past the current
     * output position.
     */
    public void pushIndent() {
        // Indent to the nearest tab stop to the right of the current
        // indentation level, if such a tab stop exists.
        for (int i = 0, n = _tabs.length; i < n; i++)
            if (_tabs[i] > _indent) {
                pushIndent(_tabs[i] - _indent);
                return;
            }
        // Past the rightmost tab stop, indentation is one space.
        pushIndent(1);
    }

    /**
     * Restores the previous indentation level.
     *
     * @throws IllegalStateException if the current indentation level is 0.
     */
    public void popIndent() {
        if (_stack.empty())
            throw new IllegalStateException();
        _indent -= ((Integer)_stack.pop()).intValue();
    }

    /**
     * Returns the current indentation level.
     *
     * @return Indentation level as a character count.
     */
    public int getIndent() {
        return _indent;
    }

    /**
     * Returns the current output position (zero-based).
     *
     * @return The output position.
     */
    public int getPosition() {
        return _pos;
    }

    /**
     * Expands a tab character by setting the output position to the next tab
     * stop past the current output position.
     *
     * @return Space-filled string.
     */
    private String expandTab() {
        // If pos is after the last tab stop, translate tab characters to spaces.
        String s = " ";
        int curpos = _indent + _pos;
        for (int i = 0; i < _tabs.length; i++) {
            // Tab stops use 1-based column numbers,
            if (_tabs[i] - 1 > curpos) {
                // curpos is a 0-based column index.
                s = spaces(_tabs[i] - curpos - 1);
                break;
            }
        }
        _pos += s.length();
        return s;
    }

    /**
     * Expands embedded tab and newline escape sequences, adjusting the output
     * position accordingly. The method recognizes 'C'/Java-style '\t', '\r' and
     * '\n' escape sequences.
     *
     * @param ch Character to expand.
     * @return String containing (expanded) input character.
     */
    private String expandEscapes(char ch) {
        StringBuffer result = new StringBuffer();
        switch (ch) {
            case '\t':
                if (_pos == 0 && _indent > 0)
                    result.append(spaces(_indent));
                result.append(expandTab());
                break;
            case '\n':
                _pos = 0;
            case '\r':
                result.append(ch);
                break;
            default:
                if (_pos == 0 && _indent > 0)
                    result.append(spaces(_indent));
                result.append(ch);
                _pos++;
        }
        return result.toString();
    }

    /**
     * Expands embedded tab and newline escape sequences, adjusting the output
     * position accordingly. The method recognizes 'C'/Java-style '\t', '\r' and
     * '\n' escape sequences.
     *
     * @param s   Source string.
     * @param off Offset at which to start copying.
     * @param len Number of source characters to process.
     * @return Copy of the source string where all escape sequences have been
     *         replaced by their equivalent characters.
     */
    private String expandEscapes(String s, int off, int len) {
        StringBuffer result = new StringBuffer(len);
        for (int i = off, end = off + len; i < end; i++) {
            char ch = s.charAt(i);
            switch (ch) {
                case '\t':
                    if (_pos == 0 && _indent > 0)
                        result.append(spaces(_indent));
                    result.append(expandTab());
                    break;
                case '\n':
                    _pos = 0;
                case '\r':
                    result.append(ch);
                    break;
                default:
                    if (_pos == 0 && _indent > 0)
                        result.append(spaces(_indent));
                    result.append(ch);
                    _pos++;
            }
        }
        return result.toString();
    }

    /**
     * Writes a character, which may be a tab or newline.
     *
     * @param c Character to write.
     */
    private void _writeEx(int c) {
        String s = expandEscapes((char)c);
        super.write(s, 0, s.length());
    }

    /**
     * Writes a string which may contain tab or newline characters.
     *
     * @param s   Source string.
     * @param off Offset at which to start writing.
     * @param len Number of source characters to process.
     */
    private void _writeEx(String s, int off, int len) {
        s = expandEscapes(s, off, len);
        super.write(s, 0, s.length());
    }

    /**
     * Writes a string that does not contain embedded tabs or newlines.
     *
     * @param s   Source string.
     * @param off Offset at which to start writing.
     * @param len Number of source characters to process.
     */
    private void _write(String s, int off, int len) {
        _pos += len;
        super.write(s, off, len);
    }

    public void print(boolean b) {
        String s = String.valueOf(b);
        _write(s, 0, s.length());
    }

    public void print(char c) {
        _writeEx(c);
    }

    public void print(int i) {
        String s = String.valueOf(i);
        _write(s, 0, s.length());
    }

    public void print(long l) {
        String s = String.valueOf(l);
        _write(s, 0, s.length());
    }

    public void print(float f) {
        String s = String.valueOf(f);
        _write(s, 0, s.length());
    }

    public void print(double d) {
        String s = String.valueOf(d);
        _write(s, 0, s.length());
    }

    public void print(char[] ca) {
        _writeEx(new String(ca), 0, ca.length);
    }

    public void print(String s) {
        _writeEx(s, 0, s.length());
    }

    public void print(Object obj) {
        String s = String.valueOf(obj);
        _writeEx(s, 0, s.length());
    }

    private void newLine() {
        _write(NEWLINE, 0, NEWLINE.length());
        _pos = 0;
        if (_autoFlush)
            flush();
    }

    public void println() {
        synchronized (lock) {
            newLine();
        }
    }

    public void println(boolean b) {
        synchronized (lock) {
            print(b);
            newLine();
        }
    }

    public void println(char c) {
        synchronized (lock) {
            print(c);
            newLine();
        }
    }

    public void println(int i) {
        synchronized (lock) {
            print(i);
            newLine();
        }
    }

    public void println(long l) {
        synchronized (lock) {
            print(l);
            newLine();
        }
    }

    public void println(float f) {
        synchronized (lock) {
            print(f);
            newLine();
        }
    }

    public void println(double d) {
        synchronized (lock) {
            print(d);
            newLine();
        }
    }

    public void println(char[] c) {
        synchronized (lock) {
            print(c);
            newLine();
        }
    }

    public void println(String s) {
        synchronized (lock) {
            print(s);
            newLine();
        }
    }

    public void println(Object obj) {
        synchronized (lock) {
            print(obj);
            newLine();
        }
    }

    public void write(int c) {
        _writeEx(c);
    }

    public void write(char[] buf, int off, int len) {
        _writeEx(new String(buf, off, len), 0, len);
    }

    public void write(char[] buf) {
        _writeEx(new String(buf), 0, buf.length);
    }

    public void write(String s, int off, int len) {
        _writeEx(s, off, len);
    }

    public void write(String s) {
        _writeEx(s, 0, s.length());
    }
    public static void main(String[] args)
     throws Exception
    {
     System.out.println("please enter file path");
     BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
     String line = null;
     while ((line = stdin.readLine()) != null)
     {
      File dir = new File(line.trim());
      if (dir.exists())
      {
       System.out.println(dir.getAbsolutePath());
       break;
      }
      else
      {
       System.out.println("dir does not exist,please re-enter:");
      }
     }
    }
}



分享到:
评论

相关推荐

    Java命令行运行参数说明大全.txt

    ### Java命令行运行参数详解 #### 一、概述 Java作为一种广泛使用的编程语言,其运行依赖于Java虚拟机(JVM)。为了优化JVM的性能,开发者可以通过命令行传递一系列参数来控制JVM的行为。本文将详细介绍Java命令行...

    Java 命令行运行参数大全

    ### Java命令行运行参数详解 #### 一、概述 Java作为一种广泛应用的编程语言,其运行依赖于Java虚拟机(JVM)。为了更好地控制Java应用程序的运行环境,开发者可以通过指定一系列命令行参数来调整JVM的行为。本文将...

    java命令行辅助工具

    总结来说,Java命令行辅助工具是一个实用的开发工具,它通过自动化Java源代码的编译和运行,减少了开发者在命令行上的操作,提升了开发效率。对于初学者和频繁进行命令行操作的开发者来说,这样的工具无疑是一个很好...

    Java命令行classpath的设置

    Java命令行classpath(类路径)的设置是Java开发过程中的一项基础操作,对于理解和运行Java程序至关重要。类路径是指定Java虚拟机(JVM)在执行Java程序时查找类文件的位置。正确配置类路径能确保JVM能够找到并加载...

    eclipse java 命令行参数

    这篇博客文章将探讨如何在Eclipse中配置和使用Java命令行参数,这对于理解程序的运行行为以及调试是非常有帮助的。 在Java程序中,命令行参数是通过`main`方法的`String[] args`数组传递的,它们允许我们在不修改...

    java命令行编译基础知识

    Java 命令行编辑的基础知识包括编译和运行 Java 程序。编译 Java 程序可以使用 javac 命令,例如编译 HelloWorld.java 文件可以使用以下命令:javac HelloWorld.java。运行 Java 程序可以使用 java 命令,例如运行 ...

    java命令行文件管理器

    Java命令行文件管理器是一款基于Java编程语言开发的实用工具,专为用户在终端环境中提供高效、便捷的文件操作体验。这款程序集成了多种文件管理功能,如创建、删除、重命名、拷贝文件,浏览目录,以及压缩与解压缩、...

    java命令行编译全

    本文将深入探讨如何在命令行环境下编译和运行包含包结构的Java程序。 首先,Java中的包(package)是用来组织类的一种方式,它帮助避免命名冲突并提供更好的代码管理。例如,在给定的例子中,我们有两个类——`A....

    Java 命令行工具

    总结来说,Java命令行工具是Java开发的基础,涵盖了从编写、编译到运行的整个流程。熟练掌握这些工具及其用法,对于Java开发者来说是必不可少的技能。同时,利用Shell脚本自动化这些任务,可以极大地提升开发效率和...

    Java 命令行以及Java工具总结

    下面将对这些Java命令行工具进行详细的总结和说明。 一、基础工具(Basic Tools) 1. javac:Java编程语言的编译器。开发者使用它将.java源文件编译成.class字节码文件,以便能够在JVM上运行。 2. java:Java应用...

    java的几个命令行参数

    Java 命令行参数是 Java 虚拟机在 DOS 环境下运行时的基本参数设置,掌握这些参数可以更好地利用 Java 虚拟机的功能。本文将详细介绍 Java 命令行参数的使用方法和参数设置。 一、运行 Class 文件 Java 命令行参数...

    java命令行编译说明

    在Java命令行编译和运行过程中,理解并正确处理包、类的相对路径以及`classpath`的设置,对于构建复杂的Java应用程序至关重要。虽然这可能比使用IDE时更显繁琐,但它帮助开发者深入理解Java编译和运行的底层机制,...

    Java 命令行应用开发

    首先,开发Java命令行应用需要对Java编程基础有深入理解,包括类、对象、数据类型、控制结构(如循环和条件语句)、异常处理等。这些是所有Java程序的基础,无论其是否运行在命令行环境。 其次,要创建命令行应用,...

    Java的命令行进度条 JCmdLineProgess

    使用JCmdLineProgress库,开发者可以方便地在Java命令行程序中集成进度条,提高用户体验。通过实例化库提供的类,设置参数,然后在执行任务时调用相应的更新方法,就可以实现动态的进度显示。 例如,以下是一个简单...

    java命令行大富翁

    《Java命令行大富翁》是一款基于Java编程语言开发的命令行游戏,旨在帮助初学者在娱乐中学习Java基础知识。这款游戏虽然没有华丽的图形界面,但通过简单的字符输出和用户输入,模拟了经典的大富翁游戏规则,为玩家...

    Java的命令行进度条 JCmdLineProgess.7z

    JCmdLineProgress库就是为了实现这个目的,它允许开发者在Java命令行界面中轻松创建动态的进度条。 JCmdLineProgress库的核心功能在于提供了一个简洁的API,让开发者可以轻松地集成到他们的程序中。这个库通常包括...

    Java命令行外壳框架

    Java命令行外壳框架是一种用于构建命令行界面的工具,它基于properties配置文件并利用Java的反射机制来实现命令的解析和执行。这个框架允许开发者定义一系列的命令,并将每个命令映射到相应的处理类,从而简化了...

Global site tag (gtag.js) - Google Analytics