2017-08-08 53 views
3

对于我正在开发的课程,我必须创建一个将二进制数据写入文件(基于用户输入)的程序,然后将其读取到控制台。这是通过两个独立的程序完成的,一个处理数据和一个获取用户输入。每当我尝试列出文件的内容时,它都会一遍又一遍地打印最后一个项目。我的代码有什么问题?从二进制文件(Java)读取数据?

下面是该方案的相关部分是处理用户输入并打印到控制台:

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"); 
} 

这里的处理数据,并从二进制文件中读取它的程序的相关部分:

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; 
} 
+0

你可以张贴一些示例数据吗? @Becca – cunniemm

+1

我期望第一个代码片段中的while循环是无限的,因为'read'永远不会被读取,所以它应该总是保留数据。 – clabe45

+0

你不需要,也不应该使用'available()'。它不会做你认为它做的事。 – Kayaman

回答

1

您的DataInputStream对象永远不会被修改,因为DataInputStream in是本地功能readSong()

您需要通过您的DataInputStream对象的读取在函数readSong()中的引用。

因此调用是song = process.readSong(fileName , read);并移除功能当地DataInputStream inreadSong()

+0

它的工作!但是,无论出于何种原因,只有二进制文件中列出的第一首歌才会打印到控制台。任何想法为什么? – Becca

0

把while循环放在readSong方法中,只有它会逐行读取文件。 while循环在第一个方法中不需要,您只需要将文件名传递给readsong方法。