2013-02-26 141 views
5

मैं लाइन से फ़ाइल लाइन पढ़ना चाहता हूं। BufferedReader RandomAccessFile या BufferedInputStream से बहुत तेज है। लेकिन समस्या यह है कि मुझे नहीं पता कि मैंने कितने बाइट पढ़े हैं। बाइट्स को पढ़ने (ऑफसेट) कैसे जानें? मैंने कोशिश की।BufferedReader के बाइट्स पढ़ने (ऑफ़सेट) को कैसे जानें?

String buffer; 
int offset = 0; 

while ((buffer = br.readLine()) != null) 
    offset += buffer.getBytes().length + 1; // 1 is for line separator 

यदि फ़ाइल छोटा है तो मैं काम करता हूं। लेकिन, जब फ़ाइल बड़ी हो जाती है, ऑफ़सेट वास्तविक मान से छोटा हो जाता है। मैं ऑफ़सेट कैसे प्राप्त कर सकता हूं?

+0

आप क्या हासिल करने की कोशिश कर रहे हैं? यह आंतरिक बफर (और एन्कोडिंग, और विभिन्न पंक्ति समाप्ति) के कारण मूल रूप से मुश्किल है। –

+0

मैं लाइनों की शुरुआत के ऑफसेट प्राप्त करना चाहता हूं। इसलिए, मैं बाद में RandomAccessFile का उपयोग कर फ़ाइल के कुछ हिस्से को पढ़ने के लिए उस ऑफ़सेट का उपयोग करता हूं। – user1301568

+0

आप मान रहे हैं कि केवल एक पंक्ति विभाजक बाइट है, उदा। \ N। क्या आप इसे मान सकते हैं? – EJP

उत्तर

-3

आप लाइन द्वारा एक फ़ाइल लाइन में पढ़ना चाहते हैं, मैं इस कोड की सिफारिश करेंगे:

import java.io.*; 
class FileRead 
{ 
public static void main(String args[]) 
    { 
    try{ 
    // Open the file that is the first 
    // command line parameter 
    FileInputStream fstream = new FileInputStream("textfile.txt"); 
    // Use DataInputStream to read binary NOT text. 
    BufferedReader br = new BufferedReader(new InputStreamReader(fstream)); 
    String strLine; 
    //Read File Line By Line 
    while ((strLine = br.readLine()) != null) { 
    // Print the content on the console 
    System.out.println (strLine); 
    } 
    //Close the input stream 
    in.close(); 
    }catch (Exception e){//Catch exception if any 
    System.err.println("Error: " + e.getMessage()); 
    } 
    } 
} 

मैं हमेशा अतीत में है कि विधि का इस्तेमाल किया, और महान काम करता है!

स्रोत: Here

+2

आप प्रतिक्रिया देते हैं कि यह थोड़ा गलत है, क्योंकि आपको अंत में ब्लॉक में बाहरी संसाधन बंद करना चाहिए, आप भी सवाल का जवाब नहीं देते हैं, और इसके बगल में वह कुछ समान उपयोग कर रहा है, लेकिन एक अधिक कॉम्पैक्ट कोड उदाहरण के साथ। – comanitza

+0

यदि यह गुलाब भारत से आता है, तो आपको यह मानना ​​चाहिए कि यह केवल अधिकतर सही है। आप किसी भी अन्य वेबसाइट के बारे में पढ़ने से बेहतर हैं। –

8

दो की वजह से BufferedReader प्रभाव के साथ यह करने के लिए कोई आसान तरीका नहीं है: चरित्र endcoding और लाइन अंत। विंडोज़ पर, लाइन समाप्त होने वाली \r\n है जो दो बाइट्स है। यूनिक्स पर, रेखा विभाजक एक बाइट है। BufferedReader बिना किसी मामले के दोनों मामलों को संभालेगा, इसलिए readLine() के बाद, आपको नहीं पता होगा कि कितने बाइट छोड़े गए थे।

भी buffer.getBytes() केवल सही परिणाम देता है जब आपका डिफ़ॉल्ट एन्कोडिंग और फ़ाइल में डेटा का एन्कोडिंग गलती से समान होता है। byte[] < ->String किसी भी प्रकार के रूपांतरण का उपयोग करते समय, आपको हमेशा निर्दिष्ट करना चाहिए कि वास्तव में कौन सी एन्कोडिंग का उपयोग किया जाना चाहिए।

आप InputStream की गणना भी नहीं कर सकते हैं क्योंकि बफर किए गए पाठक बड़े हिस्सों में डेटा पढ़ते हैं। तो कहें, 5 बाइट्स के साथ पहली पंक्ति पढ़ने के बाद, आंतरिक InputStream में काउंटर 4096 लौटाएगा क्योंकि पाठक हमेशा अपने बाइट में कई बाइट्स को पढ़ता है।

आप इसके लिए एनआईओ देख सकते हैं। ऑफसेट का ट्रैक रखने के लिए आप निम्न स्तर ByteBuffer का उपयोग कर सकते हैं और इनपुट को लाइनों में कनवर्ट करने के लिए CharBuffer में लपेटें।

+0

BufferedReader के साथ ऐसा करने का कोई आसान तरीका नहीं है क्योंकि यह दोनों बफरिंग और नई लाइन पहचान करता है। बीटीडब्ल्यू, बाइटबफर और चारबफर के बारे में संकेत के लिए धन्यवाद –

0

मैं आपका अंतिम समाधान सोच रहा हूं, हालांकि, मुझे लगता है कि int के बजाय लंबे प्रकार का उपयोग करके ऊपर दिए गए कोड में सबसे अधिक स्थिति मिल सकती है।