最近在做项目时遇到这样一个需求:依次读取本地文件夹里所有文件的内容,转为JSON,发送到ActiveMQ的消息队列, 然后从MQ的消息队列上获取文件的信息,依次写到本地。常见的文件类型,比如.txt 和.png等文件的读写并不难。但是,我刚才所提到的需求,如果用常规的方法去读写,比如按字节读取文件内容,转为字符串,再转为JSON发送到MQ的队列,然后从MQ获取原文件信息写到文件,就会发现写出来的文件和文件不一样。我的解决方法是:按字节读取原文件,转为字节数组,将字节数组转为Base64编码格式的字符串,然后转为JOSN发送到MQ,然后从MQ获取到JOSN,将文件内容通过Base64解码为字符数组,写文件到某个路径。以下为代码:

测试类 Test.class

/**
* @Desc: 测试类
* @Date: 2016/7/1
* @Version: 1.0
* @Author: lzy
*/
public class Test {
public static void main(String[] args){ String fileName="JUBE99EGRR311800"; //文件名:测试文件是没有后缀名的二进制
String fileReadPath="d:/read/"; //文件所在文件夹
String filePath=fileReadPath+fileName; //文件路径 //工具类
FileUtil fileUtil=new FileUtil(); //按字节读取文件内容,并转换为Base64编码字符串
String fileJsonStr=fileUtil.fileToJson(fileName,filePath); //文件内容Base64解码,按字节写文件
fileUtil.writeFile(fileJsonStr,"d:/write/");
}
}123456789101112131415161718192021222324 FileUtil.class 文件转换工具类 /**
* @Desc: 文件内容转换工具类
* @Date: 2016/7/1
* @Version: 1.0
* @Author: lzy
*/ public class FileUtil { /**
* 文件内容转为 Base64 编码的 JSON
* @param fileName 文件名
* @param filePath 文件路径
* @return
*/
public String fileToJson(String fileName,String filePath){ String fileContentJson=""; //文件内容转JSON
try {
if(null!=filePath && !filePath.equals("")){
if(null!=fileName && !fileName.equals("")){
//将文件内容转为字节数组
byte[] fileByte=toByteArray(filePath); //将字节数组转为Base64编码
String fileContent=ByteToBase64(fileByte); FileEntity fileEntity=new FileEntity();
fileEntity.setFileName(fileName);
fileEntity.setFileContent(fileContent); //实体转JSON
fileContentJson = FileEntitytoJSON(fileEntity);
}
}
}catch (Exception e){
Log.error("fileToJson error",e);
} return fileContentJson;
} /**
* 将文件转成字节数组
* @param filePath
* @return
*/
public byte[] toByteArray(String filePath){ ByteArrayOutputStream bos=null;
BufferedInputStream in = null;
try {
File f = new File(filePath);
if(f.exists()){
in = new BufferedInputStream(new FileInputStream(f));
bos = new ByteArrayOutputStream((int) f.length()); int buf_size = 1024;
byte[] buffer = new byte[buf_size];
int len = 0;
while (-1 != (len = in.read(buffer, 0, buf_size))) {
bos.write(buffer, 0, len);
}
//return bos.toByteArray();
} } catch (IOException e) {
Log.error("toByteArray() Exception", e);
} finally {
try {
in.close();
bos.close();
} catch (IOException e) {
Log.error("toByteArray() Exception",e);
}
}
return bos.toByteArray();
} /**
* Base64加密
* @param b
* @return
*/
public String ByteToBase64(byte[] b) {
String str="";
if(null!=b){
BASE64Encoder encoder = new BASE64Encoder();
str=encoder.encode(b);
}
return str;
} /**
* Base64解密
* @param str
* @return
*/
public byte[] Base64toByte(String str) {
byte[] b = new byte[0];
BASE64Decoder decoder = new BASE64Decoder();
try {
if(null!=str && !str.equals("")){
b = decoder.decodeBuffer(str);
}
} catch (IOException e) {
Log.error("Base64toByte() Exception",e);
}
return b;
} /**
* 实体转JSON
* @param fileEntity
* @return
*/
public String FileEntitytoJSON(FileEntity fileEntity) {
String str="";
if(null!=fileEntity){
JSONObject json = JSONObject.fromObject(fileEntity);
str = json.toString();
}
return str;
} /**
* JSON转实体
* @param msg
* @return
*/
public FileEntity JSONtoFileEntity(String msg) {
FileEntity fileEntity=new FileEntity();
if(null!=msg && !msg.equals("")){
JSONObject obj = new JSONObject().fromObject(msg);
fileEntity = (FileEntity) JSONObject.toBean(obj, FileEntity.class);
}
return fileEntity;
} /**
* 写文件
* @param fileJson json
* @param filePath 文件路径
*/
public void writeFile(String fileJson,String filePath){
FileOutputStream fos=null;
try{ if(null!=fileJson && !fileJson.equals("")){
if(null!=filePath && !filePath.equals("")){
//json转为文件实体
FileEntity fileEntity=JSONtoFileEntity(fileJson); //Base64文件内容解码
byte[] b=Base64toByte(fileEntity.getFileContent()); File file=new File(filePath);
if (!file.exists()) {
file.mkdirs();
} fos = new FileOutputStream(filePath + File.separator +fileEntity.getFileName());
fos.write(b);
}
} }catch (Exception e){
Log.error("write Exception:",e);
}finally {
try {
fos.close();
} catch (IOException e) {
Log.error("fos.close() Exception:", e);
}
} }
}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 FileEntity.class 文件实体类 /**
* @Desc:文件信息实体
* @Date: 2016/6/29
* @Version: 1.0
* @Author: lzy
*/
public class FileEntity {
private String fileName; //文件名
private String fileContent; //文件内容 public String getFileName() {
return fileName;
} public void setFileName(String fileName) {
this.fileName = fileName;
} public String getFileContent() {
return fileContent;
} public void setFileContent(String fileContent) {
this.fileContent = fileContent;
}
}

java 按字节读写二进制文件(Base64编码解码)的更多相关文章

  1. Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net

    Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net 1. Base64编码, 1 1.1. 子模式 urlsafe Or  url  ...

  2. Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net

    Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net 1. Base64编码,1 1.1. 子模式 urlsafe Or  url u ...

  3. delphi Base64编码/解码及数据压缩/解压知识

    一.Base64编码/解码 一般用到的是Delphi自带的单元EncdDecd,当然还有第三方提供的单元或控件,其中我所接触到的认为比较好的有Indy的TIdMimeEncode / TIdMimeD ...

  4. Delphi Base64编码/解码及ZLib压缩/解压

    最近在写的程序与SOAP相关,所以用到了一些Base64编码/解码及数据压缩/解压方面的知识. 在这里来作一些总结:   一.Base64编码/解码   一般用到的是Delphi自带的单元EncdDe ...

  5. 《PHP 实现 Base64 编码/解码》笔记

    前言 早在去年 11 月底就已经看过<PHP 实现 Base64 编码/解码>这篇文章了,由于当时所掌握的位运算知识过于薄弱,所以就算是看过几遍也是囫囵吞枣一般,不出几日便忘记了其滋味. ...

  6. OpenSSL 使用 base64 编码/解码

    简述 关于 OpenSSL 的介绍及安装请参见:Windows下编译OpenSSL 下面主要介绍有关 OpenSSL 使用 base64 编码/解码. 简述 编码解码 更多参考 编码/解码 #incl ...

  7. 利用openssl进行BASE64编码解码、md5/sha1摘要、AES/DES3加密解密

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  8. Javascript中Base64编码解码的使用实例

    Javascript为我们提供了一个简单的方法来实现字符串的Base64编码和解码,分别是window.btoa()函数和window.atob()函数. 1 var encodedStr = win ...

  9. Code:Base64 编码/解码

    ylbtech-Code:Base64 编码/解码 1. C#返回顶部 1.编码 byte[] inArray = new byte[msgTxt.Length]; int x; ; x < m ...

随机推荐

  1. [EXP]Adobe ColdFusion 2018 - Arbitrary File Upload

    # Exploit Title: Unrestricted # Google Dork: ext:cfm # Date: -- # Exploit Author: Pete Freitag of Fo ...

  2. python 使用PyInstaller将程序打包

    PyInstaller可以用来打包python应用程序,打包完的程序就可以在没有安装Python解释器的机器上运行了.类似于C#窗体程序使用Setup Factory 9 Trial进行打包. 安装: ...

  3. Docker学习之4——构建NGINX镜像

    Nginx是一个高性能的Web和反向代理服务器,它具有很多非常优越的特性:1.作为Web服务器.2.作为负载均衡服务器.3.作为邮件代理服务器.4.安装及配置简单.接下来我们介绍在docker构建ng ...

  4. Django--models--多表操作

    一 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关 ...

  5. PHP 网页数据api采集

    一个简单的数据采集,这里用的方法是API数据采集 //api地址,读取文本 $result = file_get_contents("https://feed.mix.sina.com.cn ...

  6. openssl签署和自签署证书的多种实现方式

    openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 1.采用自定义配置文件的实现方法 1.1 自建CA 自建CA的机制:1.生成 ...

  7. 按值传递 vs. 按指针传递

    按值传递还是指针传递? 变量赋值有两种方式:按值传递.按"指针"传递(指针也常称为"引用").不同的编程语言赋值的方式不一样,例如Python是按"指 ...

  8. springboot:Java模板引擎Thymeleaf介绍

    Thymeleaf是一款用于渲染XML/XHTML/HTML5内容的模板引擎.类似JSP,Velocity,FreeMaker等,它也可以轻易的与Spring MVC等Web框架进行集成作为Web应用 ...

  9. 【IDEA&&Eclipse】2、从Eclipse转移到IntelliJ IDEA一点心得

    本人使用IntelliJ IDEA其实并不太久,用了这段时间以后,觉得的确很是好用.刚刚从Eclipse转过来的很多人开始可能不适应,我就把使用过程中的一些经验和常用功能分享下,当然在看这篇之前推荐你 ...

  10. Java_多项式加法

    题目内容: 一个多项式可以表达为x的各次幂与系数乘积的和,比如: 2x6+3x5+12x3+6x+20 现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出. ...