2011-10-19 3 views
1

ファイルをバイト配列に変換する方法と、stringとbackに変換する方法があります。ファイルをバイト配列に変換するより効果的な方法

 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ファイルがtempより1523KBの場合、サイズは3046KBです。ファイルのサイズを倍にしない文字列にファイルを変換するより効果的な方法はありますか? (私はそれが約2倍のサイズである理由を理解しています)

また、temp文字列を圧縮するにはどうすればいいですか?

これまでのところ、文字列の理由です。これは、文字列だけをとるキャッシュに格納されています。ファイルは実際にWebサーバーにアップロードされます。アップロードをダウンロードしようとすると、データベースからではなくキャッシュから取得されます。そして、キャッシュは、私が誰かが検索するたびにデータベースを呼びたくないという予測によって検索パフォーマンスを向上させるためにあります。

+3

*なぜ*文字列にバイナリデータを格納する必要があるのか​​分かりますか? – NPE

+0

なぜそれを文字列として使用したいですか?画面に表示するだけですか? –

+0

16進数でエンコードされた文字列も必要ですか?そうでない場合は、そのステップをスキップしてバイト配列を直接使用します。 – millimoose

答えて

3

Hexよりも効率的なエンコーディングは、Base64です。オーバーヘッドは、大きなファイルの場合、最低でも約37%になります。残念ながら、標準ライブラリはありませんが、Apache Commonsにはこれを行うためのクラスが含まれています。

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

より正確には、Apache Commons codecです。 –

+0

@Mat、2点:まず、正しくエンコード/デコードされた場合、入力ファイルを元に戻してください。これは50%大きくはありません。第2に、文字列の文字は16ビットなので、メモリ使用量は入力サイズの3倍です。私は、大部分のUnicode空間を使用し、これをほぼ単一性にするエンコードが可能であると確信しています。しかし、私は棚から1つを見つけることができません。 –

関連する問題