package com.hxzkoa.util;
|
|
import java.io.BufferedReader;
|
import java.io.BufferedWriter;
|
import java.io.FileInputStream;
|
import java.io.FileOutputStream;
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.io.InputStreamReader;
|
import java.io.OutputStream;
|
import java.io.OutputStreamWriter;
|
|
public class DatabaseUtil {
|
//本实例支持Linux环境和Windows环境
|
public static void main(String[] args) throws Exception {
|
//测试备份
|
String command1 = "mysqldump -hlocalhost -ualex -p123 demo";//参数依次是IP、账号、密码、数据库名
|
String savePath1 = "D:/demo.sql";
|
boolean b1 = new DatabaseUtil().backup(command1, savePath1);
|
if(b1){
|
System.out.println("备份成功");
|
}else {
|
System.out.println("备份失败");
|
}
|
|
/*//测试还原
|
String command2 = "mysql -hlocalhost -ualex -p123 --default-character-set=utf8 demo";
|
String savePath2 = "D:/demo.sql";
|
boolean b2 = new DatabaseUtil().recover(command2, savePath2);
|
if(b2){
|
System.out.println("还原成功");
|
}else {
|
System.out.println("还原失败");
|
}*/
|
}
|
|
/**
|
* mysql的备份方法
|
*
|
* @param command 命令行
|
* @param savePath 备份路径
|
* @return
|
*/
|
public boolean backup(String command, String savePath) {
|
boolean flag;
|
// 获得与当前应用程序关联的Runtime对象
|
Runtime r = Runtime.getRuntime();
|
BufferedReader br = null;
|
BufferedWriter bw = null;
|
try {
|
// 在单独的进程中执行指定的字符串命令
|
Process p = r.exec(command);
|
// 获得连接到进程正常输出的输入流,该输入流从该Process对象表示的进程的标准输出中获取数据
|
InputStream is = p.getInputStream();
|
// InputStreamReader是从字节流到字符流的桥梁:它读取字节,并使用指定的charset将其解码为字符
|
InputStreamReader isr = new InputStreamReader(is, "utf-8");
|
//BufferedReader从字符输入流读取文本,缓冲字符,提供字符,数组和行的高效读取
|
br = new BufferedReader(isr);
|
String s;
|
StringBuffer sb = new StringBuffer("");
|
// 组装字符串
|
while ((s = br.readLine()) != null) {
|
sb.append(s + System.lineSeparator());
|
}
|
s = sb.toString();
|
// 创建文件输出流
|
FileOutputStream fos = new FileOutputStream(savePath);
|
// OutputStreamWriter是从字符流到字节流的桥梁,它使用指定的charset将写入的字符编码为字节
|
OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8");
|
// BufferedWriter将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入
|
bw = new BufferedWriter(osw);
|
bw.write(s);
|
bw.flush();
|
flag = true;
|
} catch (IOException e) {
|
flag = false;
|
e.printStackTrace();
|
} finally {
|
//由于输入输出流使用的是装饰器模式,所以在关闭流时只需要调用外层装饰类的close()方法即可,
|
//它会自动调用内层流的close()方法
|
try {
|
if (null != bw) {
|
bw.close();
|
}
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
|
try {
|
if (null != br) {
|
br.close();
|
}
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
return flag;
|
}
|
|
/**
|
* mysql的还原方法
|
*
|
* @param command 命令行
|
* @param savePath 还原路径
|
* @return
|
*/
|
public boolean recover(String command, String savePath) {
|
boolean flag;
|
Runtime r = Runtime.getRuntime();
|
BufferedReader br = null;
|
BufferedWriter bw = null;
|
try {
|
Process p = r.exec(command);
|
OutputStream os = p.getOutputStream();
|
FileInputStream fis = new FileInputStream(savePath);
|
InputStreamReader isr = new InputStreamReader(fis, "utf-8");
|
br = new BufferedReader(isr);
|
String s;
|
StringBuffer sb = new StringBuffer("");
|
while ((s = br.readLine()) != null) {
|
sb.append(s + System.lineSeparator());
|
}
|
s = sb.toString();
|
OutputStreamWriter osw = new OutputStreamWriter(os, "utf-8");
|
bw = new BufferedWriter(osw);
|
bw.write(s);
|
bw.flush();
|
flag = true;
|
} catch (IOException e) {
|
flag = false;
|
e.printStackTrace();
|
} finally {
|
try {
|
if (null != bw) {
|
bw.close();
|
}
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
|
try {
|
if (null != br) {
|
br.close();
|
}
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
return flag;
|
}
|
}
|