商城类网站建设+数据库,wordpress 支付接口,在线修图编辑器免费,旅游网站模板html免费下载最近在项目中遇到一个encoding的问题#xff0c;记录一下。 具体而言就是#xff0c;项目中有A/B两个部分#xff0c;A部分由我们负责#xff0c;Java实现#xff1b;B部分是UK负责的#xff0c;使用Delphi#xff0c;A、B在交互时发送一个http请求#xff0c; 请求汇总…最近在项目中遇到一个encoding的问题记录一下。 具体而言就是项目中有A/B两个部分A部分由我们负责Java实现B部分是UK负责的使用DelphiA、B在交互时发送一个http请求 请求汇总包括一些文本信息header以及一个zip文件body。好了问题出来了当我们发送请求过去时B能接收到请求并读出 header也能读出body部分的zip文件但是读出的zip文件确实corrupted死活不能打开。 -------------------- ---header(文本)- -----body(zip)--- -------------------- 经过无数反复的折腾后与UK的人同步痛苦啊发现我们的系统有问题问题是在于我们在构造请求文件的时候是把zip文件作为一个字符流读取并 添加到一个字符流中然后把这个字符流发送出去。这个body部分加入到body后就成为字符流的一部分结果也带有encoding信息这样发送 到B部分后就无法正确读取了。 ------------------------ ---header(String)--- A ------------------------- ------ httpClient)(String) -------------B -----body(String)---- ------------------------- 正确的做法应该是在读取header部分后转化为字节流存入一个暂时的byte pool中然后再把zip部分也作为一个字节流读出放到上面的byte pool中。最后把这个byte pool 发送 出去。 ------------------------ ---header(string)--- A ------------------------- ------ httpClient)(byte[]) -------------B -----body(byte[])---- ------------------------- 从这个例子可以更加深刻的认识下面的道理 概念 字符流处理的单元为2个字节的Unicode字符分别操作字符、字符数组或字符串而字节流处理单元为1个字节 操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的所以它对多国语言支持性比较好如果是 音频文件、图片、歌曲就用字节流好点如果是关系到中文文本的用字符流好点. 所有文件的储存是都是字节byte的储存在磁盘上保留的并不是文件的字符而是先把字符编码成字节再储存这些字节到磁盘。在读取文件特别是文本文件时也是一个字节一个字节地读取以形成字节序列. 字节流可用于任何类型的对象包括二进制对象而字符流只能处理字符或者字符串 2. 字节流提供了处理任何类型的IO操作的功能但它不能直接处理Unicode字符而字符流就可以。 转换 在从字节流转化为字符流时实际上就是byte[]转化为String时 public String(byte bytes[], String charsetName) 有一个关键的参数字符集编码通常我们都省略了那系统就用操作系统的lang 而在字符流转化为字节流时实际上是String转化为byte[]时 byte[] String.getBytes(String charsetName) 也是一样的道理 Java操作篇 IO分两种流 字节流 InputStream OutputStream 字符流 Reader Writer 他们都是抽象类 具体实现 字节流 FileInputStream FileOutputStream 字符流 FileReader FileWriter 字节流转换成字符流可以用 InputSteamReader OutputStreamWriter 转换成BufferdReader BufferedWriter 他们具有缓冲区 例如读取文件 从字节流输入到字符流输入 定义一个字节流 FileInputStream fileInputStream new FileInputStream(d:/text.txt); // 定义一个指向D:/TEXT.TXT 的字节流 InputStreamReader inputStreamReader new InputStreamReader(fileInputStream); //字节流转换成InputStreamReader BufferedReader bufferedReader new BufferedReader(inputSteamReader); //InputStreamReader 转换成带缓存的bufferedReader 可以把读出来的内容赋值给字符 String ss new String(); String s; while((s bufferedReader.readLine())!null){ ss s; } 例如写入文件 从字节流输出到字符流输出 FileOutputStream fileOutputStream new FileOutputStream(d:/text.txt); //定义一个 指向D:/TEXT.TXT文件 OutputStreamWriter outputStreamWriter new OutputStreamWriter(fileOutputStream); BufferedWriter bufferedWriter new BufferedWriter(outputStreamWriter); bufferedWriter.write(s); bufferedWriter.close(); outputStreamWriter.close(); fileOutputStream.close(); 例程 将字符串转化为字节流#region 将字符串转化为字节流 /** summary /// 将字符串转化为字节流 /// /summary /// param name_Source字串/param /// returns字节流/returns public static byte[] String2Bytes(string strSource) { System.IO.MemoryStream memoryStreamnew System.IO.MemoryStream(); System.IO.BinaryWriter binaryWriternew System.IO.BinaryWriter(memoryStream); binaryWriter.Write( strSource ); byte[] buffermemoryStream.GetBuffer(); return buffer; } #endregion 将字节流转化为字符串#region 将字节流转化为字符串 /** summary /// 将字节流转化为字符串 /// /summary /// param namebytData字节流/param /// returns字串/returns public static string Bytes2String(byte[] bytData) { //字节流-字符串 System.IO.MemoryStream memoryStream2 new System.IO.MemoryStream(bytData); System.IO.BinaryReader binaryReader new System.IO.BinaryReader(memoryStream2); string s2binaryReader.ReadString(); return s2; } #endregion 转载于:https://www.cnblogs.com/toSeeMyDream/p/5599817.html