[英]Trying to read binary file as text but scanner stops at first line
我正在嘗試讀取二進制文件,但我的程序只停在第一行..我認為這是因為文件有奇怪的字符..我只是想從中提取一些方向。 有沒有辦法做到這一點?..
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”。
您不能使用面向行的掃描程序來讀取二進制文件。 您無法保證二進制文件甚至具有換行符分隔的“行”。 例如,如果有兩個文件匹配模式“D:\\。*。mp3”沒有插入換行符,你的掃描儀會做什么? 您將在第一個“D:\\”和最后一個“.mp3”之間提取所有內容,其中包含所有垃圾。 從諸如此類的非分隔流中提取文件名需要不同的策略。
如果我寫這篇文章,我會使用一個相對簡單的有限狀態識別器來逐個處理字符。 當它遇到“d”時,它開始保存字符,檢查每個字符以確保它匹配所需的模式,當它在“.mp3”中看到“3”時結束。 如果它在任何時候檢測到一個不適合的角色,它會重置並繼續尋找。
編輯:如果要處理的文件很小(小於50mb左右),您可以將整個文件加載到內存中,這將使掃描更簡單。
如前所述,由於它是二進制文件,因此您無法使用掃描儀或其他基於字符的閱讀器。 您可以使用常規FileInputStream
來讀取文件的實際原始字節。 Java的String
類有一個構造函數,它將獲取一個字節數組並將它們轉換為字符串。 然后,您可以在該字符串中搜索文件名。 如果您只使用默認字符集,這可能會有效。
String(byte []): 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
在while循環檢查中使用hasNextLine()而不是hasNext()
。
while (readF.hasNextLine()) {
String line = readF.nextLine();
//Your code
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.