在和其他系统做数据交互的时候,通常需要传递一些文件过去,但是文件没法直接放到webservice的字符流里传递,需要把文件转成流,然后其他系统收到后再把流转成文件。
下面是具体例子了
例如,这里D盘根目录下有个test.txt文件
路径为:d:/test.txt;
内容为:
Hello World
Hello Java
...
然后执行如下代码:
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();
}
}
}
}
}
得到如下内容