2012-11-20 32 views
5

से पढ़ने के लिए सबसे तेज़ वर्ग मुझे अपने प्रोग्राम में txt फ़ाइलों को पढ़ना है। मैं वर्तमान में FileReader और BufferedReader का उपयोग कर रहा हूँ। मैंने स्कैनर का उपयोग करने की कोशिश की लेकिन फाइलरडर और बुफर्ड रीडर से धीमा। क्या कोई वर्ग है, जो फ़ाइलों को तेज़ी से पढ़ सकता है? यह जावा भाषा में लिखा जाना चाहिए।जावा, एक txt फ़ाइल

मैं तुम्हें स्मृति, सबसे तेज में सभी फाइल, एक कोड लिखने के नजरिए से पढ़ा मान लिया जाये कि पाठ फ़ाइल

+2

आप ठोस सबूत नहीं है कि फ़ाइल से पढ़ने के लिए अपने कार्यक्रम में अड़चन है है? बाद में डेटा के साथ आप क्या कर रहे हैं, और फ़ाइल कितनी बड़ी है? ध्यान दें कि मैं 'फ़ाइल रीडर' से बचूंगा - 'इनपुटस्ट्रीम रीडर' रैपिंग 'फ़ाइल इनपुट स्ट्रीम' का उपयोग करें, ताकि आप स्पष्ट रूप से एन्कोडिंग सेट कर सकें। –

+0

शायद आपकी बाधा फ़ाइल को पढ़ने के बजाए लाइन को विभाजित कर रही है? String.split() को तेज़ करने के तरीके हैं। मेरे अनुभव से, BufferedReader बहुत तेज़ है। – Serg

+0

सैद्धांतिक रूप से, जावा एनआईओ आईओ –

उत्तर

1

यदि फ़ाइलों को पढ़ना बहुत बड़ा है तो आप पढ़ने के प्रदर्शन को बेहतर बनाने के लिए FileReader के शीर्ष पर BufferedReader का उपयोग करना चाहेंगे।

या आप कुछ likethis कोशिश कर सकते हैं: -

BufferedReader br = new BufferedReader(new FileReader("file.txt")); 
try { 
    StringBuilder sb = new StringBuilder(); 
    String line = br.readLine(); 

    while (line != null) { 
     sb.append(line); 
     sb.append("\n"); 
     line = br.readLine(); 
    } 
    String everything = sb.toString(); 
    } finally { 
    br.close(); 
} 

या आप इस कार्यक्रम की कोशिश कर सकते हैं। यह तेजी से बड़ी फ़ाइलों के लिए काम करता है: -

public String readDoc(File f) { 
String text = ""; 
int read, N = 1024 * 1024; 
char[] buffer = new char[N]; 

try { 
    FileReader fr = new FileReader(f); 
    BufferedReader br = new BufferedReader(fr); 

    while(true) { 
     read = br.read(buffer, 0, N); 
     text += new String(buffer, 0, read); 

     if(read < N) { 
      break; 
     } 
    } 
} catch(Exception ex) { 
    ex.printStackTrace(); 
} 

return text; 
} 
+0

की तुलना में फ़ाइलों को तेज़ी से पढ़ सकता है I फ़ाइलों को पढ़ने के लिए जा रहा है (100 एमबी से अधिक) हो सकता है। अब जब कि http://pastebin.com/WUaJUT1G मैं यह कर सकता तेजी की तरह यह कर im? मैं इसे विश्वविद्यालय पर प्रोजेक्ट के लिए कर रहा हूं और मुझे प्रोग्राम के सभी टुकड़े (पढ़ने, पेड़ बनाने और पेड़ में खोज करने) की आवश्यकता है जितना तेज़ मैं कर सकता हूं। – user1736332

+0

यह दृष्टिकोण एक बेहतर दृष्टिकोण है। मैंने इसे चेक किया है। –

+0

@ user1736332: - मैंने अभी अपने कोड को उस कोड के साथ अपडेट किया है जो बड़ी फ़ाइलों के लिए तेज़ी से काम करता है। कृपया इसे जांचें। –

2

से सभी शब्द (तार सफेद स्थान से splited) पढ़ने की जरूरत है:

List<String> lines = Files.readAllLines(yourFile, charset); 

मैं निष्पादन परिप्रेक्ष्य से निष्पादन की अपेक्षा करता हूं, बेहतर होने पर अच्छा होने के लिए (यह माना जाता है कि इसे जिस टीम ने लिखा है) द्वारा अनुकूलित किया गया है।

फिर आप जो कुछ भी चाहते हैं उसे विभाजित या कर सकते हैं।

1

पढ़ने और बंटवारे की गति 85 MB/sec है। मैंने प्रत्येक पंक्ति में 20 कॉलम के साथ 560 एमबी फ़ाइल का उपयोग किया।

package csvreader_speedtest; 

import java.io.*; 

public class Csvreader_SpeedTest { 

    final char delimiter = ','; 
    String[] splitted = new String[64]; 

    Csvreader_SpeedTest(String filename) throws Throwable { 
     File file = new File(filename); 
     BufferedReader reader = new BufferedReader(new FileReader(file)); 
     String line; 
     long t0 = System.currentTimeMillis(); 
     while ((line = reader.readLine()) != null) { 
      split(line); 
     } 
     long t1 = System.currentTimeMillis(); 
     reader.close(); 
     System.out.println("read " + file.length() + " bytes in " + (t1 - t0) + " ms"); 
    } 

    private void split(String line) { 
     int idxComma, idxToken = 0, fromIndex = 0; 
     while ((idxComma = line.indexOf(delimiter, fromIndex)) != -1) { 
      splitted[idxToken++] = line.substring(fromIndex, idxComma); 
      fromIndex = idxComma + 1; 
     } 
     splitted[idxToken] = line.substring(fromIndex); 
    } 
} 

उत्पादन:

read 561362951 bytes in 6575 ms 

अद्यतन: अगर मैं splitted = line.split(",");split(line); के बजाय का उपयोग करें, गति बूँदें 32 MB/sec को अद्यतन 2: बंटवारे के बिना, यहाँ कोड है गति 194 MB/sec है। आपको कितनी तेजी से इसकी आवश्यकता है?

+0

मुझे सभी संकेतों को प्रतिस्थापित करने की आवश्यकता है। ,! ? -() [] {}:; '' से "" (स्पेस) और फिर विभाजित शब्द सभी सफेद रिक्त स्थानों को फहराते हैं। यह तेज़ कैसे करें? – user1736332

+0

यह निश्चित रूप से अलग प्रश्न है। सबसे विश्वसनीय उत्तर पाने के लिए मैं इसे इस तरह पोस्ट करने का सुझाव देता हूं, ईआई: "क्या है अंतरिक्ष के तारों में ... के सभी उपस्थितियों को बदलने का सबसे तेज़ तरीका? " – Serg

1

यदि आपकी फ़ाइल बड़ी फ़ाइलें हैं .readAllLines काम नहीं करेंगे। लेकिन यह आसान है अगर आप अभी भी NIO बाहर की कोशिश करना चाहते:

FileInputStream fis = new FileInputStream("test.txt"); 
Reader rdr = Channels.newReader(fis.getChannel(), "UTF-8"); 
BufferedReader br = new BufferedReader(rdr); 
...