Hızlı bir şekilde bir metin dosyasının son satırı okuyun?
[Çok çok] büyük gelen metnin son satırı okumak ve en etkili en hızlı yolu Java dosya nedir?
CEVAP
Aşağıda iki işlevi, bir döndüren son boş olmayan satır dosyası olmadan yükleme veya atlama ile tüm dosya ve diğer döndüren son N çizgilerin dosya olmadan adım ile tüm dosya:
Kuyruk mu ne direk dosyanın Son karaktere zoom, geri, karakter karakter, bir satır sonu bulana kadar gördüğü kayıt adımları. Satır sonu onu bulduğunda, olayın patlak. Kaydedildi ve bir dize içine atar ne ters çevirir ve döndürür. Yeni satır 0xA ve 0xD başı.
Eğer Satır sonları \r\n
crlf
veya başka bir "çift tarzı yeni satır yeni satır", o zaman belirtmek n*2 satır almak için son n hatları çünkü sayıları 2 satır, her satırda.
public String tail( File file ) {
RandomAccessFile fileHandler = null;
try {
fileHandler = new RandomAccessFile( file, "r" );
long fileLength = fileHandler.length() - 1;
StringBuilder sb = new StringBuilder();
for(long filePointer = fileLength; filePointer != -1; filePointer--){
fileHandler.seek( filePointer );
int readByte = fileHandler.readByte();
if( readByte == 0xA ) {
if( filePointer == fileLength ) {
continue;
}
break;
} else if( readByte == 0xD ) {
if( filePointer == fileLength - 1 ) {
continue;
}
break;
}
sb.append( ( char ) readByte );
}
String lastLine = sb.reverse().toString();
return lastLine;
} catch( java.io.FileNotFoundException e ) {
e.printStackTrace();
return null;
} catch( java.io.IOException e ) {
e.printStackTrace();
return null;
} finally {
if (fileHandler != null )
try {
fileHandler.close();
} catch (IOException e) {
/* ignore */
}
}
}
Ama muhtemelen son satırı, son N satır mı istiyorsun, bu yüzden istemiyorum:
public String tail2( File file, int lines) {
java.io.RandomAccessFile fileHandler = null;
try {
fileHandler =
new java.io.RandomAccessFile( file, "r" );
long fileLength = fileHandler.length() - 1;
StringBuilder sb = new StringBuilder();
int line = 0;
for(long filePointer = fileLength; filePointer != -1; filePointer--){
fileHandler.seek( filePointer );
int readByte = fileHandler.readByte();
if( readByte == 0xA ) {
if (filePointer < fileLength) {
line = line 1;
}
} else if( readByte == 0xD ) {
if (filePointer < fileLength-1) {
line = line 1;
}
}
if (line >= lines) {
break;
}
sb.append( ( char ) readByte );
}
String lastLine = sb.reverse().toString();
return lastLine;
} catch( java.io.FileNotFoundException e ) {
e.printStackTrace();
return null;
} catch( java.io.IOException e ) {
e.printStackTrace();
return null;
}
finally {
if (fileHandler != null )
try {
fileHandler.close();
} catch (IOException e) {
}
}
}
Şöyle: yukarıdaki yöntemleri çağırmak
File file = new File("D:\\stuff\\huge.log");
System.out.println(tail(file));
System.out.println(tail2(file, 10));
Uyarı Unicode vahşi Batı'da bu kod, bu işlev çıktı yanlış olur. "Mary?örneğin"yerine "Mary". s hats, accents, Chinese characters vb olabilir karakter çıktı aksan karakteri sonra değiştiriciler olarak eklendiği için yanlış bir neden. Ters bileşik karakterleri ters karakterin kimlik değiştirmektedir. Bu kullanmayı planladığınız tüm dillerde testleri tam bir pil yapmak zorunda olacak.
Bu unicode ters sorun hakkında daha fazla bilgi için bunu okuyun: http://msmvps.com/blogs/jon_skeet/archive/2009/11/02/omg-ponies-aka-humanity-epic-fail.aspx
Nasıl bir metin dosyasının ilk satırı ...
uilabel metin etiketi sığacak şekilde ...
Hızlı bir şekilde kavanoz ayıklamak ve...
Hızlı bir şekilde ve bir iterable sayı...
Eğer bir bağlantı noktası bulmak için ...