概述和代码

  •  去年下半年,突然想要自己编写一个账本软件来记账。在编写过程中,我发现自己无法解决在控制台输入中文的问题,于是拜读了CSDN上几位博主的文章,获益匪浅,解决了中文输入的问题。今天向大家分享我的代码。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    import java.util.*;
    import java.io.*;
    import java.nio.charset.Charset;

    public class InterConsole
    {
    //从控制台读取GBK格式中文字符串的方法
    //参数为输入停止条件,比如'\r',或者' '
    public static String readGBKLine(char regex)
    {
    //创建字符列表
    List<Character> alist=new ArrayList<Character>();
    //创建Reader流
    InputStreamReader is=new InputStreamReader(System.in,Charset.forName("GBK"));
    try
    {
    //声明暂存字符unicode值的变量
    int unicode=0;
    //读入字符数组
    while(true)
    {
    unicode=is.read();
    if(unicode==regex)
    break;
    else
    alist.add((char)unicode);
    }
    }
    catch(IOException e)
    {e.printStackTrace();}
    //获取字符数组
    Character[] array1=alist.toArray(new Character[(alist.size())]);
    char[] array2=new char[array1.length];
    for(int i=0;i<array1.length;i++)
    array2[i]=array1[i];
    if(array2.length==0)
    return "空";
    //返回字符串
    return new String(array2);
    }
    //cmd系统指令方法
    public static void sysOrder(String order)
    {
    try
    {
    new ProcessBuilder("cmd", "/c", order).inheritIO().start().waitFor();
    }
    catch (InterruptedException | IOException e)
    {
    e.printStackTrace();
    }
    }
    }
  • 上面这段代码是一个叫作InterConsole的类,包含两个方法,第一个是中文输入方法readGBKLine(),第二个是在控制台调用一部分指令的方法sysOrder()。

解释代码

  • 在readGBKLine()中,我创建了一个字符流,通过它来读取GBK格式的输入并将中文字符转化为unicode码。之后将unicode码转回字符形式存入队列,最终将队列转化为字符串。
  • 在sysOrder()中,我使用了ProcessBuilder类的对象,说实话我并不明白这段代码的真实含义,因为这段代码来自站内很多篇关于使用清屏命令的博文,似乎是与创建新进程有关。不过虽然我不明白这段代码的原理,但它的确可以成功调用cmd的一部分命令,如颜色改变命令、清屏命令,以及临时改变cmd字符编码格式的chcp命令。
  • 备注:在使用readGBKLine()之前,应当先通过批处理文件或者sysOrder()执行chcp 936命令,将控制台的编码格式改为gbk,否则会导致方法运行失败。

参考文章

在命令行模式、eclipse console下执行Java程序输入中文的几种情况尝试
java 在Cmd命令行实现清屏