Започнете да четете текстов файл от определен ред

Има ли начин да напишете текстов файл, да прочетете няколко реда, да го затворите, да го отворите отново и да започнете да четете от реда, където сте спрели преди? Или винаги трябва да започнете отгоре?


person Emil D    schedule 12.01.2011    source източник
comment
Е, какво ще стане, ако съдържанието на файла се промени между времето, когато затворите и отворите отново файла? Същият ред все още ли ще бъде уместен, за да започнете да четете отново?   -  person Mike Atlas    schedule 12.01.2011
comment
Предполагам, че можете да добавяте само към файла.   -  person Emil D    schedule 12.01.2011
comment
Искате да кажете, че приемате, че вашият код е единственият възможен код, който ще чете/записва във файла, и той само ще се добавя към него? Ако е така, защо просто не оставите файла отворен?   -  person Mike Atlas    schedule 12.01.2011
comment
Не, моят код не е единственият код за достъп до файла. Но това е нещо като лог файл, така че всеки, който пише в него, вероятно ще го добавя само.   -  person Emil D    schedule 12.01.2011


Отговори (4)


Просто бих започнал от върха всеки път. Това е най-простият и вероятно не много по-бавен. Можете да използвате RandomAccessFile, но ще трябва да го обвиете с вашия собствен четец на редове (както и да поставите известна проверка дали файлът не е променен по несъвместим начин)

person Peter Lawrey    schedule 12.01.2011
comment
Всъщност търсенето е МНОГО по-бързо от четенето на целия файл до желаното място. Така че RandomAccessFile е начин да отидете. Освен това обвивката за него не е толкова трудна за писане или дори намиране в интернет. - person bezmax; 12.01.2011
comment
Добре, току-що проверих API и забелязах, че RandomAccessFile вече има String readLine() имплементиран. - person bezmax; 12.01.2011
comment
Можете да четете със скорост от 100 MB/секунда файл, който току-що сте прочели. Така че повторното четене на файл от 10 MB отнема около 100 ms. Ако имате текстов файл от 10 GB, това може да направи истинска разлика. - person Peter Lawrey; 12.01.2011
comment
Струва си да прочетете коментарите за RandomAccessFile.readLine(), тъй като не прави никакво кодиране на знаци. Предполага се, че всички данни са ASCII. - person Peter Lawrey; 12.01.2011
comment
Едно нещо обаче не разбрах от документацията на RandomAccessFile: можете ли да използвате този клас за работа с обикновен текстов файл? - person Emil D; 12.01.2011

Със сигурност можете! Това няма да е най-бързият метод, но ще работи. И, между другото, хората, които отговориха на въпроса ви, като ви казаха, че просто трябва да започнете да преработвате от началото на файла НАПЪЛНО пропуснаха смисъла на въпроса ви. Има много причини да искате да се върнете там, откъдето сте спрели.

Ето някакъв код, който написах, който ви позволява да съхранявате стойност на брояча и след това да обикаляте файла, докато достигнете отново стойността на брояча... в който момент цикълът се отразява и обработва това, което е в цикъла за останалите редове .

наздраве!

//define input text file
def file = new File('C:\\inputtextfile.txt')
//define file for the last referenced counter
def CountFile = new File ('C:\\prime\\lastcount.txt')

//if the counter was null set it to zero
if (CountFile.eachLine({it}) == null){
CountFile.write('0')
}

//read the counter into a value
StartLine = CountFile.eachLine( {it} ) as long
//set the first line of the file
lineCount=0

file.eachLine { line  ->
if (lineCount >= StartLine){


//write the counter to a text file
////////////////////////////////////////////////////////////////
CountFile.write(lineCount.toString())
    lineCount++
///////////////////////////////////////////////////////////////
}
person JohnKubik    schedule 24.07.2012

Сигурен съм, че всеки път, когато отворите файл, той започва отначало.

person David Weiser    schedule 12.01.2011

Не можете ли просто да запазите номера на реда външно и да преминете към / да потърсите желаната позиция?

person mmoment    schedule 12.01.2012