Попытка прочитать двоичный файл как текст, но сканер останавливается на первой строке - PullRequest
1 голос
/ 18 марта 2011

Я пытаюсь прочитать двоичный файл, но моя программа просто останавливается на первой строке ... Я думаю, это из-за странных символов, которые есть в файле ... Я просто хочу извлечь из него некоторые указания.Есть ли способ сделать это? ..

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:\ Музыка \ Korn \ Untouchables \ 03 Blame.mp3 ".

Ответы [ 3 ]

3 голосов
/ 18 марта 2011

Вы не можете использовать линейно-ориентированный сканер для чтения двоичных файлов. У вас нет гарантии, что в двоичном файле даже есть «строки», разделенные символами новой строки. Например, что бы сделал ваш сканер, если бы ДВА файла соответствовали шаблону «D: \. *. Mp3» без вставки новой строки? Вы извлекли бы все между первым "D: \" и последним ".mp3", со всем мусором между ними. Извлечение имен файлов из потока без разделителей, такого как этот, требует другой стратегии.

Если бы я писал это, я бы использовал относительно простой распознаватель конечных состояний, который обрабатывает символы по одному за раз. Когда он встречает «d», он начинает сохранять символы, проверяя каждый символ, чтобы убедиться, что он соответствует требуемому шаблону, и заканчивается, когда он видит «3» в «.mp3». Если в какой-то момент он обнаруживает неподходящий символ, он сбрасывается и продолжает искать.

РЕДАКТИРОВАТЬ: если файлы, которые будут обрабатываться, имеют небольшой размер (менее 50 МБ или около того), вы можете загрузить весь файл в память, что упростит сканирование.

1 голос
/ 18 марта 2011

Как уже было сказано, поскольку это двоичный файл, вы не можете использовать сканер или другие символьные программы чтения. Вы можете использовать обычный 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

0 голосов
/ 18 марта 2011

Используйте hasNextLine () вместо hasNext() в проверке цикла while.

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