2010-09-08 24 views
9

Tôi muốn sao chép 10MB cuối cùng của tệp có thể lớn vào tệp khác. Lý tưởng nhất là tôi sẽ sử dụng FileInputStream, skip() và sau đó read(). Tuy nhiên tôi không chắc chắn nếu hiệu suất của skip() sẽ là xấu. Là bỏ qua() thường được thực hiện bằng cách sử dụng một tập tin tìm kiếm bên dưới hoặc nó thực sự đọc và loại bỏ dữ liệu?FileInputStream.skip() có tìm kiếm không?

Tôi biết về RandomAccessFile nhưng tôi quan tâm đến việc liệu tôi có thể sử dụng FileInputStream thay cho điều đó (RandomAccessFile gây khó chịu vì API không chuẩn).

+0

Tôi chỉ quên nếu tôi thử nghiệm này trên JVM oracle hoặc android, nhưng FileInputStream.skip() kiểm tra các giá trị âm. –

Trả lời

15

Phụ thuộc vào JVM của bạn, nhưng đây là nguồn cho FileInputStream.skip() cho một openjdk gần đây:

JNIEXPORT jlong JNICALL 
Java_java_io_FileInputStream_skip(JNIEnv *env, jobject this, jlong toSkip) { 
    jlong cur = jlong_zero; 
    jlong end = jlong_zero; 
    FD fd = GET_FD(this, fis_fd); 
    if (fd == -1) { 
     JNU_ThrowIOException (env, "Stream Closed"); 
     return 0; 
    } 
    if ((cur = IO_Lseek(fd, (jlong)0, (jint)SEEK_CUR)) == -1) { 
     JNU_ThrowIOExceptionWithLastError(env, "Seek error"); 
    } else if ((end = IO_Lseek(fd, toSkip, (jint)SEEK_CUR)) == -1) { 
     JNU_ThrowIOExceptionWithLastError(env, "Seek error"); 
    } 
    return (end - cur); 
} 

Hình như nó đang làm một seek(). Tuy nhiên, tôi không thấy lý do tại sao RandomAccessFile là không chuẩn. Đó là một phần của gói java.io và kể từ phiên bản 1.0.

+1

Cảm ơn. Khi tôi nói RandomAccessFile không phải là tiêu chuẩn nó cũng không phải là nó cũng không cung cấp một cách để nhận được một InputStream mà các thư viện tiện ích thường mong đợi. Có lẽ chỉ là bản chất của RAF là gì. –

+0

Vấn đề của tôi là sau khi bỏ qua cuộc gọi() tôi sử dụng filechannel từ fis.getChannel() để có được kết quả được áp dụng cho regex. Thật không may là filechannel chỉ khôi phục lại đầu vào bị bỏ qua – Dagon

+0

Vấn đề với điều này là chúng ta phải dựa vào việc thực hiện cụ thể đó để suy ra thực tế rằng nó tìm kiếm từ AFAIK thông tin không phải là một phần của giao diện/tài liệu. Đó không phải là một ý tưởng hay. Nhưng có thể "loại bỏ các byte bị bỏ qua" vì nó được tuyên bố có nghĩa là tìm kiếm chúng trên vị trí mong muốn. – lkuty

0

bạn sẽ được quan tâm với điều này LINK

nó nói rằng tìm kiếm nhanh hơn skip