2008-09-18 12 views
5

पढ़ना मैं निम्नलिखित कोड है:FileChannel साथ एक ASCII फ़ाइल और ByteArrays

 String inputFile = "somefile.txt"; 
     FileInputStream in = new FileInputStream(inputFile); 
     FileChannel ch = in.getChannel(); 
     ByteBuffer buf = ByteBuffer.allocateDirect(BUFSIZE); // BUFSIZE = 256 

     /* read the file into a buffer, 256 bytes at a time */ 
     int rd; 
     while ((rd = ch.read(buf)) != -1) { 
      buf.rewind(); 
      for (int i = 0; i < rd/2; i++) { 
       /* print each character */ 
       System.out.print(buf.getChar()); 
      } 
      buf.clear(); 
     } 

लेकिन पात्रों को प्रदर्शित हो रहा है। क्या यूनिकोड वर्णों का उपयोग कर जावा के साथ इसका कुछ संबंध है? मैं इसे कैसे ठीक करूं?

उत्तर

7

आपको यह जानना है कि फ़ाइल का एन्कोडिंग क्या है, और फिर उस एन्कोडिंग का उपयोग करके बाइटबफर को चारबफर में डीकोड करें। फ़ाइल मानना ​​ASCII है:

import java.util.*; 
import java.io.*; 
import java.nio.*; 
import java.nio.channels.*; 
import java.nio.charset.*; 

public class Buffer 
{ 
    public static void main(String args[]) throws Exception 
    { 
     String inputFile = "somefile"; 
     FileInputStream in = new FileInputStream(inputFile); 
     FileChannel ch = in.getChannel(); 
     ByteBuffer buf = ByteBuffer.allocateDirect(BUFSIZE); // BUFSIZE = 256 

     Charset cs = Charset.forName("ASCII"); // Or whatever encoding you want 

     /* read the file into a buffer, 256 bytes at a time */ 
     int rd; 
     while ((rd = ch.read(buf)) != -1) { 
      buf.rewind(); 
      CharBuffer chbuf = cs.decode(buf); 
      for (int i = 0; i < chbuf.length(); i++) { 
       /* print each character */ 
       System.out.print(chbuf.get()); 
      } 
      buf.clear(); 
     } 
    } 
} 
+0

यदि आप प्रत्येक चरित्र को अलग से प्रिंट करने से बचना चाहते हैं, तो आप 'buf.rewind()' के बजाय 'buf.flip() 'का उपयोग कर सकते हैं और पास कर सकते हैं पूरे chbuf 'System.out.print()' के लिए – hertzsprung

0

हां, यह यूनिकोड है।

यदि आपके पास आपकी फ़ाइल में 14 वर्ण हैं, तो आपको केवल 7 '?' मिलता है।

समाधान लंबित है। अभी भी सोच।

1

क्या कोई विशेष कारण है कि आप फ़ाइल को इस तरीके से क्यों पढ़ रहे हैं?

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

मैं यह कुछ की तरह करना होगा:

File inputFile = new File("somefile.txt"); 
BufferedReader reader = new BufferedReader(new FileReader(inputFile)); 

और फिर या तो readLine या इसी तरह की वास्तव में डेटा में पढ़ने के लिए!

+1

मेरे पास डेटा की एक बड़ी मात्रा है, और मैं पढ़ने का समय अनुकूलित करने की कोशिश कर रहा हूं। संदर्भ: http://nadeausoftware.com/articles/2008/02/java_tip_how_read_files_quickly – Jake

+0

@ जेक, आपके उदाहरण में आप बाइट्स पढ़ते हैं और फिर वर्णों को डीकोड करते हैं। आप क्यों मानते हैं कि BufferedReader का उपयोग करने से तेज़ है? आपके द्वारा इंगित दिलचस्प बेंचमार्क अक्षर नहीं पढ़ते हैं। –

2

अपना प्रिंट बयान बदलने:

System.out.print((char)buf.get()); 

मदद करने के लिए लगता है।

3

buf.getChar() चरित्र प्रति 2 बाइट्स उम्मीद कर रही है लेकिन आप केवल भंडारण कर रहे हैं 1. उपयोग:

System.out.print((char) buf.get()); 
+0

आप कोड को संशोधित करना भूल गए हैं, यह अभी भी पढ़ता है .get() –

2

somefile.txt की एन्कोडिंग के आधार पर, एक चरित्र वास्तव में दो बाइट्स से बना नहीं किया जा सकता । This page उचित एन्कोडिंग के साथ स्ट्रीम को पढ़ने के तरीके के बारे में अधिक जानकारी देता है।

बमर है, फ़ाइल सिस्टम आपको फ़ाइल के एन्कोडिंग नहीं बताता है, क्योंकि यह नहीं जानता है। जहां तक ​​यह चिंतित है, यह केवल बाइट्स का एक गुच्छा है। आपको प्रोग्राम में एन्कोडिंग को संवाद करने के लिए कुछ रास्ता मिलना चाहिए, इसे किसी भी तरह से पहचानें, या (यदि संभव हो) हमेशा यह सुनिश्चित करें कि एन्कोडिंग वही है (जैसे यूटीएफ -8)।

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