質問: a.replace("cpw/mods/fml/common/network/NetworkMod", "versionsmod/src/cpw/mods/fml/common/network/NetworkMod"); zipout.putNextEntry(new ZipEntry(entry.getName())); zipout.write(a.getBytes("ISO-8859-1")); zipout.closeEntry(); ``` entry・・・ZipEntry zipout・・・ZipOutputStream
回答: 少なくとも2つの点からいってご質問のコードでは期待通りのことはできません。 ### 文字列とバイナリーとの変換は非可逆変換 Javaのクラスファイルの中身はテキストではなくバイナリーデータです。クラスファイルの内容を扱うのにStringを用いるのは、質問文にもコメントしておられるとおり無理です。 ### クラスファイルのフォーマット クラスファイル中にある文字列の単純置き換えだけができればよいとして、そこには少々面倒な点があります。 クラスファイルの中身にある文字列は修正UTF-8エンコーディングが用いられているのですが、エンコードされたバイト列に先立ってそのバイト数の情報が格納されてます。 従ってバイナリーデータを置き換えるようなことが可能なライブラリーがあったと仮定してもそう単純には置き換えられません。クラスファイルの中身自体のフォーマットを意識して「ある文字列を表す部分を正確に抜き出し」それを置き換える結果、修正UTF-8エンコーディングでバイト数がどう変化するかも意識して文字列全体を置き換えるような操作が必要です。 例: 文字列 修正UTF-8エンコーディング "abc" 0x00 0x03 0x61 0x62 0x63 "abcd" 0x00 0x04 0x61 0x62 0x63 0x64 上の例では"c"を"cd"に置き換えたものですが、その部分以外に文字列先頭にある0x00 0x03を0x00 0x04に置き換えなければならないといった具合です。 これをするには結局クラスファイルのフォーマットを意識した解析が必要になりますので数十行程度のコードで書けるかと言うとちょっと苦しそうです。多分少なくとも数百行、ことによると1000行以上になるかも知れません。 そのようなものを自前で作るよりはクラスファイルを置換するためのライブラリーをなんとか使うことをまずは検討した方がよいように思います。