2010-07-21 13 views
5

पर मेरे पास छंटनी पढ़ें मेरे पास फाइलों का एक बड़ा सेट है, जिनमें से सभी को फाइल के अंत में संलग्न एक सेंटीनेल कैरेक्टर (1 बाइट) होना चाहिए (होना चाहिए)। मैं आखिरी बाइट कैसे पढ़ सकता हूं (यह सुनिश्चित करने के लिए कि यह चरित्र है) और इसे आकार में छोटा करें (यानी: चरित्र को हटाएं)?फ़ाइल से अंतिम बाइट पढ़ें और आकार

मुझे पता है कि मैं पूरी चीज पढ़ सकता हूं, और इसे अंतिम चरित्र से कम वापस लिख सकता हूं, लेकिन एक विशिष्ट बाइट तक पहुंचने का एक तरीका होना चाहिए, है ना?

+2

मेरे लिए खतरनाक लगता है। क्या होगा यदि एक नियमित फ़ाइल में उस विशेष बाइट है? – tafa

+0

@tafa मैं फ़ाइलों के एक विशिष्ट सेट पर काम कर रहा हूं, मुझे पता है कि इसे हटाने के लिए सुरक्षित है। – NullUserException

उत्तर

11

आप फ़ाइल के अंत की तलाश करने के लिए RandomAccessFile क्लास का उपयोग कर सकते हैं, इसे पढ़ सकते हैं, और फिर setLength() का उपयोग करके फ़ाइल को छोटा कर सकते हैं।

अद्यतन:

File target = new File("/path/to/file"); 
RandomAccessFile file = new RandomAccessFile(target,"rwd"); 
file.seek(target.length()-1); // Set the pointer to the end of the file 
char c = file.readChar(); 
if(c == '|') // Change the pipe character to whatever your sentinel character is 
{ 
    file.setLength(target.length()-1); // Strip off the last _byte_, not the last character 
} 

नोट:: यहाँ कुछ कोड है फ़ाइल किसी भी गैर 8 बिट में है, तो मैं इस कोड, कोई त्रुटि हैंडलिंग, आदि

परीक्षण नहीं किया चरित्र सेट, target.length()-1 समायोजित करने की आवश्यकता होगी।

+0

+1 + कोड लिखने के लिए जांच करें, हालांकि मुझे इसकी आवश्यकता नहीं थी। लेकिन RandomAccessFile बिल्कुल वही है जो मैं ढूंढ रहा था। और हाँ, स्पष्ट रूप से RandomAccessFile में प्रत्येक विधि एक IOException फेंकता है। – NullUserException

+0

'file.readChar() 'यहां कोई समझ नहीं आता है, सिवाय इसके कि डेटा' डेटाऑटपुट 'या संगत एन्कोडिंग (मुझे लगता है कि यूटीएफ -16LE) का उपयोग करके लिखा गया था। किसी भी मामले में यह निर्दिष्ट * सेंटीनेल चरित्र (1 बाइट) * के लिए काम करता है। 'ReadByte()' का उपयोग करना उचित होगा। – maaartinus

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