概述和代码
去年下半年,突然想要自己编写一个账本软件来记账。在编写过程中,我发现自己无法解决在控制台输入中文的问题,于是拜读了CSDN上几位博主的文章,获益匪浅,解决了中文输入的问题。今天向大家分享我的代码。
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,否则会导致方法运行失败。