Kotlin में फ़ाइलों के साथ काम करना दर्दनाक क्यों नहीं है
\n\nकल्पना करें: आप एक ऐसा एप्लिकेशन लिख रहे हैं जिसे उपयोगकर्ता की सेटिंग्स को सहेजना, त्रुटियों को लॉग करना या हज़ारों पंक्तियों वाली CSV फ़ाइलों को प्रोसेस करना होगा। Java में इसके लिए दर्जनों क्लासेस BufferedReader, FileWriter और अंतहीन try-catch की ज़रूरत होती है। और Kotlin में क्या? JetBrains द्वारा बनाई गई यह भाषा सिर्फ Java को "सरल" नहीं बनाती - यह डेटा के साथ काम करने के तरीके को फिर से परिभाषित करती है। यहाँ फ़ाइलें एक पंक्ति में खुलती हैं, और त्रुटियों को सुंदर ढंग से संभाला जाता है।
इस लेख में हम Kotlin में फ़ाइलों और फ़ाइल सिस्टम के साथ काम करने को बुनियादी संचालन से लेकर उन्नत तकनीकों तक समझेंगे। आप सीखेंगे कि फ़ाइलों को कैसे पढ़ना और लिखना है, निर्देशिकाओं का प्रबंधन कैसे करना है, JSON और CSV के साथ कैसे काम करना है, और सामान्य गलतियों से कैसे बचना है। तैयार हैं? चलिए शुरू करते हैं!
\n\nमूल बातें: Kotlin Java IO को कैसे सरल बनाता है
\n\nKotlin की मुख्य विशेषता extension-फ़ंक्शन हैं। फ़ाइल पढ़ने के लिए दर्जनों पंक्तियाँ लिखने के बजाय, आप एक फ़ंक्शन .readText() या .readLines() का उपयोग करते हैं। आइए विशिष्ट उदाहरणों पर नज़र डालें।
पूरी फ़ाइल पढ़ना
\nटेक्स्ट फ़ाइल पढ़ने का सबसे आसान तरीका readText() का उपयोग करना है। यह विधि फ़ाइल की सामग्री के साथ एक स्ट्रिंग लौटाती है। महत्वपूर्ण: पढ़ने के बाद फ़ाइल स्वचालित रूप से बंद हो जाएगी।
import java.io.File\n\nfun main() {\n val content = File("example.txt").readText()\n println(content)\n}\n\nयदि फ़ाइल बड़ी है, तो पंक्ति दर पंक्ति पढ़ना बेहतर है:
\n\nval lines = File("example.txt").readLines()\nlines.forEach { line -> println(line) }\n\nऔर यदि आपको स्ट्रीम के रूप में पढ़ने की आवश्यकता है (उदाहरण के लिए, बड़े लॉग को प्रोसेस करने के लिए):
\n\nFile("example.txt").useLines { lines ->\n lines.forEach { line ->\n // प्रत्येक पंक्ति की प्रोसेसिंग\n println(line)\n }\n}\n\nuseLines() पर ध्यान दें - यह एक फ़ंक्शन है जो ब्लॉक के पूरा होने के बाद संसाधन को बंद करने की गारंटी देता है। यह जादुई लगता है, लेकिन Java में try-with-resources की तरह काम करता है, बस छोटा है।
फ़ाइल में लिखना
\nKotlin में डेटा लिखना भी सहज है। यहाँ तीन विकल्प हैं:
\n\n// 1. फ़ाइल को ओवरराइट करें\nFile("output.txt").writeText("नमस्ते, दुनिया!")\n\n// 2. फ़ाइल के अंत में जोड़ें\nFile("output.txt").appendText("नई पंक्ति\\n")\n\n// 3. स्ट्रिंग्स की सूची लिखें\nval list = listOf("पंक्ति1", "पंक्ति2", "पंक्ति3")\nFile("output.txt").writeText(list.joinToString("\\n"))\n\nवैसे, यदि आप बाइनरी डेटा (इमेज, आर्काइव) के साथ काम कर रहे हैं, तो writeBytes() और readBytes() का उपयोग करें:
val imageBytes = File("image.png").readBytes()\n// बाइट्स की प्रोसेसिंग...\nFile("copy.png").writeBytes(imageBytes)\n\nफ़ाइल सिस्टम प्रबंधन: बनाना, हटाना, स्थानांतरित करना
\n\nKotlin पहिया का पुन: आविष्कार नहीं करता, लेकिन फ़ाइल सिस्टम के साथ काम करना अधिक सुविधाजनक बनाता है। सभी ऑपरेशन एक्सटेंशन के साथ java.io.File क्लास के माध्यम से उपलब्ध हैं।
निर्देशिकाएँ बनाना
\nएक निर्देशिका (और सभी मूल निर्देशिकाएँ, यदि वे मौजूद नहीं हैं) बनाने के लिए:
\n\nval dir = File("data/logs/2024")\nval created = dir.mkdirs() // यदि बनाई गई तो true लौटाता है\nprintln("निर्देशिका बनाई गई: $created")\n\nध्यान दें: mkdir() केवल अंतिम फ़ोल्डर बनाता है, जबकि mkdirs() पूरी श्रृंखला बनाता है।
अस्तित्व की जाँच और हटाना
\n\nval file = File("temp.txt")\nif (file.exists()) {\n if (file.delete()) {\n println("फ़ाइल हटा दी गई")\n } else {\n println("हटाने में विफल")\n }\n}\n\n// निर्देशिका को पुनरावर्ती रूप से हटाना\nFile("data").deleteRecursively()\n\ndeleteRecursively() से सावधान रहें - यह एक अपरिवर्तनीय ऑपरेशन है। दो बार जाँचें कि आप सही डेटा हटा रहे हैं।
स्थानांतरण और प्रतिलिपि बनाना
\n\nval source = File("old.txt")\nval target = File("new_dir/new.txt")\n\n// स्थानांतरण (पुनः