尝试将二进制文件作为文本读取,但扫描程序在第一行停止

时间:2011-03-18 02:14:52

标签: java binaryfiles java.util.scanner

我正在尝试读取二进制文件,但我的程序只是在第一行停止.. 我认为这是因为文件有奇怪的字符..我只是想从中提取一些方向。有没有办法做到这一点?..

public static void main(String[] args) throws IOException
{

    Scanner readF = new Scanner(new File("D:\\CurrentDatabase_372.txt"));
    String line = null;
    String newLine = System.getProperty("line.separator");
    FileWriter writeF = new FileWriter("D:\\Songs.txt");

    while (readF.hasNext())
    {
        line = readF.nextLine();

        if (line.contains("D:\\") && line.contains(".mp3"))
        {
            writeF.write(line.substring(line.indexOf("D:\\"), line.indexOf(".mp3") + 4) + newLine);
        }
    }

    readF.close();
    writeF.close();
}

文件的开头如下:

pppppamepD:\Music\Korn\Untouchables\03     Blame.mp3pmp3pmp3pKornpMetalpKornpUntouchablespKornpUntouchables*;*KornpKornpKornUntouchables003pMetalKornUntouchables003pBlameKornUntouchables003pKornKornUntouchables003pMP3pppppCpppÀppp@ppøp·pppŸú#pdppppppòrSpUpppppp€ppªp8›qpppppppppppp,’ppÒppp’ÍpET?ppppppôpp¼}`Ñ#ãâK†¡H¤*(DppppppppppppppppuÞѤéú:M®$@]jkÝW0ÛœFµú½XVNp`w—wâÊp:ºŽwâÊpppp8Npdpp¡pp{)pppppppppppppppppyY:¸[ªA¥Bi   `Û¯pppppppppppp2pppppppppppppppppppppppppppppppppppp¿ÞpAppppppp€ppp€;€?€CpCpC€H€N€S€`€e€y€~p~p~€’€«€Ê€â€Hollow LifepD:\Musica\Korn\Untouchables\04 Hollow Life.mp3pmp3pmp3pKornpMetalpKornpUntouchablespKornpUntouchables*;*KornpKornpKornUntouchables004pMetalKornUntouchables004pHollow LifeKornUntouchables004pKornKornUntouchables004pMP3pppppCpppÀHppppppøp¸pppǺxp‰ppppppòrSpUpppppp€ppªp8›qpppppppppppp,’ppÒpppŠºppppppppppôpp¼}`Ñ#ãâK†¡H¤*(DpppppppppppppppppãG#™R‚CA—®þ^bN °mbŽ‚^¨pG¦sp;5p5ÓÐùšwâÊp
)ŽwâÊpppp8Npdpp!cpp{pppppppppppppppppyY:¸[ªA¥Bi `ۯǺxp‰pppppp2pppppppppppppppppppppppppppppppppppp¿

我想提取文件说明,例如“D:\ Music \ Korn \ Untouchables \ 03 Blame.mp3”。

3 个答案:

答案 0 :(得分:3)

您不能使用面向行的扫描程序来读取二进制文件。您无法保证二进制文件甚至具有换行符分隔的“行”。例如,如果有两个文件匹配模式“D:\。*。mp3”没有插入换行符,你的扫描仪会做什么?您将在第一个“D:\”和最后一个“.mp3”之间提取所有内容,其中包含所有垃圾。从诸如此类的非分隔流中提取文件名需要不同的策略。

如果我写这篇文章,我会使用一个相对简单的有限状态识别器,一次处理一个字符。当它遇到“d”时,它开始保存字符,检查每个字符以确保它匹配所需的模式,当它在“.mp3”中看到“3”时结束。如果它在任何时候检测到一个不适合的角色,它会重置并继续寻找。

编辑:如果要处理的文件很小(小于50mb左右),你可以将整个文件加载到内存中,这样可以简化扫描。

答案 1 :(得分:1)

如前所述,由于它是二进制文件,因此您无法使用扫描仪或其他基于字符的阅读器。您可以使用常规FileInputStream来读取文件的实际原始字节。 Java的String类有一个构造函数,它将获取一个字节数组并将它们转换为字符串。然后,您可以在该字符串中搜索文件名。如果您只使用默认字符集,这可能会有效。

的字符串(字节[]): http://download.oracle.com/javase/1.4.2/docs/api/java/lang/String.html 用于读取字节的FileInputStream: http://download.oracle.com/javase/tutorial/essential/io/bytestreams.html

答案 2 :(得分:0)

在while循环检查中使用hasNextLine()代替hasNext()

while (readF.hasNextLine()) {
 String line = readF.nextLine();
 //Your code
 }