2015-06-03 8 views
6

मैं एक पाठ फ़ाइल है कहते हैं:क्या संपूर्ण फ़ाइल (जावा) पढ़ने और लिखने के बिना एक txt फ़ाइल में एक पंक्ति को बदलना संभव है?

I love bananas. 
<age> 23 </age> years old. 
I like beaches. 

सभी मैं करना चाहता हूँ खुला है कहा फ़ाइल और पूरी फ़ाइल लेखन एक पढ़ने के बिना 24 या 25 करने के लिए है कि जावा में किसी भी तरह से करने के लिए उम्र को बदलने? मुझे बफर किए गए पाठक और लेखक के साथ यह संभव है, लेकिन जब फ़ाइल बड़ी हो जाती है तो मैं कम स्मृति गहन तरीके की तलाश में हूं।

+0

https://docs.oracle.com/javase/7/docs/api/java/io/RandomAccessFile.html –

+1

1 * लाइन * को बदलना संभव नहीं है: आप केवल बाइट्स को ओवरराइट कर सकते हैं जो पहले से ही हैं वहां (या फ़ाइल के अंत में अधिक बाइट्स जोड़ें)। आप उस लाइन को किसी अन्य बाइट्स में फिट करने के लिए बदल सकते हैं, आप बस लाइन को नहीं हटा सकते हैं, इसकी लंबाई बदल सकते हैं। –

+1

यदि आप जानते हैं कि आप क्या कर रहे हैं तो यादृच्छिक एक्सेस मोड का उपयोग करना संभव है। लेकिन यदि आप करते हैं, तो यह शायद ही कभी प्रयास (और जोखिम) के लायक है। –

उत्तर

0

मैंने पाया कि होबो आप के साथ सही "99" के साथ "23" की जगह ले सकता था, लेकिन नहीं 100 मैं इस का उपयोग करने में सक्षम था: फ़ाइल का नाम:

Charset charset = StandardCharsets.UTF_8; 
String content = new String(Files.readAllBytes(file_paths), charset); 
content = content.replaceAll(OldNumber,Integer.toString(NewNumber)); 
Files.write(file_paths, content.getBytes(charset)); // Writes it back to the file. 

इसके अलावा वहाँ दो अन्य तरीके हैं। अपाचे और रैंडम फ़ाइल एक्सेस विधि में यूटिल। आप जो स्थान बदलना चाहते हैं उसे ढूंढने के लिए .replace कमांड!

+0

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

6

संक्षिप्त उत्तर: नहीं।

लंबा उत्तर: वास्तव में नहीं। यदि आप जानते हैं कि जिस पाठ को आप सीधे डालने वाले टेक्स्ट को प्रतिस्थापित कर रहे हैं, तो आप फ़ाइल के हिस्से की तलाश करके, एक छोटा ब्लॉक पढ़कर, नए टेक्स्ट को प्रतिस्थापित करने और उस ब्लॉक को प्रतिस्थापित करके प्रतिस्थापन कर सकते हैं। यह आपके आयु प्रतिस्थापन उदाहरण के लिए काम करेगा, लेकिन उदाहरण के लिए, यदि आप 9 के साथ 9 या 99 के साथ 99 को प्रतिस्थापित कर रहे हैं, तो नहीं।

हालांकि, वहाँ अन्य कठिनाइयों कर रहे हैं:

आप चर लंबाई लाइनों हो सकता है, तो आप जहां के लिए तलाश करने के लिए पता नहीं है। आपको तब तक फ़ाइल को तब तक पढ़ना होगा जब तक आप प्रतिस्थापन करते हैं, भले ही आप इसे एक समय में ब्लॉक करते हैं और अवांछित लोगों को त्याग देते हैं।

आपके पास यूटीएफ -8 जैसे बहु-बाइट चरित्र सेटों के साथ एक और जटिलता है। आपका इंगोइंग टेक्स्ट आपके आउटगोइंग टेक्स्ट के समान लंबाई के रूप में प्रदर्शित हो सकता है, लेकिन प्रतिस्थापन के आधार पर छोटा या लंबा हो सकता है।

e (यू +0065) कोड एक बाइट के रूप में, लेकिन é (U + 00E9) कोड दो के रूप में कोड।

लेकिन, यदि आप केवल एक कम स्मृति गहन विधि की तलाश में हैं, तो आप एक समय में एक फ़ाइल को एक पंक्ति पढ़ सकते हैं, और प्रत्येक पंक्ति को एक नई फ़ाइल में लिखते समय लिखते हैं। जब आप पूरा कर लें, तो पुरानी फ़ाइल हटाएं और नया नाम बदलें। यह धीमा हो सकता है, इसलिए बफरिंग, 20 लाइनों (या 100, या 1000, या जो कुछ भी आप चुनते हैं ..) को पढ़ते हैं और लिखते हैं, प्रदर्शन में सुधार करेंगे।

+0

तो अगर मेरी सभी टेक्स्ट फाइलों में मेरे पास 8 अंकों का नंबर है और मेरे पास एक नया 8 अंकों का नंबर है, तो मैं इसे बदलना चाहता हूं? क्या आप कुछ नमूना कोड दिखा सकते हैं? – Dasman

+0

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

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