जावा में लूप का उपयोग किए बिना पूरी फ़ाइल पढ़ें


103

संभावित डुप्लिकेट:
किसी फ़ाइल की सामग्री से जावा स्ट्रिंग बनाने के लिए कैसे
जावा में एक स्ट्रिंग के लिए पूर्ण पाठ फ़ाइल

मैं FileReader का उपयोग करके किसी फ़ाइल की सामग्री को पढ़ने का प्रयास कर रहा हूं। लेकिन मैं फाइल को बिना लाइन पढ़े पढ़ना चाहता हूं। क्या बिना लूप के पूरी फाइल पढ़ना संभव है। मैं निम्नलिखित कोड का उपयोग कर रहा हूं

 try
 {
     File ff=new File("abc.txt");
     FileReader fr=new FileReader(ff);

     String s;
     while(br.read()!=-1)
     {
          s=br.readLine();
     }
 }

 catch(Exception ex)
 {
     ex.printStackTrace();
 }

इस कोड के साथ शुरू करने के लिए संकलन नहीं होगा।
बजे आर्य पोरबेटाबाई

इसके लिए एक लाइन जावा 11 समाधान है: stackoverflow.com/a/52301018/942774
Hendrik

जवाबों:


129

यदि फ़ाइल छोटी है , तो आप पूरा डेटा एक बार पढ़ सकते हैं:

File file = new File("a.txt");
FileInputStream fis = new FileInputStream(file);
byte[] data = new byte[(int) file.length()];
fis.read(data);
fis.close();

String str = new String(data, "UTF-8");

4
InputStream की एंड्रॉइड एसेट्स (कोई लंबाई नहीं) के लिए काम नहीं करता है
akauppi

10
"छोटा" कितना छोटा है?
सिल्वर

8
@ फ़ाइल का पूरा कंटेंट मेमोरी में स्टोर किया जाएगा। तो, इस तरह 5GB फाइलें पढ़ने से बचें :-)
Thibaut D.

2
नोट: के file.length()तहत फ़ाइलों के लिए 0 वापस कर सकते हैं /proc। और उन मामलों में यह स्निपेट एक खाली स्ट्रिंग लौटाएगा।
Mygod

1
readसंपूर्ण बफ़र भी नहीं भर सकता है। यह अधिकतर JRE के साथ काम कर सकता है, लेकिन API में इसकी कोई गारंटी नहीं है।
डैनियल लुबरोव

179

जावा 7 एक लाइन समाधान

List<String> lines = Files.readAllLines(Paths.get("file"), StandardCharsets.UTF_8);

या

 String text = new String(Files.readAllBytes(Paths.get("file")), StandardCharsets.UTF_8);

1
Android में वह फ़ाइलें नहीं मिल रही हैं।
एकुप्पी

23
सभी जावा उत्तर को Android, @akauppi के अनुकूल नहीं होना चाहिए! बस एक समाधान की तलाश करें जो एंड्रॉइड दूसरे उत्तर से समर्थन करता है!
आइजैक वुड्स

String text = Files.readString(Paths.get("file"));यह छोटा है, यह मानते हुए कि आप UTF-8 स्ट्रिंग आउटपुट चाहते हैं।
ईगटरियन नाइट

और अगर आपके पास पहले से ही फ़ाइल ऑब्जेक्ट है, तो आप file.toPath()अंदर कर सकते हैंreadAllBytes
कार्तिक चुग

Android के लिए महत्वपूर्ण: Call requires API level 26: java.nio.file.Files#readAllBytes- के लिए एक ही बात है readString
नेफा

33

यदि आप JDK5 या उच्चतर का उपयोग कर रहे हैं, तो आप स्कैनर का उपयोग करने का प्रयास कर सकते हैं।

Scanner scan = new Scanner(file);  
scan.useDelimiter("\\Z");  
String content = scan.next(); 

या फिर आप अमरूद का उपयोग भी कर सकते हैं

String data = Files.toString(new File("path.txt"), Charsets.UTF8);

4
ध्यान दें कि उपयोग के बाद स्कैनर को बंद कर दिया जाना चाहिए।
बैरी एनएल

String data = Files.toString(new File("path.txt"), Charsets.UTF_8);। बस एक छोटा टाइपो। :-)
पिसरुक

1
यह कोड Scannerकेवल फ़ाइल से पहले 1024 बाइट पढ़ता है। सोर्स कोड को देखें। यह बफर को पढ़ता है और इसे इस regexp से जांचता है। यह हमेशा मान्य है - फिर यह सभी बफर सामग्री को वापस करता है। डिफ़ॉल्ट बफ़र में 1024 बाइट्स का आकार होता है।
एनबी

2
यह बीएडी दृष्टिकोण है। सही समाधान (जावा 1.7 और उच्चतर के लिए) है Files.readAllLines()। विरासत JRE के लिए, FileInputStream.read()शायद सबसे अच्छा है। मुझे यकीन नहीं है कि यह सभी प्लेटफार्मों के लिए पोर्टेबल है (यानी सीटीएल-जेड को हर जगह पहचाना जाता है), और यह करना आसान है Scanner.close()
pulsm4

33

यदि आप Java 5/6 का उपयोग कर रहे हैं, तो आप Apache Commons IO का उपयोग स्ट्रिंग में रीड फाइल के लिए कर सकते हैं । कक्षाorg.apache.commons.io.FileUtils ने रीड फाइल्स के लिए कई तरीके निकाले।

जैसे विधि का उपयोग करना FileUtils#readFileToString:

File file = new File("abc.txt");
String content = FileUtils.readFileToString(file);

1
यह शायद 3-पार्टी लिब का उपयोग करके सबसे आसान समाधान है।
सिल्वर

3
लिखने के लिए न्यूनतम कोड; परियोजना में जोड़ने के लिए कई और पुस्तकालय।
Please_Dont_Bully_Me_SO_Lords

2
FileFtils के प्रकार से फाइल रीडाइलट्रीस्ट्रिंग (फाइल) को हटा दिया जाता है
JavaSheriff

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.