用java做了个备份和恢复mysql数据库的程序,备份可以了,但是恢复总是报错:java.io.IOException: 管道正在被关闭。希望各位大虾指点下  小弟在这里谢谢了  拷贝别人的答案的就不要 在这里发了 影响心情 代码如下  String fPath = "d:\\20100915100942.sql"; 
  FileInputStream fis = new FileInputStream(fPath); 
            Runtime rt = Runtime.getRuntime(); 
            Process child = rt.exec("mysql    -h 127.0.0.1 -uroot -proot -P3306 --set-charset=utf8 ybdj");// 
            // ybdj 是数据库名
            OutputStream out1 = child.getOutputStream();//控制台的输入信息作为输出流 
            InputStreamReader xx =new InputStreamReader(fis, "utf-8");
            String inStr; 
            String outStr; 
            StringBuffer sb = new StringBuffer("");             BufferedReader br = new BufferedReader(xx); 
            while ((inStr = br.readLine()) != null)
            { 
                sb.append(inStr + "\r\n"); 
                //System.out.println(" br.readLine()="+ br.readLine());
            } 
       
            outStr = sb.toString(); 
            OutputStreamWriter writer = new OutputStreamWriter(out1, "utf8"); 
            writer.write(outStr); 
            // 注:这里如果用缓冲方式写入文件的话,会导致中文乱码,用flush()方法则可以避免 
           // writer.flush(); 
            writer.close(); 
            br.close(); 
            xx.close();
            out1.close(); 
            fis.close();                      
       报错的地方就在 writer.write(outStr); 上面这行 错误代码如下 
  
java.io.IOException: 管道正在被关闭。
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:260)
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:105)
at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:202)
at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:263)
at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:106)
at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:116)
at java.io.OutputStreamWriter.write(OutputStreamWriter.java:203)
at java.io.Writer.write(Writer.java:140)
at util.DataLoad.doPost(DataLoad.java:80)

解决方案 »

  1.   


    PrintStream ps = new PrintStream(child);
    ps.start();
    child.waitFor();
    if (child.exitValue() != 0) {
    throw new Exception("...");
    }
    ...新开一个线程 PrintStream,主要做你写的这段内容:OutputStream out1 = child.getOutputStream();//控制台的输入信息作为输出流 
                InputStreamReader xx =new InputStreamReader(fis, "utf-8");
                String inStr; 
                String outStr; 
                StringBuffer sb = new StringBuffer("");             BufferedReader br = new BufferedReader(xx); 
                while ((inStr = br.readLine()) != null)
                { 
                    sb.append(inStr + "\r\n"); 
                    //System.out.println(" br.readLine()="+ br.readLine());
                } 
      

  2.   

    OutputStreamWriter writer = new OutputStreamWriter(out1, "utf8"); 
    while ((inStr = br.readLine()) != null)
                { 
                     writer.write(inStr + "\r\n");
                } 
      

  3.   

    我最近也要实现 oracle 或SQLServer 的备份和恢复。还没有接触过这些东西,看到LZ的CODE 。我学习哈