2010-09-08 9 views
9

मैं संभावित रूप से बड़ी फ़ाइल के अंतिम 10MB को दूसरी फ़ाइल में कॉपी करना चाहता हूं। आदर्श रूप में मैं FileInputStream का उपयोग करूंगा, छोड़ें() और फिर पढ़ें()। हालांकि मुझे यकीन नहीं है कि स्किप() का प्रदर्शन खराब होगा। क्या स्किप() आमतौर पर नीचे की गई फ़ाइल का उपयोग करके कार्यान्वित किया जाता है या क्या यह वास्तव में डेटा को पढ़ और छोड़ देता है?क्या FileInputStream.skip() एक खोज करते हैं?

मुझे RandomAccessFile के बारे में पता है, लेकिन मुझे इसमें दिलचस्पी है कि मैं उस स्थान पर FileInputStream का उपयोग कर सकता हूं (RandomAccessFile एपीआई मानक के रूप में परेशान है)।

+0

मैं सिर्फ अगर मैं Oracle JVM या एंड्रॉयड पर इस परीक्षण किया भूल गया है की तलाश है, लेकिन नकारात्मक मूल्यों के लिए FileInputStream.skip() जाँच करता है। –

उत्तर

15

अपने JVM पर निर्भर करता है, लेकिन यहां हाल ही में एक openjdk के लिए FileInputStream.skip() के लिए स्रोत है: जैसे कि यह एक seek() कर रहा है

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); 
} 

लग रहा है। हालांकि, मुझे नहीं लगता कि RandomAccessFile गैर-मानक क्यों है। यह java.io पैकेज का हिस्सा है और 1.0 के बाद से किया गया है।

+1

धन्यवाद। जब मैं कहता हूं कि RandomAccessFile गैर मानक है, यह न तो इनपुट इनपुट प्राप्त करने का एक तरीका प्रदान करता है जो उपयोगिता पुस्तकालयों की आम तौर पर अपेक्षा करता है। शायद सिर्फ आरएएफ क्या है की प्रकृति। –

+0

मेरी समस्या कॉल छोड़ने के बाद है() मैं regex पर लागू होने के लिए fis.getChannel() से filechannel का उपयोग करता हूं। दुर्भाग्य से filechannel बस छोड़े गए इनपुट को वापस बहाल करें – Dagon

+0

इस समस्या में यह है कि हमें इस तथ्य को कम करने के लिए उस विशेष कार्यान्वयन पर भरोसा करना है कि यह AFAIK के बाद से एक खोज करता है, जानकारी इंटरफ़ेस/दस्तावेज़ीकरण का हिस्सा नहीं है। यह एक अच्छा विचार नहीं है। लेकिन हो सकता है कि "छोड़े गए बाइट्स को छोड़कर" जैसा कि कहा गया है, वांछित स्थिति में उनको ढूंढना है। – lkuty

0

आप इस LINK

साथ दिलचस्पी होगी यह कहना है कि तेजी से छोड़

संबंधित मुद्दे