从二进制文件中读取数据(Java)?

3
为了一个课程项目,我需要创建一个程序来根据用户输入将二进制数据写入文件并读取到控制台。这需要使用两个不同的程序进行处理数据和获取用户输入。每当我尝试列出文件的内容时,它总是打印最后一项。我的代码有什么问题?
以下是处理用户输入并在控制台上打印的相关部分代码:
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;
}

你能发布一些示例数据吗?@Becca - cunniemm
1
我会预期第一个代码片段中的 while 循环是无限的,因为 read 从未被读取,因此它应该始终有剩余数据。 - clabe45
你不需要,也不应该使用 available()。它并不会做你想要的事情。 - Kayaman
2个回答

1
您的DataInputStream对象从未被修改,因为DataInputStream in是函数readSong()中的局部变量。
您需要在函数readSong()中传递DataInputStream对象read的引用。
因此,调用应该是song = process.readSong( fileName , read );并从函数readSong()中删除局部变量DataInputStream in

成功了!但是,不知道为什么,只有二进制文件中列出的第一首歌曲被打印到控制台。你有什么想法吗? - Becca

0
将 while 循环放入 readSong 方法中,那么它只会逐行读取文件。 在第一个方法中不需要 while 循环,你只需要传递文件名到 readsong 方法即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接