您的位置:首页 > 其它

InputStreamReader引发的一个编码问题

2016-07-22 09:02 435 查看
最近有一个任务,需要接收web前端发送的一串java源代码,然后编译在返回结果以显示,但是一直遇到了编码问题,流程如下
项目都是utf-8编码,
前端以utf-8编码发送源文件,http协议控制如下
$.ajax({
type : "POST",
url: "compileJava",
contentType: "application/json; charset=utf-8",
dataType: "json",
headers: {
Accept: "application/json"
},
data: JSON.stringify({"code": code}),
success : function(data) {
alert(data.msg);
$("#response").html(data.msg);
}
});

然后以utf-8编码保存到本地
public String savaJava(String javaSrc, String path) {
FileOutputStream outputStream = null;
try {
path = path+File.separator+"Main.java";
byte[] bytes = javaSrc.getBytes("utf-8");
outputStream = new FileOutputStream(path);
outputStream.write(bytes);

FileInputStream input = new FileInputStream(path);
BufferedReader bf = new BufferedReader(new InputStreamReader(input, "utf-8"));
String ss;
while ((ss = bf.readLine()) != null) {
System.out.println(ss);
}
return path;
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}

使用javac编译
String command = "javac -encoding utf-8 "+ path;
public String compile(String command) throws Exception{
System.out.println("开始编译"+command);
Process process = null;
try {
process = Runtime.getRuntime().exec(command);
} catch (Exception e) {
return "系统正在维护中";
}
InputStream is = null;
BufferedReader br = null;
try {
is = process.getErrorStream();
StringBuilder sb = new StringBuilder();
br = new BufferedReader(new InputStreamReader(is));
String line = null;
System.out.println("F" + Charset.defaultCharset().name());
while ((line = br.readLine()) != null) {
sb.append(line);
System.out.println(line);
sb.append("\n");
}
process.waitFor();
return sb.toString();
} catch (Exception e) {
throw e;
} finally {
try {
if (null != is) {
is.close();
is = null;
}
if (null != br) {
br.close();
br = null;
}
if (null != process) {
process.destroy();
process = null;
}
} catch (Exception e) {
throw e;
}
}
}

在转换错误流的时候,br = new BufferedReader(new InputStreamReader(is)); br = new BufferedReader(new InputStreamReader(is, "utf8"));这2种方式都出现乱码。
使用utf-8出现错误,猜想错误码返回的是gbk字节。
第一种没指定乱码我想当然的以为是使用本地的默认编码gbk,通过查看源码才发现,如果没用指定编码,使用的是Charset.defaultCharset().name(),输出之后发现竟然不是gbk。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: