Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将文件转换为字节数组再转换为字符串的更有效方法_Java_String_File_Bytearray - Fatal编程技术网

Java 将文件转换为字节数组再转换为字符串的更有效方法

Java 将文件转换为字节数组再转换为字符串的更有效方法,java,string,file,bytearray,Java,String,File,Bytearray,我有下面的方法将文件转换为字节数组,而不是字符串 InputStream is = new FileInputStream(new File("c:/original.png")); String temp = Hex.encodeHexString(IOUtils.toByteArray(is)); System.out.println(temp); byte[] b = Hex.decodeHex(temp .toCharArr

我有下面的方法将文件转换为字节数组,而不是字符串

        InputStream is = new FileInputStream(new File("c:/original.png"));
        String temp = Hex.encodeHexString(IOUtils.toByteArray(is));
        System.out.println(temp);
        byte[] b = Hex.decodeHex(temp .toCharArray());
        OutputStream out = new FileOutputStream(new File("c:/copy.png"));
        IOUtils.write(b, out);
它工作正常。问题在于
temp
字符串的大小。如果
c:/original.png
文件为
1523KB
,则
temp
大小为
3046KB
。是否有更有效的方法将文件转换为不会使文件大小加倍的字符串?(顺便说一句,我明白为什么它的大小是原来的两倍)

或者,如何压缩
temp
字符串


至于字符串的原因。它存储在只接受字符串的缓存中。该文件实际上已上载到web服务器。一旦上传即将被下载,它将从缓存中而不是从数据库中提取。缓存通过预测来提高搜索性能,我不希望每次有人搜索时都调用数据库

一种比十六进制更有效的编码是Base64,对于大文件,开销趋向于至少37%。不幸的是,它没有标准库,但ApacheCommons包含一个类来实现这一点

        String temp = Base64.encodeBase64String(IOUtils.toByteArray(is));            
        byte[] b = Base64.decodeBase64(s);

请澄清为什么需要将二进制数据存储在
字符串中
?为什么要将其作为字符串?它只是在屏幕上渲染吗?你甚至需要十六进制编码的字符串吗?如果没有,请跳过该步骤并直接使用字节数组。您可以尝试以某种方式压缩字符串(RLE等),但由于单个字节必须由两个十六进制数字表示,因此无法减小普通副本的大小。此外,如果只是制作副本,则不需要将整个文件存储在内存中。读取2K字节并写入它们,然后读取随后的2K字节并写入它们,等等@Mat,两点:首先-如果编码/解码正确,您应该逐字返回输入文件-而不是50%大。第二,内存使用量仍然是输入大小的3倍,因为字符串字符是16位。我确信可以使用大部分unicode空间进行编码,并使其接近统一。不过,我在货架上找不到。