shell.java
来自「java ftp 操作代码,程序可以直接运行」· Java 代码 · 共 265 行
JAVA
265 行
package net.sf.jftp.tools;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Font;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.io.BufferedOutputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.StreamTokenizer;import java.util.Vector;import javax.swing.JFrame;import javax.swing.JScrollBar;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.text.DefaultCaret;import net.sf.jftp.gui.framework.HFrame;import net.sf.jftp.system.logging.Log;public class Shell extends HFrame implements Runnable{ BufferedOutputStream out; //BufferedInputStream in; BufferedReader in; BufferedOutputStream err; JTextArea text = new JTextArea(25, 101); //JTextField input = new JTextField(); long off; Thread runner; JScrollPane textP; String input = ""; Vector commands = new Vector(); int currCmd = 0; public Shell(InputStream in, OutputStream out) { try { this.in = new BufferedReader(new InputStreamReader(in)); this.out = new BufferedOutputStream(out); //in = new BufferedInputStream(System.in); //out = new BufferedOutputStream(System.out); //err = new BufferedOutputStream(System.err); init(); } catch(Exception e) { e.printStackTrace(); Log.debug("ERROR: " + e.getMessage()); } } public Shell(BufferedReader in, OutputStream out) { try { this.in = in; this.out = new BufferedOutputStream(out); //in = new BufferedInputStream(System.in); //out = new BufferedOutputStream(System.out); //err = new BufferedOutputStream(System.err); init(); } catch(Exception e) { e.printStackTrace(); Log.debug("ERROR: " + e.getMessage()); } } public void init() throws Exception { setTitle("Shell"); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); //setLocation(150, 150); HFrame.fixLocation(this); textP = new JScrollPane(text); text.setFont(new Font("Monospaced", Font.TRUETYPE_FONT, 10)); getContentPane().setLayout(new BorderLayout(5, 5)); getContentPane().add("Center", textP); //getContentPane().add("South", input); text.setEditable(false); setBackground(text.getBackground()); DefaultCaret c = new DefaultCaret(); c.setBlinkRate(1000); text.setCaret(c); text.setCaretColor(Color.BLACK); c.setVisible(true); text.setLineWrap(true); text.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { if((e.getKeyCode() == KeyEvent.VK_BACK_SPACE) && (input.length() > 0)) { input = input.substring(0, input.length() - 1); String t = text.getText(); t = t.substring(0, t.length() - 1); text.setText(t); } else if(e.getKeyCode() == KeyEvent.VK_UP) { String t = text.getText(); t = t.substring(0, t.length() - input.length()); if((currCmd <= commands.size()) && (currCmd > 0)) { currCmd--; String cmd = (String) commands.get(currCmd); input = cmd.substring(0, cmd.length() - 1); text.setText(t + input); } } else if(e.getKeyCode() == KeyEvent.VK_DOWN) { String t = text.getText(); t = t.substring(0, t.length() - input.length()); if(((currCmd + 1) < commands.size()) && (currCmd >= 0)) { currCmd++; String cmd = (String) commands.get(currCmd); input = cmd.substring(0, cmd.length() - 1); text.setText(t + input); } } else if(e.getKeyCode() != KeyEvent.VK_SHIFT) { //Char c = new Char(e.getKeyChar()); if(!e.isActionKey()) { input += e.getKeyChar(); text.append("" + e.getKeyChar()); } } if(e.getKeyCode() == KeyEvent.VK_ENTER) { send(); } } }); pack(); HFrame.fixLocation(this); setVisible(true); runner = new Thread(this); runner.start(); toFront(); text.requestFocus(); } public void run() { try { char[] b = new char[4096]; int i; while((i = in.read(b,0,b.length)) != StreamTokenizer.TT_EOF) { text.append(new String(b, 0, i)); //Log.out("recv: "+i+" -> "+new String(b)); //while(err.available() > 0) //{ // err.read(b); // text.append(new String(b, 0, i)); //} while(text.getRows() > 500) { String t = text.getText(); t = t.substring(250); text.setText(t); // text.setCaretPosition(-250); } try { Thread.sleep(100); } catch(Exception ex) { ex.printStackTrace(); } JScrollBar bar = textP.getVerticalScrollBar(); bar.setValue(bar.getMaximum()); // text.setCaretPosition(i); text.setCaretPosition(text.getText().length()); //text.getCaret().setDot(1); } text.setEnabled(false); } catch(Exception ex) { ex.printStackTrace(); Log.debug("ERROR: " + ex.getMessage()); this.dispose(); } } private void send() { try { String msg = input; input = ""; out.write(msg.getBytes()); out.flush(); commands.add(msg); currCmd = commands.size(); //Log.out("send: "+msg); } catch(IOException ex) { ex.printStackTrace(); Log.debug("ERROR: " + ex.getMessage()); this.dispose(); } } public static void main(String[] argv) { try { Process p = Runtime.getRuntime().exec(argv.length > 0 ? argv[0] : "/bin/bash"); new Shell(p.getInputStream(), p.getOutputStream()); } catch(Exception ex) { ex.printStackTrace(); } }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?