- 浏览: 143952 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
gadmyth:
beta reduction也介绍错了(λx . e)f →β ...
Lamda演算简介 -
gadmyth:
左结合法则是错的,因为Application binds mo ...
Lamda演算简介 -
hongmeikaile:
...
Struts2与ajax的组合 -
aguai0:
非常详细,学习了
prototype-1.3.1.js 开发笔记 -
左看右看:
...
DAO编程模式(转)
现在服务器远程控制一般都是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实现的命令行程序,这是笔者当时阅读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命令行运行参数详解 #### 一、概述 Java作为一种广泛使用的编程语言,其运行依赖于Java虚拟机(JVM)。为了优化JVM的性能,开发者可以通过命令行传递一系列参数来控制JVM的行为。本文将详细介绍Java命令行...
### Java命令行运行参数详解 #### 一、概述 Java作为一种广泛应用的编程语言,其运行依赖于Java虚拟机(JVM)。为了更好地控制Java应用程序的运行环境,开发者可以通过指定一系列命令行参数来调整JVM的行为。本文将...
总结来说,Java命令行辅助工具是一个实用的开发工具,它通过自动化Java源代码的编译和运行,减少了开发者在命令行上的操作,提升了开发效率。对于初学者和频繁进行命令行操作的开发者来说,这样的工具无疑是一个很好...
Java命令行classpath(类路径)的设置是Java开发过程中的一项基础操作,对于理解和运行Java程序至关重要。类路径是指定Java虚拟机(JVM)在执行Java程序时查找类文件的位置。正确配置类路径能确保JVM能够找到并加载...
这篇博客文章将探讨如何在Eclipse中配置和使用Java命令行参数,这对于理解程序的运行行为以及调试是非常有帮助的。 在Java程序中,命令行参数是通过`main`方法的`String[] args`数组传递的,它们允许我们在不修改...
Java 命令行编辑的基础知识包括编译和运行 Java 程序。编译 Java 程序可以使用 javac 命令,例如编译 HelloWorld.java 文件可以使用以下命令:javac HelloWorld.java。运行 Java 程序可以使用 java 命令,例如运行 ...
Java命令行文件管理器是一款基于Java编程语言开发的实用工具,专为用户在终端环境中提供高效、便捷的文件操作体验。这款程序集成了多种文件管理功能,如创建、删除、重命名、拷贝文件,浏览目录,以及压缩与解压缩、...
本文将深入探讨如何在命令行环境下编译和运行包含包结构的Java程序。 首先,Java中的包(package)是用来组织类的一种方式,它帮助避免命名冲突并提供更好的代码管理。例如,在给定的例子中,我们有两个类——`A....
总结来说,Java命令行工具是Java开发的基础,涵盖了从编写、编译到运行的整个流程。熟练掌握这些工具及其用法,对于Java开发者来说是必不可少的技能。同时,利用Shell脚本自动化这些任务,可以极大地提升开发效率和...
下面将对这些Java命令行工具进行详细的总结和说明。 一、基础工具(Basic Tools) 1. javac:Java编程语言的编译器。开发者使用它将.java源文件编译成.class字节码文件,以便能够在JVM上运行。 2. java:Java应用...
Java 命令行参数是 Java 虚拟机在 DOS 环境下运行时的基本参数设置,掌握这些参数可以更好地利用 Java 虚拟机的功能。本文将详细介绍 Java 命令行参数的使用方法和参数设置。 一、运行 Class 文件 Java 命令行参数...
在Java命令行编译和运行过程中,理解并正确处理包、类的相对路径以及`classpath`的设置,对于构建复杂的Java应用程序至关重要。虽然这可能比使用IDE时更显繁琐,但它帮助开发者深入理解Java编译和运行的底层机制,...
首先,开发Java命令行应用需要对Java编程基础有深入理解,包括类、对象、数据类型、控制结构(如循环和条件语句)、异常处理等。这些是所有Java程序的基础,无论其是否运行在命令行环境。 其次,要创建命令行应用,...
使用JCmdLineProgress库,开发者可以方便地在Java命令行程序中集成进度条,提高用户体验。通过实例化库提供的类,设置参数,然后在执行任务时调用相应的更新方法,就可以实现动态的进度显示。 例如,以下是一个简单...
《Java命令行大富翁》是一款基于Java编程语言开发的命令行游戏,旨在帮助初学者在娱乐中学习Java基础知识。这款游戏虽然没有华丽的图形界面,但通过简单的字符输出和用户输入,模拟了经典的大富翁游戏规则,为玩家...
JCmdLineProgress库就是为了实现这个目的,它允许开发者在Java命令行界面中轻松创建动态的进度条。 JCmdLineProgress库的核心功能在于提供了一个简洁的API,让开发者可以轻松地集成到他们的程序中。这个库通常包括...
Java命令行外壳框架是一种用于构建命令行界面的工具,它基于properties配置文件并利用Java的反射机制来实现命令的解析和执行。这个框架允许开发者定义一系列的命令,并将每个命令映射到相应的处理类,从而简化了...