0

InputStreamReader を使用してバイナリ ファイル (pdf、doc、zip) を読み込もうとしています。FileInputStream を使用してそれを達成し、ファイルの内容をバイト配列に保存しました。しかし、InputStreamReader を使用してそれを行うように求められました。たとえば、次を使用してpdfファイルを開いて読み取ろうとしているとき

File file = new File (inputFileName); 
Reader in = new
InputStreamReader(new FileInputStream(file)); 
char fileContent[] = new char[(int)file.length()]; 
in.read(fileContent); in.close();

次に、このコンテンツを別のpdfファイルに保存します

File outfile = new File(outputFile);
Writer out = new OutputStreamWriter(new FileOutputStream(outfile));
out.write(fileContent);
out.close();

すべてうまくいきます (例外やエラーはありません) が、新しいファイルを開こうとすると、破損しているか、エンコーディングが間違っていると表示されます。

なにか提案を??

ps1特にInputStreamReaderを使用してこれが必要です

ps2 .txt ファイルを読み書きしようとすると正常に動作します

4

2 に答える 2

2

String, char, Reader, WriterJavaのテキスト用です。このテキストは Unicode であるため、すべてのスクリプトを組み合わせることができます。

byte[], InputStream, OutputStreamバイナリデータ用です。それらがテキストを表す場合、それらは何らかのエンコーディングに関連付けられている必要があります。

テキスト データとバイナリ データの間のブリッジには、常に変換が伴います。

あなたの場合:

Reader in = new InputStreamReader(new FileInputStream(file), encoding);
Reader in = new InputStreamReader(new FileInputStream(file)); // Platform's encoding

2 番目のバージョンは移植性がありません。他のコンピューターは任意のエンコーディングを使用できるからです。

あなたの場合、バイナリデータに InputStreamReader を使用しないでください。変換は物を壊すだけです。

たぶん、彼らは次のことを意図していたのでしょう: バイト配列のすべてを読み取らないでください。その場合、BufferedInputStream を使用して小さなバイト配列 (バッファー) を繰り返し読み取ります。

于 2014-10-09T14:30:44.790 に答える
1

リーダー/ライター API を使用しないでください。代わりにバイナリ ストリームを使用します。

File inFile = new File("...");
File outFile = new File("...");
FileChannel in = new FileInputStream(inFile).getChannel();
FileChannel out = new FileOutputStream(outFile).getChannel();

in.transferTo(0, inFile.length(), out);
于 2014-10-09T14:30:26.437 に答える