码迷,mamicode.com
首页 > 编程语言 > 详细

【Java基础】Java与Windows系统的交互

时间:2015-07-03 15:47:01      阅读:289      评论:0      收藏:0      [点我收藏+]

标签:cmd

作者:郭嘉
邮箱:allenwells@163.com
博客:http://blog.csdn.net/allenwells
github:https://github.com/AllenWell

一 Java执行CMD命令

原理

Process process = Runtime.getRuntime().exec("cmd order");
  • cmd /c cmdorder 是执行完cmdorder命令后关闭命令窗口。
  • cmd /k cmdorder 是执行完cmdorder命令后不关闭命令窗口。
  • cmd /c start cmdorder 会打开一个新窗口后执行cmdorder指令,原窗口会关闭。
  • cmd /k start cmdorder 会打开一个新窗口后执行cmdorder指令,原窗口不会关闭。

注意

如果exec()中只有CMD命令,则命令会直接被执行,而不会打开命令行窗口;

举例

下面例子实现了执行解压JAR包,并把命令行信息输到Java的图形界面的功能:

Process process = null;
try
{
    process = Runtime.getRuntime().exec("jar xvf " + jarInputFile.getPath()) ;
}
catch (IOException e)
{
    e.printStackTrace();
}

InputStream inputStream = process.getInputStream();
Reader reader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(reader);
try
{
    for(String s = ""; ( s = bufferedReader.readLine()) != null;)
    {
        consoleInfo.append(s + "<br>");
    }
        bufferedReader.close();
        reader.close();
        JLabel consoleLabel = new JLabel();
        consoleLabel.setText("<html>" + consoleInfo.toString() + "</html>");
    }
}
catch (/ e)
{
    e.printStackTrace();
}

注意:Java Swing的文字显示不支持直接“\n”换行,所以使用“”标签的形式来实现换行。

二 CMD输出信息重定向

以上程序展示的是把执行一条命令后,把命令行上的信息输出到Java的图形界面上,那么如何实现实时的检测Windows的命令行打印信息并进行输出呢?

实现方法

Java的System类中有个out成员变量,称为标准输出流,用来把打印输出到屏幕上。上面所述的问题其实就是System.out的输出重定向问题。

System.out在Java中源码实现如下所示:

    /**
     * Default input stream.
     */
    public static final InputStream in;

    /**
     * Default output stream.
     */
    public static final PrintStream out;

    /**
     * Default error output stream.
     */
    public static final PrintStream err;

    private static final String lineSeparator;
    private static Properties systemProperties;

    static {
        err = new PrintStream(new FileOutputStream(FileDescriptor.err));
        out = new PrintStream(new FileOutputStream(FileDescriptor.out));
        in = new BufferedInputStream(new FileInputStream(FileDescriptor.in));
        lineSeparator = System.getProperty("line.separator");
    }

从上面可以看出,System.out是一个PrintStream。只需要把它重定向到我们需要的地方就可以了,具体代码实现如下所示:

package com.allenwells.ui;

import java.awt.Color;
import java.awt.Dimension;
import java.io.OutputStream;
import java.io.PrintStream;

import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.text.AbstractDocument;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.Element;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;

public class ConsolePane extends JScrollPane
{

    private static final long serialVersionUID = 1L;

    private JTextPane textPane = new JTextPane();

    private static ConsolePane console = null;

    public static synchronized ConsolePane getInstance()
    {
        if (console == null)
        {
            console = new ConsolePane();
        }
        return console;
    }

    private ConsolePane()
    {

        setViewportView(textPane);

        // Set up System.out
        PrintStream mySystemOut = new MyPrintStream(System.out, Color.black);
        System.setOut(mySystemOut);

        // Set up System.err
        PrintStream mySystemErr = new MyPrintStream(System.err, Color.red);
        System.setErr(mySystemErr);

        textPane.setEditable(true);
        setPreferredSize(new Dimension(640, 120));
    }

    /**
     * Returns the number of lines in the document.
     */
    private final int getLineCount()
    {
        return textPane.getDocument().getDefaultRootElement().getElementCount();
    }

    /**
     * Returns the start offset of the specified line.
     * 
     * @param line
     *            The line
     * @return The start offset of the specified line, or -1 if the line is
     *         invalid
     */
    private int getLineStartOffset(int line)
    {
        Element lineElement = textPane.getDocument().getDefaultRootElement()
                .getElement(line);
        if (lineElement == null)
            return -1;
        else
            return lineElement.getStartOffset();
    }

    /**
     * 清除超过行数时前面多出行的字符
     */
    private void replaceRange(String str, int start, int end)
    {
        if (end < start)
        {
            throw new IllegalArgumentException("end before start");
        }
        Document doc = textPane.getDocument();
        if (doc != null)
        {
            try
            {
                if (doc instanceof AbstractDocument)
                {
                    ((AbstractDocument) doc).replace(start, end - start, str,
                            null);
                }
                else
                {
                    doc.remove(start, end - start);
                    doc.insertString(start, str, null);
                }
            }
            catch (BadLocationException e)
            {
                throw new IllegalArgumentException(e.getMessage());
            }
        }
    }

    class MyPrintStream extends PrintStream
    {

        private Color foreground; // 输出时所用字体颜色

        /**
         * 构造自己的 PrintStream
         * 
         * @param out
         *            可传入 System.out 或 System.err, 实际不起作用
         * @param foreground
         *            显示字体颜色
         */
        MyPrintStream(OutputStream out, Color foreground)
        {
            super(out, true); // 使用自动刷新
            this.foreground = foreground;
        }

        /**
         * 在这里重截,所有的打印方法都要调用最底一层的方法
         */
        public void write(byte[] buf, int off, int len)
        {
            final String message = new String(buf, off, len);

            /** SWING非界面线程访问组件的方式 */
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    try
                    {

                        StyledDocument doc = (StyledDocument) textPane
                                .getDocument();

                        // Create a style object and then set the style
                        // attributes
                        Style style = doc.addStyle("StyleName", null);

                        // Foreground color
                        StyleConstants.setForeground(style, foreground);

                        doc.insertString(doc.getLength(), message, style);

                    }
                    catch (BadLocationException e)
                    {
                        // e.printStackTrace();
                    }

                    // Make sure the last line is always visible
                    textPane.setCaretPosition(textPane.getDocument()
                            .getLength());

                    // Keep the text area down to a certain line count
                    int idealLine = 150;
                    int maxExcess = 50;

                    int excess = getLineCount() - idealLine;
                    if (excess >= maxExcess)
                    {
                        replaceRange("", 0, getLineStartOffset(excess));
                    }
                }
            });
        }
    }

}

使用方法

JPanel contentPanel = new JPanel();
ConsolePane consolePane = ConsolePane.getInstance();
contentPanel.add(consolePane);

效果图如下所示:

技术分享

附录:

这里给出常见的CMD命令:

  1. gpedit.msc—–组策略
  2. sndrec32——-录音机
  3. Nslookup——-IP地址侦测器
  4. explorer——-打开资源管理器
  5. logoff———注销命令
  6. tsshutdn——-60秒倒计时关机命令
  7. lusrmgr.msc—-本机用户和组
  8. services.msc—本地服务设置
  9. oobe/msoobe /a—-检查XP是否激活
  10. notepad——–打开记事本
  11. cleanmgr——-垃圾整理
  12. net start messenger—-开始信使服务
  13. compmgmt.msc—计算机管理
  14. net stop messenger—–停止信使服务
  15. conf———–启动netmeeting
  16. dvdplay——–DVD播放器
  17. charmap——–启动字符映射表
  18. diskmgmt.msc—磁盘管理实用程序
  19. calc———–启动计算器
  20. dfrg.msc——-磁盘碎片整理程序
  21. chkdsk.exe—–Chkdsk磁盘检查
  22. devmgmt.msc— 设备管理器
  23. regsvr32 /u *.dll—-停止dll文件运行
  24. drwtsn32—— 系统医生
  25. rononce -p —-15秒关机
  26. dxdiag———检查DirectX信息
  27. regedt32——-注册表编辑器
  28. Msconfig.exe—系统配置实用程序
  29. rsop.msc——-组策略结果集
  30. mem.exe——–显示内存使用情况
  31. regedit.exe—-注册表
  32. winchat——–XP自带局域网聊天
  33. progman——–程序管理器
  34. winmsd———系统信息
  35. perfmon.msc—-计算机性能监测程序
  36. winver———检查Windows版本
  37. sfc /scannow—–扫描错误并复原
  38. taskmgr—–任务管理器(2000/xp/2003
  39. winver———检查Windows版本
  40. wmimgmt.msc—-打开windows管理体系结构(WMI)
  41. wupdmgr——–windows更新程序
  42. wscript——–windows脚本宿主设置
  43. write———-写字板
  44. winmsd———系统信息
  45. wiaacmgr——-扫描仪和照相机向导
  46. winchat——–XP自带局域网聊天
  47. mem.exe——–显示内存使用情况
  48. Msconfig.exe—系统配置实用程序
  49. mplayer2——-简易widnows media player
  50. mspaint——–画图板
  51. mstsc———-远程桌面连接
  52. mplayer2——-媒体播放机
  53. magnify——–放大镜实用程序
  54. mmc————打开控制台
  55. mobsync——–同步命令
  56. dxdiag———检查DirectX信息
  57. drwtsn32—— 系统医生
  58. devmgmt.msc— 设备管理器
  59. dfrg.msc——-磁盘碎片整理程序
  60. diskmgmt.msc—磁盘管理实用程序
  61. dcomcnfg——-打开系统组件服务
  62. ddeshare——-打开DDE共享设置
  63. dvdplay——–DVD播放器
  64. net stop messenger—–停止信使服务
  65. net start messenger—-开始信使服务
  66. notepad——–打开记事本
  67. nslookup——-网络管理的工具向导
  68. ntbackup——-系统备份和还原
  69. narrator——-屏幕”讲述人”
  70. ntmsmgr.msc—-移动存储管理器
  71. ntmsoprq.msc—移动存储管理员操作请求
  72. netstat -an—-(TC)命令检查接口
  73. syncapp——–创建一个公文包
  74. sysedit——–系统配置编辑器
  75. sigverif——-文件签名验证程序
  76. sndrec32——-录音机
  77. shrpubw——–创建共享文件夹
  78. secpol.msc—–本地安全策略
  79. syskey———系统加密,一旦加密就不能解开,保护windows xp系统的双重密码
  80. services.msc—本地服务设置
  81. Sndvol32——-音量控制程序
  82. sfc.exe——–系统文件检查器
  83. sfc /scannow—windows文件保护
  84. tsshutdn——-60秒倒计时关机命令
  85. tsshutdn——-60秒倒计时关机命令
  86. tourstart——xp简介(安装完成后出现的漫游xp程序)
  87. taskmgr——–任务管理器
  88. eventvwr——-事件查看器
  89. eudcedit——-造字程序
  90. explorer——-打开资源管理器
  91. packager——-对象包装程序
  92. perfmon.msc—-计算机性能监测程序
  93. progman——–程序管理器
  94. regedit.exe—-注册表
  95. rsop.msc——-组策略结果集
  96. regedt32——-注册表编辑器
  97. rononce -p —-15秒关机
  98. regsvr32 /u *.dll—-停止dll文件运行
  99. regsvr32 /u zipfldr.dll——取消ZIP支持
  100. cmd.exe——–CMD命令提示符
  101. chkdsk.exe—–Chkdsk磁盘检查
  102. certmgr.msc—-证书管理实用程序
  103. calc———–启动计算器
  104. charmap——–启动字符映射表
  105. cliconfg——-SQL SERVER 客户端网络实用程序
  106. Clipbrd——–剪贴板查看器
  107. conf———–启动netmeeting
  108. compmgmt.msc—计算机管理
  109. cleanmgr——-垃圾整理
  110. ciadv.msc——索引服务程序
  111. osk————打开屏幕键盘
  112. odbcad32——-ODBC数据源管理器
  113. oobe/msoobe /a—-检查XP是否激活
  114. lusrmgr.msc—-本机用户和组
  115. logoff———注销命令
  116. iexpress——-木马捆绑工具,系统自带
  117. Nslookup——-IP地址侦测器
  118. fsmgmt.msc—–共享文件夹管理器
  119. utilman——–辅助工具管理器
  120. gpedit.msc—–组策略

版权声明:本文为博主原创文章,未经博主允许不得转载。

【Java基础】Java与Windows系统的交互

标签:cmd

原文地址:http://blog.csdn.net/allenwells/article/details/46742227

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!