একটি ফাইল থেকে সমস্ত পাঠ পড়ুন
জাভা 11 লাইন টার্মিনেটর সংরক্ষণ করে ছোট ফাইলগুলি পড়ার জন্য রিডস্ট্রিং () পদ্ধতি যুক্ত করেছে String
:
String content = Files.readString(path, StandardCharsets.US_ASCII);
জাভা 7 এবং 11 এর মধ্যে সংস্করণগুলির জন্য, এখানে একটি কমপ্যাক্ট, দৃ rob় প্রতিমা, একটি ইউটিলিটি পদ্ধতিতে আবৃত:
static String readFile(String path, Charset encoding)
throws IOException
{
byte[] encoded = Files.readAllBytes(Paths.get(path));
return new String(encoded, encoding);
}
একটি ফাইল থেকে পাঠ্য লাইন পড়ুন
জাভা 7 কোনও ফাইলকে পাঠ্যের রেখাগুলি হিসাবে পড়ার জন্য একটি সুবিধার পদ্ধতি যুক্ত করেছে , যা হিসাবে উপস্থাপন করা হয়েছে List<String>
। এই পদ্ধতিরটি "ক্ষয়ক্ষতিযুক্ত" কারণ প্রতিটি লাইনের শেষ থেকে লাইন বিভাজকগুলি কেটে ফেলা হয়।
List<String> lines = Files.readAllLines(Paths.get(path), encoding);
জাভা 8 Files.lines()
একটি উত্পাদনের পদ্ধতি যুক্ত করেছে Stream<String>
। আবার, এই পদ্ধতিটি ক্ষতিকারক কারণ লাইন বিভাজকগুলি ছিনিয়ে নেওয়া হয়েছে। IOException
ফাইলটি পড়ার সময় যদি কোনও সমস্যার মুখোমুখি হয় তবে এটি একটি মুড়ে ফেলা হয় UncheckedIOException
, যেহেতু Stream
ল্যাম্বডাস গ্রহণ করে না যা পরীক্ষিত ব্যতিক্রমগুলি ফেলে দেয়।
try (Stream<String> lines = Files.lines(path, encoding)) {
lines.forEach(System.out::println);
}
এটির জন্য Stream
একটি close()
কল প্রয়োজন ; এটি এপিআই তে দুর্বল নথিভুক্ত, এবং আমার সন্দেহ হয় যে অনেক লোকের এমনকি Stream
একটি close()
পদ্ধতি রয়েছে তা খেয়াল করেন না । প্রদর্শিত হিসাবে একটি এআরএম-ব্লক ব্যবহার নিশ্চিত করুন।
আপনি যদি কোনও ফাইল ব্যতীত অন্য কোনও উত্সের সাথে কাজ করছেন তবে আপনি তার পরিবর্তে lines()
পদ্ধতিটি ব্যবহার করতে পারেন BufferedReader
।
স্মৃতি ব্যবহার
প্রথম পদ্ধতিটি, যা লাইন ব্রেকগুলি সংরক্ষণ করে, অস্থায়ীভাবে ফাইলের আকারের কয়েকগুণ মেমরির প্রয়োজন হতে পারে, কারণ অল্প সময়ের জন্য কাঁচা ফাইলের সামগ্রী (একটি বাইট অ্যারে), এবং ডিকোডেড অক্ষর (যার প্রতিটিই এনকোড থাকলেও 16 বিট হয়) ফাইলটিতে 8 বিট হিসাবে) একবারে স্মৃতিতে থাকে। আপনি উপলব্ধ মেমরির তুলনায় ক্ষুদ্র আপেক্ষিকৃত ফাইলগুলিতে প্রয়োগ করা সবচেয়ে নিরাপদ।
দ্বিতীয় পদ্ধতি, পংক্তিগুলি পড়ার জন্য সাধারণত আরও মেমরি দক্ষ হয়, কারণ ডিকোডিংয়ের জন্য ইনপুট বাইট বাফারটি পুরো ফাইলটি ধারণ করে না। তবে এটি এখনও উপলব্ধ ফাইলগুলির জন্য উপযুক্ত নয় যেগুলি উপলব্ধ মেমরির তুলনায় খুব বড় not
বড় ফাইলগুলি পড়ার জন্য আপনার প্রোগ্রামের জন্য আপনার আলাদা ডিজাইন দরকার, একটি যা একটি স্ট্রিম থেকে কিছু অংশ পাঠ করে, এটি প্রক্রিয়া করে এবং তারপরে একই স্থির আকারের মেমরি ব্লকটি পুনরায় ব্যবহার করে পরবর্তীটিতে চলে যায়। এখানে, "বৃহত্তর" কম্পিউটারের চশমার উপর নির্ভর করে। আজকাল, এই প্রান্তিকতা র্যামের অনেকগুলি গিগাবাইট হতে পারে। তৃতীয় পদ্ধতিটি Stream<String>
হ'ল এটি ব্যবহার করার একটি উপায় হ'ল যদি আপনার ইনপুট "রেকর্ডগুলি" স্বতন্ত্র লাইন হয়। (এর readLine()
পদ্ধতিটি ব্যবহার BufferedReader
করা এই পদ্ধতির সমতুল্য।
অক্ষর এনকোডিং
মূল পোস্টে নমুনা থেকে হারিয়ে যাওয়া একটি জিনিস হ'ল অক্ষর এনকোডিং। কিছু বিশেষ কেস রয়েছে যেখানে প্ল্যাটফর্মের ডিফল্টটি আপনি যা চান তা হ'ল তবে সেগুলি বিরল এবং আপনার পছন্দটিকে ন্যায়সঙ্গত করতে সক্ষম হওয়া উচিত।
StandardCharsets
বর্গ সমস্ত Java রানটাইম প্রয়োজনীয় এনকোডিং জন্য কিছু ধ্রুবক সংজ্ঞায়িত:
String content = readFile("test.txt", StandardCharsets.UTF_8);
প্ল্যাটফর্ম ডিফল্ট থেকে পাওয়া যায় বর্গ নিজেই:Charset
String content = readFile("test.txt", Charset.defaultCharset());
দ্রষ্টব্য: এই উত্তরটি আমার জাভা 6 সংস্করণটি মূলত প্রতিস্থাপন করে। জাভা 7 এর ইউটিলিটি কোডটি নিরাপদে সরল করে, এবং পুরানো উত্তর, যা ম্যাপযুক্ত বাইট বাফার ব্যবহার করেছিল, ম্যাপযুক্ত বাফার আবর্জনা সংগ্রহ না করা অবধি ফাইলটি মুছে ফেলা থেকে বিরত ছিল। আপনি এই উত্তরের "সম্পাদিত" লিঙ্কের মাধ্যমে পুরানো সংস্করণটি দেখতে পারেন।