2011-04-01 8 views
11

मैं विश्लेषण के लिए BufferedReader का उपयोग कर एक txt फ़ाइल से संख्याएं पढ़ रहा हूं। जिस तरह से मैं इस बारे में अब जा रहा हूँ एक लाइन .readline का उपयोग कर .split का उपयोग करBufferedReader: एक स्ट्रिंग में एकाधिक लाइनें पढ़ें

public InputFile() { 
    fileIn = null; 

    //stuff here 

    fileIn = new FileReader((filename + ".txt")); 
    buffIn = new BufferedReader(fileIn); 


    return; 
    //stuff here 
} 

public String ReadBigStringIn() { 
    String line = null; 

    try { line = buffIn.readLine(); } 
    catch(IOException e){}; 

    return line; 
} 

public ProcessMain() { 
    initComponents(); 
    String[] stringArray; 
    String line; 

    try { 
     InputFile stringIn = new InputFile(); 
     line = stringIn.ReadBigStringIn(); 
     stringArray = line.split("[^0-9.+Ee-]+"); 
     // analysis etc. 
    } 
} 

यह काम करता है तार की एक सरणी में इस स्ट्रिंग पढ़ने, बंटवारे है- ठीक है, लेकिन क्या होगा यदि txt फ़ाइल में टेक्स्ट की कई पंक्तियां हों? क्या एक लंबी स्ट्रिंग, या शायद इसे करने का दूसरा तरीका आउटपुट करने का कोई तरीका है? शायद while(buffIn.readline != null) {} का उपयोग करें? यह सुनिश्चित नहीं है कि इसे कैसे कार्यान्वित किया जाए।

विचारों की सराहना की, धन्यवाद।

String text = Files.toString("filename.txt", Charsets.UTF_8); 
बेशक

, कि तुम लाइनब्रेक बनाए रखना चाहते हैं यह सोचते है:

उत्तर

24

आप ठीक कह रहे हैं के साथ अपने ReadBigStringIn() की जगह ले सकता, एक पाश यहाँ की जरूरत होगी।

सामान्य मुहावरा (केवल सादे जावा का प्रयोग करके) कुछ इस तरह है:

public String ReadBigStringIn(BufferedReader buffIn) throws IOException { 
    StringBuilder everything = new StringBuilder(); 
    String line; 
    while((line = buffIn.readLine()) != null) { 
     everything.append(line); 
    } 
    return everything.toString(); 
} 

इस को हटा लाइन टूट जाता है - अगर आप उन्हें बनाए रखना चाहते, readLine() विधि का उपयोग नहीं है, लेकिन बस में पढ़ इसके बजाय char[] (और इसे अपने स्ट्रिंगबिल्डर में जोड़ें)।

2

तुम सिर्फ एक स्ट्रिंग में एक फ़ाइल के पूरी तरह से पढ़ने के लिए चाहते हैं, तो मैं तुम्हें Guava के Files क्लास का उपयोग सुझाव देते हैं। आप लाइनब्रेक निकालना चाहते हैं, तो आप या तो इसे उस तरह से लोड कर सकता है और उसके बाद String.replace उपयोग करें, या आप अमरूद फिर से इस्तेमाल कर सकते हैं:

List<String> lines = Files.readLines(new File("filename.txt"), Charsets.UTF_8); 
String joined = Joiner.on("").join(lines); 
1

ध्वनि आप की तरह चाहते हैं अपाचे आईओ FileUtils

String text = FileUtils.readStringFromFile(new File(filename + ".txt")); 
String[] stringArray = text.split("[^0-9.+Ee-]+"); 
0

यदि आप StringBuilder बनाते हैं, तो आप अंत में प्रत्येक पंक्ति जोड़ सकते हैं, और अंत में toString() का उपयोग करके स्ट्रिंग को वापस कर सकते हैं।

आप

public String ReadBigStringIn() { 
     StringBuilder b = new StringBuilder(); 

     try { 
      String line = buffIn.readLine(); 
      while (line != null) { 
       b.append(line); 
       line = buffIn.readLine(); 
      } 
     } 
     catch(IOException e){}; 

     return b.toString(); 
} 
0

यह एक लंबी स्ट्रिंग बनाता है, हर पंक्ति स्ट्रिंग से "(एक अंतरिक्ष)" seprateted है:

public String ReadBigStringIn() { 
    StringBuffer line = new StringBuffer(); 


    try { 
     while(buffIn.ready()) { 
     line.append(" " + buffIn.readLine()); 
    } catch(IOException e){ 
     e.printStackTrace(); 
    } 

    return line.toString(); 
} 
0

आप डबल्स वाली फ़ाइल है। ऐसा लगता है कि आपके पास प्रति पंक्ति एक से अधिक संख्याएं हैं, और कई पंक्तियां हो सकती हैं।

कुछ करने के लिए सबसे सरल चीज थोड़ी देर में लूप पढ़ी जाती है।

पिछली पंक्ति तक पहुंचने पर और आपके लूप को समाप्त करने पर आप अपनी ReadBigStringIn विधि से शून्य वापस कर सकते हैं।

लेकिन पाठक को एक विधि में बनाने और उपयोग करना अधिक सामान्य होगा। शायद आप एक विधि में बदल सकते हैं जो फ़ाइल को पढ़ता है और एक सरणी या युगल की सूची देता है।

बीटीडब्ल्यू, क्या आप बस अपने तारों को सफेद जगह से विभाजित कर सकते हैं?

एक पूरी स्ट्रिंग में एक पूरी स्ट्रिंग को पढ़ना आपके विशेष मामले के अनुरूप हो सकता है, लेकिन सावधान रहें कि यदि आपकी फ़ाइल बहुत बड़ी थी तो यह मेमोरी विस्फोट का कारण बन सकती है। स्ट्रीमिंग दृष्टिकोण आमतौर पर ऐसे I/o के लिए सुरक्षित है।

0

मैं लाइब्रेरी का उपयोग करके दृढ़ता से सलाह दूंगा लेकिन जावा 8 के बाद से आप स्ट्रीम का उपयोग करके भी ऐसा कर सकते हैं।

try (InputStreamReader in = new InputStreamReader(System.in); 
     BufferedReader buffer = new BufferedReader(in)) { 
     final String fileAsText = buffer.lines().collect(Collectors.joining()); 
     System.out.println(fileAsText); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

आप यह भी कर सकते हैं कि यह बहुत प्रभावी है के रूप में joiningStringBuilder आंतरिक रूप से उपयोग कर रहा है।