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

时间:2017-08-08 16:39:45

标签: java file-io io binary datainputstream

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

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

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

2 个答案:

答案 0 :(得分:1)

您的use POSIX qw( strftime ); use Time::Local qw( timegm ); my $Y = ...; my $m = ...; my $d = ...; my $epoch = timegm(0, 0, 0, $d, $m-1, $Y-1900); my $dow_name = strftime("%A", gmtime($epoch)); 对象永远不会被修改,因为DataInputStream是函数DataInputStream in的本地对象。

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

因此,调用应为readSong(),并从您的函数song = process.readSong( fileName , read );中删除本地DataInputStream in

答案 1 :(得分:0)

在readSong方法中放入while循环然后它只会逐行读取文件。 在第一种方法中不需要while循环,你只需要将filename传递给readsong方法。