WebServiceUtile.java
package com.xiangshuai.client;
 import java.util.ArrayList;
import org.apache.cxf.endpoint.Client;
 import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;import com.xiangshuai.util.PDFBinaryUtil;
/***
  * 
  * @author lqx 
  * PDFBinaryXml 将很多PDF文件BASE65弄成二进制流到 List中去,CXF发布
  *然后用 dyWebService 进行访问测试接口方法,再还原成PDF进行保存
  *文件在 :E:/学习文档子目录压缩/工具技术2/CXF -PDF转成二进制流的字符串发布,及将二进制流反转成PDF/springcxfBinaryString.rar
  *我的网盘/我的笔记/学习文档子目录压缩/工具技术2/CXF -PDF转成二进制流的字符串发布,及将二进制流反转成PDF/springcxfBinaryString.rar
  */
 public class WebServiceUtile {
      public static void main(String[] args) {
          String url="http://localhost:8080/springcxfBinaryString/webservice/PDFBinaryXml?wsdl";
          //获得返回的结果,里面只有一个结果,即getPDFBinaryString返回的list
           Object[] obj = dyWebService(url, "getPDFBinaryString", "");
           ArrayList<String> pdfBinarys =(ArrayList<String>) obj[0];
            for(int i=0;i<pdfBinarys.size();i++){
                //将pdfBinarys.get(i)的二进制流转成PDF并保存到 D:/temp/pdf/... 这个文件中
                PDFBinaryUtil.base64StringToPDF(pdfBinarys.get(i), "D:/temp/pdf/"+String.valueOf(++i)+".pdf");
            }
     }
      
      
     /***
      * 
      * @param url : wsdl请求接口地址 --http://localhost:8080/springcxfBinaryString/webservice/PDFBinaryXml?wsdl
      * @param functionName : 具体的接口方法 :getPDFBinaryString
      * @param obj :functionName 的参数 :其实这个参数在这里没有,但没有会报错,因此加上的
      * @return
      */
     public static Object[] dyWebService(String url,String functionName,String temp){
         JaxWsDynamicClientFactory instace = JaxWsDynamicClientFactory.newInstance();
         Client client = instace.createClient(url);
         Object[] invoke=null;
         try {
              invoke = client.invoke(functionName, temp);
         } catch (Exception e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
         
         return invoke;
         
     }
 }package com.xiangshuai.util;
//为工程添加 sun.misc.BASE64Encoder和sun.misc.BASE64Decoder包:  
 //右键项目》属性》Java Build Path》jre System Library 》access rules 双击 add》resolution选择accessible,下面填上**点击确定即可!  
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
 import java.io.ByteArrayInputStream;    
 import java.io.ByteArrayOutputStream;    
 import java.io.File;    
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;     import sun.misc.BASE64Decoder;    
 import sun.misc.BASE64Encoder;    
 /***
  * @author lqx
  * 为WEBSERVICE 准备 PDF的二进制流的字符串
  * 文件在 E:\学习文档子目录压缩\工具技术2\PDF转成二进制流的字符串,及将二进制流反转成PDF\PDFBinary.jar
  * 我的网盘\我的笔记\学习文档子目录压缩\工具技术2\PDF转成二进制流的字符串,及将二进制流反转成PDF\PDFBinary.jar
  */
 public class PDFBinaryUtil {    
     /*BASE64Encoder和BASE64Decoder这两个方法是sun公司的内部方法,并没有在java api中公开过,所以使用这些方法是不安全的,
      * 将来随时可能会从中去除,所以相应的应该使用替代的对象及方法,建议使用apache公司的API---可引用 import org.apache.commons.codec.binary.Base64;进行替换*/
   static BASE64Encoder encoder = new sun.misc.BASE64Encoder();    
   static BASE64Decoder decoder = new sun.misc.BASE64Decoder();    
       
   public static void main(String[] args) {    
        //将PDF格式文件转成base64编码 
        String base64String = getPDFBinary("C:/Users/Administrator/Desktop/铁路/高院测试库标准成果挂接格式模板/多页-2010-MS2/2019-MMM2-2122-101-001.pdf");
        System.out.println(base64String);
       //将base64的编码转成PDF格式文件,,保存到C:/Users/Administrator/Desktop/昊达临时/test2.pdf
       base64StringToPDF(base64String,"C:/Users/Administrator/Desktop/铁路/test2.pdf");
   }    
       
   /**
    *  将PDF转换成base64编码
    *  1.使用BufferedInputStream和FileInputStream从File指定的文件中读取内容;
    *  2.然后建立写入到ByteArrayOutputStream底层输出流对象的缓冲输出流BufferedOutputStream
    *  3.底层输出流转换成字节数组,然后由BASE64Encoder的对象对流进行编码
    * */
   public static String getPDFBinary(String filePath) {
       FileInputStream fin =null;
       BufferedInputStream bin =null;
       ByteArrayOutputStream baos = null;
       BufferedOutputStream bout =null;
       try {
           //建立读取文件的文件输出流
           fin = new FileInputStream(new File(filePath));
           //在文件输出流上安装节点流(更大效率读取)
           bin = new BufferedInputStream(fin);
           // 创建一个新的 byte 数组输出流,它具有指定大小的缓冲区容量
           baos = new ByteArrayOutputStream();
           //创建一个新的缓冲输出流,以将数据写入指定的底层输出流
           bout = new BufferedOutputStream(baos);
           byte[] buffer = new byte[1024];
           int len = bin.read(buffer);
           while(len != -1){
               bout.write(buffer, 0, len);
               len = bin.read(buffer);
           }
           //刷新此输出流并强制写出所有缓冲的输出字节,必须这行代码,否则有可能有问题
           bout.flush();
            byte[] bytes = baos.toByteArray();
            //sun公司的API
            return encoder.encodeBuffer(bytes).trim();  
            //apache公司的API
            //return Base64.encodeBase64String(bytes);
           
         } catch (FileNotFoundException e) {
             e.printStackTrace();
         } catch (IOException e) {
             e.printStackTrace();
         }finally{
             try {
                 fin.close();
                 bin.close();
                 //关闭 ByteArrayOutputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException
                 //baos.close();
                 bout.close();
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
       return null;
   }
       PDFBinaryUtil.java
   /**
    * 将base64编码转换成PDF,保存到
    * @param base64sString
    * 1.使用BASE64Decoder对编码的字符串解码成字节数组
    *  2.使用底层输入流ByteArrayInputStream对象从字节数组中获取数据;
    *  3.建立从底层输入流中读取数据的BufferedInputStream缓冲输出流对象;
    *  4.使用BufferedOutputStream和FileOutputSteam输出数据到指定的文件中
    */
   public static void base64StringToPDF(String base64sString,String filePath){
       BufferedInputStream bin = null;
       FileOutputStream fout = null;
       BufferedOutputStream bout = null;
       try {
            //将base64编码的字符串解码成字节数组
             byte[] bytes = decoder.decodeBuffer(base64sString);
           //apache公司的API
           //byte[] bytes = Base64.decodeBase64(base64sString);
             //创建一个将bytes作为其缓冲区的ByteArrayInputStream对象
             ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
             //创建从底层输入流中读取数据的缓冲输入流对象
             bin = new BufferedInputStream(bais);
             //指定输出的文件
             File file = new File(filePath);
             //创建到指定文件的输出流
             fout  = new FileOutputStream(file);
             //为文件输出流对接缓冲输出流对象
             bout = new BufferedOutputStream(fout);
             
             byte[] buffers = new byte[1024];
             int len = bin.read(buffers);
             while(len != -1){
                 bout.write(buffers, 0, len);
                 len = bin.read(buffers);
             }
             //刷新此输出流并强制写出所有缓冲的输出字节,必须这行代码,否则有可能有问题
             bout.flush();
             
         } catch (IOException e) {
             e.printStackTrace();
         }finally{
             try {
                 bin.close();
                 fout.close();
                 bout.close();
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
   }
 }package com.xiangshuai.webservice;
import java.util.List;
import javax.jws.WebService;
PDFBinaryWebservice .java     webservic接口
 @WebService
 public interface PDFBinaryWebservice {
     public List<String> getPDFBinaryString(String temp);
 }package com.xiangshuai.webservice;
import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.util.ArrayList;
 import java.util.List;import javax.jws.WebService;
import com.xiangshuai.util.PDFBinaryUtil;
PDFBinaryWebserviceImpl.java 实现类
 @WebService
 public class PDFBinaryWebserviceImpl implements PDFBinaryWebservice {    @Override
     public List<String> getPDFBinaryString(String temp) {
         File file = new  File("C:/Users/Administrator/Desktop/铁路/高院测试库标准成果挂接格式模板/多页-2010-MS2");
         String[] filePahts = file.list();
         //存二进制流的
         List<String> pdfBinaryStrings=new ArrayList<String>();
         for(int i=0;i<filePahts.length;i++){
             String pdfBinary = PDFBinaryUtil.getPDFBinary(file.getAbsolutePath() +"/"+ filePahts[i]);
             pdfBinaryStrings.add(pdfBinary);
         }
         return pdfBinaryStrings;
     }
       
 }
 接口BEAN的xml:<?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <!-- cxf3以后,只需要引入这个配置文件即可,其他两个废弃掉了,必再引-->
 <import resource="classpath*:META-INF/cxf/cxf.xml"/><jaxws:endpoint id="pdfService" implementor="com.xiangshuai.webservice.PDFBinaryWebserviceImpl" address="/PDFBinaryXml"></jaxws:endpoint>
 </beans>  web.xml
<?xml version="1.0" encoding="UTF-8"?>
 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
   <display-name>springcxfserver02</display-name>
   <!-- 设置Spring容器加载配置文件路径 -->
     <context-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>classpath:bean-service.xml</param-value>
     </context-param>    <!-- 加载Spring容器配置 -->
     <listener>
         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
     </listener>     <servlet>
         <servlet-name>CXFService</servlet-name>
         <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
     </servlet>
     <servlet-mapping>
         <servlet-name>CXFService</servlet-name>
         <url-pattern>/webservice/*</url-pattern>
     </servlet-mapping>
 </web-app>