SORU
26 Mart 2009, PERŞEMBE


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
6 EYLÜL 2011, Salı


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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • fireflame65

    fireflame65

    27 Mart 2007
  • Alexey - servant of Christ

    Alexey - ser

    15 EYLÜL 2007
  • MisterBrightside

    MisterBright

    24 Mart 2006