您的位置:首页技术文章
文章详情页

java - 字节流转成字符串之后,在通过字符串转成字节流后的文件为什么会不一样?

浏览:25日期:2024-01-05 11:01:54

问题描述

public static void main(String[] args) throws Exception {File sourceFile = new File('/home/joy/图片/img1-lg.jpg');File tempFile = new File('/home/joy/桌面/TempFile');saveTempFile(sourceFile, tempFile);String str = byteToString(tempFile);File saveFile = new File('/home/joy/桌面/saveFile.jpg');StringTobyte(str,saveFile); } // 保存临时文件 public static void saveTempFile(File sourceFile, File tempFile) throws Exception {FileInputStream inputStream = new FileInputStream(sourceFile);FileOutputStream fileOutputStream = new FileOutputStream(tempFile);byte[] buf = new byte[10 * 1024];int readLeng = 0;while ((readLeng = inputStream.read(buf)) != -1) { fileOutputStream.write(buf, 0, readLeng); fileOutputStream.flush();}fileOutputStream.close();inputStream.close(); } // 文件字节转字符串 public static String byteToString(File file) throws Exception {StringBuilder returnDatas = new StringBuilder();FileInputStream fileInputStream = new FileInputStream(file);byte[] buf = new byte[10 * 1024];int readLenth = 0;while ((readLenth = fileInputStream.read(buf)) != -1) { returnDatas.append(new String(buf,0,readLenth));}fileInputStream.close();return returnDatas.toString(); } // 字符串转文件 public static void StringTobyte(String str,File file) throws Exception {FileOutputStream fileOutputStream = new FileOutputStream(file);fileOutputStream.write(str.getBytes());fileOutputStream.close(); }

代码大意:把一张图片通过字节流转成一个字符串,然后在获取该字符串的字节后还原为文件。理解中,字符只是多带一层编码,还原成字节后应该还是能获取到源文件的呀。

问题解答

回答1:

while ((readLenth = fileInputStream.read(buf)) != -1) { returnDatas.append(new String(buf,0,readLenth));}

二进制图片文件read出来的不是合法的字符串,其中无法解析的二进制数据会被滤掉参考 javadoc 中的描述:

This method always replaces malformed-input and unmappable-character sequences with this charset’s default replacement string.

回答2:

编码和解码不一定是无损的。你从一个图片文件读出一个能无损编解码的字节流的可能性非常小。

new String( new byte[] { 0xff } ).getBytes()=> [-17, -65, -67]回答3:

首先保证序列化,你可以用base64,才能保证转回来没问题

标签: java