【问题标题】:Reading data from binary file (Java)?从二进制文件(Java)中读取数据?
【发布时间】:2018-01-16 08:14:42
【问题描述】:

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

这是处理用户输入并打印到控制台的程序的相关部分:

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

【问题讨论】:

  • 你能发布一些示例数据吗? @贝卡
  • 我希望第一个代码 sn-p 中的 while 循环是无限的,因为永远不会读取 read,所以它应该总是有数据剩余。
  • 您不需要也不应该使用available()。它没有做你认为它做的事情。

标签: java file-io io binary datainputstream


【解决方案1】:

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

您需要在函数readSong() 中传递您的DataInputStream 对象read 的引用。

所以调用应该是song = process.readSong( fileName , read );,并从你的函数readSong()中删除本地DataInputStream in

【讨论】:

  • 成功了!但是,无论出于何种原因,只有二进制文件中列出的第一首歌曲被打印到控制台。知道为什么吗?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-07-27
    • 1970-01-01
    • 2015-06-27
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 2019-04-04
    • 2016-01-10
    相关资源
    最近更新 更多