当前位置: 首页 > 面试题库 >

以字符集安全的方式获取Windows上的进程列表

谷梁永年
2023-03-14
问题内容

这篇文章]提供了一种检索Windows下正在运行的进程列表的解决方案。本质上,它可以:

String cmd = System.getenv("windir") + "\\system32\\" + "tasklist.exe";
Process p = Runtime.getRuntime().exec(cmd);
InputStreamReader isr = new InputStreamReader(p.getInputStream());
BufferedReader input = new BufferedReader(isr);

然后读取输入。

它的外观和效果很好,但我想知道是否有可能Tasklist使用的字符集可能不是默认字符集,并且此调用可能失败?

如果是这样,是否有办法确定合适的字符集?


问题答案:

可以分为两部分:

  1. Windows部分
    在Java中,您正在执行Windows命令-在“ Windows Land”中的jvm外部。当Java
    Runtime类执行Windows命令时,它将DLL用于控制台,因此出现在Windows中,就像命令在html" target="_blank">控制台中运行一样。 问:当我 在控制台中
    运行C:\ windows \ system32 \ tasklist.exe时,结果的字符编码(Windows术语中的“代码页”)?


    • 没有参数的Windows“ chcp”命令给出了控制台的活动代码页号(例如对于Multilingual-Latin-1是850,对于Latin-1是1252)。请参阅Windows Microsoft代码页, Windows OEM代码页, Windows ISO代码页
      最初根据系统区域设置来设置默认的系统代码页(键入systeminfo以查看此内容或通过“控制面板”->“区域和语言”)。

    • Windows OS / .NET函数getACP()也提供此信息

  1. Java部分:
    如何从Windows代码页“ x”(例如850或1252)中解码Java字节流?
* Windows代码页号和等效Java字符集名称之间的完整映射可以从[此处](http://msdn.microsoft.com/en-us/library/windows/desktop/dd317756%28v=vs.85%29.aspx)导出[-代码页标识符(Windows)](http://msdn.microsoft.com/en-us/library/windows/desktop/dd317756%28v=vs.85%29.aspx)
* 但是,实际上,可以添加以下前缀之一来实现映射:

对于ISO,“”(无),对于OEM,“ IBM”或“ x-IBM”,对于Microsoft,“ windows-”或“ x-windows-” /视窗。
例如ISO-8859-1或IBM850或Windows-1252

完整解决方案:

    String cmd = System.getenv("windir") + "\\system32\\" + "chcp.com";
    Process p = Runtime.getRuntime().exec(cmd);
    // Use default charset here - only want digits which are "core UTF8/UTF16"; 
    // ignore text preceding ":"
    String windowsCodePage = new Scanner(
        new InputStreamReader(p.getInputStream())).skip(".*:").next();

    Charset charset = null;
    String[] charsetPrefixes = 
        new String[] {"","windows-","x-windows-","IBM","x-IBM"};
    for (String charsetPrefix : charsetPrefixes) {
        try {
            charset = Charset.forName(charsetPrefix+windowsCodePage);
            break;
        } catch (Throwable t) {
        }
    }
    // If no match found, use default charset
    if (charset == null) charset = Charset.defaultCharset();

    cmd = System.getenv("windir") + "\\system32\\" + "tasklist.exe";
    p = Runtime.getRuntime().exec(cmd);
    InputStreamReader isr = new InputStreamReader(p.getInputStream(), charset);
    BufferedReader input = new BufferedReader(isr);

    // Debugging output
    System.out.println("matched codepage "+windowsCodePage+" to charset name:"+
            charset.name()+" displayName:"+charset.displayName());
    String line;
    while ((line = input.readLine()) != null) {
           System.out.println(line);
    }

感谢您的提问!- 很有趣。



 类似资料:
  • 下面我分享了我的代码,我试图使用线程安全的Nashorn作为脚本引擎来评估简单的数学公式。公式将类似于“a*b/2”,其中a 我需要知道这种方法是否有助于使Nashorn线程在这个用例中安全。我在Attila的回答中读到,我们可以在线程之间共享脚本引擎对象,因为它们是线程安全的。 对于bindings和eval,因为我们正在为每次执行evaluate创建新线程,每个线程都有自己的bindings对

  • Charset.defaultCharset()和file.encoding是JVM的字符集,而不是OS、控制台和终端的字符集。 现在我创建一个来运行程序,并使用要读取输出,如何为进程找到正确的字符集(是正确的,但似乎不是通用的)?

  • 问题内容: 我正在编写一个程序,其中将方程式作为字符串输入,然后求值。到目前为止,我已经提出了: 我既需要此方程式的字符串版本,也需要评估的版本。但是,这是非常危险的功能。但是,使用是行不通的,因为这是一个方程式。是否存在一个Python函数,该函数将评估字符串中的数学表达式,就像输入数字一样? 问题答案: 一种方法是使用numexpr。它主要是用于优化(和多线程)numpy操作的模块,但它也可以

  • 问题内容: 我尝试了google,但是发现它获取了 当前 进程的父pid 。 我需要类似的东西,有这样的东西吗?基本上获取某些进程的pid,然后返回父进程的pid。 问题答案: 我认为最简单的方法是打开“ / proc”并解析内容。 您将找到ppid作为/ proc / pid / stat的第四个参数

  • 我需要实现一个函数,该函数获取一个由n个元素和一个数字k组成的数组A作为输入,并返回一个包含大小为k的所有子集的数组(每个子集本身就是一个数组)。 定义函数的类型,并为函数实现至少3个测试(使用assert)。它应该是Javascript/Typescript和functional 例如:FunSubset([1,2,3],2)= 有什么想法吗?

  • 问题内容: 我在纱线簇中运行我的spark应用程序。在我的代码中,我使用队列的可用数量核心在数据集中创建分区: 我的问题:如何通过编程方式而不是通过配置获取可用的队列核心数? 问题答案: 有多种方法可以从Spark获取执行程序的数量和集群中的核心数量。这是我过去使用的一些Scala实用程序代码。您应该可以轻松地使其适应Java。有两个关键思想: 工人人数是执行者人数减去一或。 每个工人的核心数可以