文件和字节流字符串的相互转换【亲测可用】

在和其他系统做数据交互的时候,通常需要传递一些文件过去,但是文件没法直接放到webservice的字符流里传递,需要把文件转成流,然后其他系统收到后再把流转成文件。

 

下面是具体例子了

例如,这里D盘根目录下有个test.txt文件

路径为:d:/test.txt;

内容为:

Hello World
Hello Java
...

文件和字节流字符串的相互转换【亲测可用】_第1张图片

然后执行如下代码:

package com.esoon.capital.test;

import org.apache.commons.codec.binary.Base64;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class File2String {
    public static void main(String[] args) {

        String filePath = "d:\\test.txt";
        String str = file2String(filePath);
        System.out.println("文件转字符串结果:start");
        System.out.println(str);
        System.out.println("文件转字符串结果:end");

    }

    public static String file2String(String path) {
        // TODO Auto-generated method stub
        File file = new File(path);
        FileInputStream fis = null;
        StringBuffer content = new StringBuffer();
        try {
            fis = new FileInputStream(file);
            int length = 2 * 1024 * 1024;
            byte[] byteAttr = new byte[length];
            int byteLength = -1;

            while ((byteLength = fis.read(byteAttr, 0, byteAttr.length)) != -1) {

                String encode = "";
                if (byteLength != byteAttr.length) {
                    byte[] temp = new byte[byteLength];
                    System.arraycopy(byteAttr, 0, temp, 0, byteLength);
                    //使用BASE64转译
                    Base64 base64 = new Base64();
                    encode = base64.encodeToString(temp);
                    //encode = new BASE64Encoder().encode(temp);
                    content.append(encode);
                } else {
                    Base64 base64 = new Base64();
                    encode = base64.encodeToString(byteAttr);
                    //encode = new BASE64Encoder().encode(byteAttr);
                    content.append(encode);
                }
            }

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                fis.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return content.toString();
    }
}

即可在控制台输出如下信息

文件转字符串结果:start
SGVsbG8gV29ybGQNCkhlbGxvIEphdmENCi4uLg==
文件转字符串结果:end

其中这个字符串:SGVsbG8gV29ybGQNCkhlbGxvIEphdmENCi4uLg==

就是文件转换之后的字符串,直接传递给其他系统即可。

 

有了这个字符串,假如第三方收到这个字符串,需要把字符串转成文件,

需要定义要生成的文件路径和文件名称,

假如这里拿到这个字符串:【SGVsbG8gV29ybGQNCkhlbGxvIEphdmENCi4uLg==】,和要保存的文件路径:【d:/test1.txt】,这里一定要注意,转出的文件后缀名也要和传递之前的一样,否则生成的文件格式都不正确,那肯定无法正常打开了。

 

执行如下代码:

package com.esoon.capital.test;

import org.apache.commons.codec.binary.Base64;

import java.io.*;

public class String2File {
    public static void main(String[] args) {

        String string = "SGVsbG8gV29ybGQNCkhlbGxvIEphdmENCi4uLg==";
        String filePath = "d:\\test1.txt";
        stirng2File(string, filePath);

    }

    public static void stirng2File(String base64Code, String targetPath) {
        System.out.println("20个字符" + base64Code.substring(0, 50));
        System.out.println("BASE64转译String333:" + base64Code.length());
        byte[] buffer;
        FileOutputStream out = null;
        FileOutputStream out2 = null;
        try {
            Base64 base64 = new Base64();
            //解码
            buffer = base64.decode(base64Code);
            //buffer = new BASE64Decoder().decodeBuffer(base64Code);
            System.out.println("BASE64转译byte111:" + buffer.length);
            //System.out.println("数据为"+temp);
            //System.out.println("buffer长度"+buffer.length);
            out = new FileOutputStream(targetPath);
//            out2 = new FileOutputStream("D:\\test\\1.txt");
            out.write(buffer);
//            out2.write(buffer);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if (out2 != null) {
                try {
                    out2.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        }

    }
}

 

 

得到如下内容

文件和字节流字符串的相互转换【亲测可用】_第2张图片

你可能感兴趣的:(Java基础学习与总结)