在用java写数据库的备份与恢复时,遇到了如上问题。备份是没有问题的,关键是在于恢复的时候老是报管道正在被关闭。
恢复的代码如下:
File f=new File(savePath);
if(!f.exists()){
return false;
}
Runtime runtime = Runtime.getRuntime();
Process process=null;
try {
String mul="cmd /c c:\\mysql -h" + dbHost + " -P" + dbPort
+ " -u" + dbUser + " -p" + dbPass
+ " --default-character-set=utf8 " + dbName;
process = runtime.exec(mul);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
OutputStream outputStream = process.getOutputStream();
BufferedReader br=null;
try {
br = new BufferedReader(new InputStreamReader(
new FileInputStream(savePath), "UTF-8"));
} catch (FileNotFoundException | UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String str = null;
StringBuffer sb = new StringBuffer();
try {
while ((str = br.readLine()) != null) {
sb.append(str + "\r\n");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
str = sb.toString();
// try {
// //String string = new String(sb.toString().getBytes(),"utf-8");
// //str=string;
// } catch (UnsupportedEncodingException e1) {
// // TODO Auto-generated catch block
// e1.printStackTrace();
// }
OutputStreamWriter writer = null;
try {
writer = new OutputStreamWriter(outputStream,
"utf-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
writer.write(str);
writer.flush();
outputStream.close();
br.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
return false;
// TODO Auto-generated catch block
}
出现这个问题可能是读出来的数据乱码或者命令行执行错误或者对数据库的读写权限不高
解决思路:
1.先确定 br = new BufferedReader(new InputStreamReader(new FileInputStream(savePath), "UTF-8")); 这一步读出文件里面的内容没有乱码
2.用cmd命令执行一下c:\mysql -h(ip) -P(端口) -uroot (用户名) -p(密码) --default-character-set=utf8(编码注意编码是utf8而不是utf-8) 数据库名称。如果没有报错而且出现了数据,那么就表明命令是对的。如果没有出现数据就再检查一下命令行有没有写错
3.我还设置了一下数据库对于用户“”root“”的读写权限,具体可以百度。(这个不知道有没有用)
三种步骤我都做了然后就执行成功了。