8

最初にある程度のプレーンテキストが含まれ、最後にバイナリコンテンツが続くファイルがあります。バイナリ コンテンツのサイズは、読み取ったプレーン テキスト行のいずれかによって決まります。

個々の行を読み取るために a を使用していBufferedReaderましたが、バイト配列を読み取るために参照するメソッドは公開されていません。readUTFfor aDataInputStreamは行末まで読み取らず、このメソッドreadLineは非推奨です。

基礎となるものを使用しFileInputStreamて読み取ると、空のバイト配列が返されます。これをどうするかについての提案はありますか?


private DOTDataInfo parseFile(InputStream stream) throws IOException{
DOTDataInfo info = new DOTDataInfo();
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
int binSize = 0;
String line;
while((line = reader.readLine()) != null){
    if(line.length() == 0)
        break;
    DOTProperty prop = parseProperty(line);
    info.getProperties().add(prop);
    if(prop.getName().equals("ContentSize"))
        binSize = Integer.parseInt(prop.getValue());
}
byte[] content = new byte[binSize];
stream.read(content); //Its all empty now. If I use a DataInputStream instead, its got the values from the file
return info;
}
4

7 に答える 7

5

を使用できますRandomAccessFilereadLine()最初にプレーン テキストを読み取り (API で説明されているように、これには制限があることに注意してください)、その後またはreadByte()後続readFully()のバイナリ データを読み取るために使用します。

基礎となるものを使用しFileInputStream て読み取ると、空のバイト配列が返されます。

これは、ストリームを でラップしたためですBufferedReader。バッファがいっぱいになると、おそらくストリームからすべてのバイトが消費されます。

于 2009-02-20T07:53:06.283 に答える
4

(ネットワークストリームなど、検索が難しいものではなく)本当にファイルがある場合は、次のようなものをお勧めします。

  • ファイルをFileInputStreamとして開きます
  • InputStreamReaderとBufferedReaderでラップします
  • テキストを読んで、コンテンツの量を確認してください
  • BufferedReaderを閉じます(FileInputStreamを閉じるInputStreamReaderを閉じます)
  • ファイルを再度開く
  • (ファイルの合計の長さ-バイナリコンテンツの長さ)にスキップします
  • 残りのデータを通常どおりに読み取ります

mark()ファイルを再度開かないようにする場合は、FileInputStreamの開始時に呼び出しreset()skip()から、適切な場所に移動することができます。(探していたのInputStream.seek()ですが、表示されません。以前Javaで欲しかったことを思い出せませんが、実際にはありませんか?Ick。)

于 2009-02-20T08:01:36.527 に答える
2

InputStream を使用する必要があります。リーダーは文字データ用です。次のように、入力ストリームを DataInputStream でラップすることを検討してください。

stream=new DataInputStream(new BufferedInputStream(new FileInputStream(...)));

データ入力ストリームは、さまざまなタイプのデータを読み取るための多くの便利なメソッドを提供します。もちろん、バイトを読み取るための基本的な InputStream メソッドも提供します。

(これは、コンテンツを含むリクエストを読み取るために HTTP サーバーが実際に行う必要があることです。)


readUTF は行を読み取るのではなく、(変更された) UTF8 形式で記述された文字列を読み取ります。JavaDoc を参照してください。

于 2009-02-20T07:49:10.457 に答える
1

残念ながら、DataInputStream非推奨であり、UTF を処理しません。しかし、これは役に立ちます (先読みなしでバイナリ ストリームから行を読み取ります)。

public static String lineFrom(InputStream in) throws IOException {
    byte[] buf = new byte[128];
    int pos = 0;
    for (;;) {
        int ch = in.read();
        if (ch == '\n' || ch < 0) break;
        buf[pos++] = (byte) ch;
        if (pos == buf.length) buf = Arrays.copyOf(buf, pos + 128);
    }
    return new String(Arrays.copyOf(buf, pos), "UTF-8");
}
于 2009-07-31T12:48:31.857 に答える
0

正しい方法は、何らかの形式の InputStream を使用することです。これがパフォーマンスの障壁にならない限り、おそらく FileInputStream です。

「基になる FileInputStream を使用して読み取ると、空のバイト配列が返される」とはどういう意味ですか? これは非常にありそうになく、おそらくあなたの間違いです。試したサンプルコードを見せてもらえますか?

于 2009-02-20T07:48:45.967 に答える
0

テキストは BufferedReader で読むことができます。バイナリの開始位置がわかったら、ファイルを閉じて RandomAccessFile で開き、ファイル内の任意の場所からバイナリを読み取ることができます。または、ファイルをバイナリとして読み取り、テキストとして識別したセクションをテキストに変換することもできます。{新しい文字列 (バイト、エンコーディング) の使用}

于 2009-02-20T07:49:33.453 に答える
0

DataInputStreamを使用することをお勧めします。次のオプションがあります。

  • DataInputStream を使用してテキストとバイナリ コンテンツの両方を読み取る
  • BufferedReader を開き、テキストを読み取り、ストリームを閉じます。次に、DataInputStream を開き、テキストのサイズに等しいバイトをスキップして、バイナリ データを読み取ります。
于 2009-02-20T07:56:39.037 に答える