2017-08-08 40 views
3

私が取り組んでいるクラスでは、バイナリデータを(ユーザー入力に基づいて)ファイルに書き込み、それをコンソールに読み込むプログラムを作成する必要があります。これは、データを処理するプログラムとユーザー入力を取得するプログラムの2つの別々のプログラムで行われます。ファイルの内容をリストしようとすると、最後の項目が何度も何度も印刷されます。私のコードの問題は何ですか?バイナリファイル(Java)からデータを読み込む?

public String readSong(String fileName) 
{ 
    DataInputStream in = null; 

    String sTitle; 
    String sArtist; 
    String sGenre; 

    String song = null; 

    try 
    { 
     in = new DataInputStream(
      new BufferedInputStream(
      new FileInputStream(fileName))); 

     sTitle = in.readUTF(); 
     sArtist = in.readUTF(); 
     sGenre = in.readUTF(); 

     song = sTitle + "\t" + sArtist + "\t" + sGenre; 

     in.close(); 
    } 

    catch(Exception ex) 
    { 
     System.out.println("Error"); 
    } 

    return song; 
} 

String song = null; 

try 
{ 
    DataInputStream read = new DataInputStream(
    new FileInputStream(fileName)); 

    while(read.available() > 0) 
    { 
     song = process.readSong(fileName); 
     System.out.println(song); 
    } 
} 

catch(Exception e) 
{ 
    System.out.println("Error"); 
} 

ここでデータを処理し、バイナリファイルから読み込むプログラムの関連部分があります:

はここで、コンソールにユーザーの入力やプリントを処理するプログラムの関連部分です

+0

をローカルDataInputStream inを削除する必要がありますが、いくつかのサンプルデータをください投稿することができますか? @Becca – cunniemm

+1

'read'は決して読み込まれないので、最初のコードスニペットのwhileループは無限になると期待します。したがって、常にデータが残っているはずです。 – clabe45

+0

あなたはする必要はありませんし、 'available()'を使うべきではありません。それはあなたが思っていることをしません。 – Kayaman

答えて

1

は、機能readSong()にローカルなので、変更されません。DataInputStreamオブジェクトは決して変更されません。

DataInputStreamオブジェクトの参照番号readSong()に渡す必要があります。

だからコールはsong = process.readSong(fileName , read);なると、あなたの関数からreadSong()

+0

それは働いた!しかし何らかの理由で、バイナリファイルにリストされている最初の曲だけがコンソールに印刷されています。どんな考え? – Becca

0

put whileループでreadSongメソッドを実行すると、ファイルを1行ずつ読み込みます。 最初のメソッドでは、filenameをreadsongメソッドに渡すだけで、ループは必要ありません。