আমার কি ফাইলরেডার এবং বাফারডারিডার দুটি বন্ধ করতে হবে?


188

আমি একটি ফাইলরেডারের চারপাশে মোড়ানো বুফেডার রিডার ব্যবহার করে একটি স্থানীয় ফাইল পড়ছি:

BufferedReader reader = new BufferedReader(new FileReader(fileName));
// read the file
// (error handling snipped)
reader.close();

আমারও close()কি FileReaderতেমন দরকার , বা মোড়ক কি হ্যান্ডেল করবে? আমি কোড দেখেছি যেখানে লোকেরা এরকম কিছু করে:

FileReader fReader = new FileReader(fileName);
BufferedReader bReader = new BufferedReader(fReader);
// read the file
// (error handling snipped)
bReader.close();
fReader.close();

এই পদ্ধতিটি কোনও সার্লেট থেকে কল করা হয়েছে এবং আমি নিশ্চিত করতে চাই যে আমি কোনও হ্যান্ডল খোলা না রেখে।


4
হ্যাঁ, আপনি কেবল এই জাতীয় তথ্যের উত্সটি পড়তে পারেন। এটি জেডিকে ইনস্টলেশন ডিরেক্টরিতে src.zip এ রয়েছে, বা আপনি এটি অনলাইনে পড়তে পারেন উদাহরণস্বরূপ docjar.com/html/api/java/io/BufferedReader.java.html
gustafc

50
কাউকে উত্স পড়তে বলা "আরটিএফএম!" বলার চেয়ে খারাপ। এবং যদি উত্সটিতে কোনও বাগ থাকে; স্পষ্টতই আমরা জানতে চাই সঠিক আচরণটি কী?
রায়েডওয়াল্ড

1
ভাল ... এই দৃষ্টিকোণ থেকে: এপিআই স্প্যাসের দিকে নির্দেশ করা আর ভাল হয় না। যদি উত্সটিতে কোনও ত্রুটি না থাকে যার কারণে এটি ডক্সে উল্লিখিত বর্ণনার মতো আচরণ করে না, আপনি ডক্সকে নির্ভর করতে পারবেন না। সুতরাং এই জাতীয় প্রশ্নের উত্তর দেওয়ার কোনও ভাল উপায় নেই।
আত্মবিশ্বাস

@ অ্যাটমোক্রেইশনস পরবর্তী রক্ষণাবেক্ষণ রিলিজটি উত্সের দিকে তাকালে আপনি নির্ভর করে এমন একটি বাগটি খুশি করে ঠিক করতে পারেন যা আপনি নির্ভর করেন। ডকুমেন্টেড আচরণটি কী তা আপনার সত্যই জানতে হবে। অবশ্যই উত্সটি দেখার ক্ষেত্রে কোনও ভুল নেই, তবে আপনি অনুমান করতে পারবেন না উত্সটি পরিবর্তিত হবে না। ডকুমেন্টেড আচরণ পরিবর্তন করা একটি বাগ ঠিক করার চেয়ে সাধারণত অনেক বড় বিষয়।
জেমস মুর

উত্তর:


202

কোন।

BufferedReader.close()

প্রবাহ বন্ধ হয়ে জন্য javadoc অনুযায়ী BufferedReader এবং InputStreamReader

পাশাপাশি

FileReader.close()

আছে।


12
যদি না কনস্ট্রাক্টর BufferedReaderএকটি ব্যতিক্রম নিক্ষেপ করে। অন্তর্নিহিত স্ট্রিমটি বন্ধ করার জন্য এটি পরিষ্কার, যদিও আপনাকে অন্যান্য সংস্থান এবং বাফারিং সহ সজ্জকারদের নজর রাখা দরকার।
টম হাটিন -

9
জাভাদোক BufferedReader.close()অন্তর্নিহিত পাঠককে বন্ধ করে দেয় কিনা তা বলে না । এর বিবরণটি কেবল অনুলিপি করা হয়েছে Reader.close()। এটি বাস্তবে আসল আচরণ হতে পারে তবে এটি নথিভুক্ত নয়।
জন কুগেলম্যান

3
যদি আসল আচরণটি আলাদা ছিল, তবে এটি যেমন নথিভুক্ত করা উচিত ছিল। অন্যথায় ডকুমেন্টেশন অকেজো। প্রোগ্রামার ডকুমেন্টেশন সম্পূর্ণ এবং নির্দিষ্ট হিসাবে বিবেচনা করতে সক্ষম হওয়া উচিত।
আত্মগোপনে

6
আসল ডকুমেন্টেশনগুলি পরিবর্তন করা উচিত ছিল বা পরিবর্তন করা উচিত ছিল তা Reader#close()বিবেচনাধীন নয় , জাভাদোক এটি রিডার মোড়ানো বা না বন্ধ করে কিনা তা বলবেন না। এটির সাথে সম্পর্কিত Closes the stream and releases any system resources associated with it.যা কিছু রয়েছে তা যা যথেষ্ট পরিমাণে স্পষ্ট করে বলা যায় না যে এটি সংস্থানটি করে বা বন্ধ করে না। 'রিসোর্সটি রিলিজ করুন' পাশাপাশি বাফারড্রেডারের উত্স সম্পর্কিত কোনও রেফারেন্স সরিয়ে ফেলতে পারে ... যার অর্থ হবে সংস্থানটি বন্ধ নেই।
সন্ধানচীন

99

অন্যরা যেমন উল্লেখ করেছে, আপনার কেবল বাহ্যিক মোড়ক বন্ধ করতে হবে।

BufferedReader reader = new BufferedReader(new FileReader(fileName));

খুব পাতলা সুযোগ রয়েছে যে BufferedReaderকনস্ট্রাক্টর একটি ব্যতিক্রম (উদাহরণস্বরূপ OutOfMemoryError) ছুড়ে দিলে এটি একটি ফাইল হ্যান্ডেল ফাঁস হতে পারে । যদি আপনার অ্যাপ্লিকেশনটি এই অবস্থায় থাকে তবে আপনার পরিষ্কার-পরিচ্ছন্নতাটি কতটা সতর্ক হওয়া দরকার তার উপর নির্ভর করে এটি অন্যান্য প্রোগ্রামগুলিতে যে পরিমাণ সংস্থান বরাদ্দ করতে পারে তার ওএসকে বঞ্চিত করবেন না এটি কতটা গুরুত্বপূর্ণ on

Closeable একটি মোড়কের কন্সট্রাকটর জাভা 5 বা 6 ব্যর্থ করার সম্ভাবনা রয়েছে ইন্টারফেস ব্যবহার করা যেতে পারে:

Reader reader = new FileReader(fileName);
Closeable resource = reader;
try {
  BufferedReader buffered = new BufferedReader(reader);
  resource = buffered;
  // TODO: input
} finally {
  resource.close();
}

জাভা 7 কোডটি ব্যবহার করে -সংস্থানসমূহের চেষ্টা করতে হবে :

try (Reader reader = new FileReader(fileName);
    BufferedReader buffered = new BufferedReader(reader)) {
  // TODO: input
}

1
"জাভা 7 কোডটি চেষ্টা করে-সংস্থানসমূহের ধরণটি ব্যবহার করা উচিত"। ধন্যবাদ, আমি ঠিক তাই খুঁজছিলাম এই সমাধানটি '09-এ লিখিত ছিল, সুতরাং-সংস্থানসমূহের সাহায্যের দৃষ্টান্তটি সম্ভবত নতুন সুপারিশ হওয়া উচিত। ফার্থমোর, এটি গৃহীত ও উচ্চতর ভোট দেওয়া উত্তরের চেয়ে ওপিতে আরও ভাল উত্তর সরবরাহ করে।
tresf

5

বাফার্ডারিডার উত্স অনুসারে, এই ক্ষেত্রে bReader.close কল করুন fReader.close যাতে প্রযুক্তিগতভাবে আপনাকে পরবর্তীটি কল করতে হবে না।


এটি কীভাবে ব্যবহার করা উচিত তা ব্যাখ্যা করার জন্য এখানে ডকুমেন্টেশন রয়েছে, আপনি প্রথমে ডকুমেন্টেশনটি দেখতে হবে - কোডের কোনও বিচ্যুতি একটি বাগ is
hmijail

5

বাফার্ডারিডারের উত্স কোডটি দেখায় যে আপনি বাফার্ডারীডার বন্ধ করলে অন্তর্নিহিত বন্ধ থাকে।


1
আমি কিছু কংক্রিটের সাথে সংযুক্ত করার জন্য এটিকে থাম্বস আপ করতে চাই, তবে এটি কেবল ওপেনজেডিকে বাস্তবায়নকেই বোঝায় এবং যেহেতু জাভাকসগুলি অস্পষ্ট Reader#close(), এটি ওরাকল জেডিকে উদাহরণস্বরূপ কার্যকর করা হয়েছিল যে কোনও দৃ concrete় প্রমাণ সরবরাহ করে না অনুরূপ ফ্যাশন।
সন্ধানী

4

উত্স কোড যাচাই করার পরে, আমি উদাহরণস্বরূপ এটি খুঁজে পেয়েছি:

FileReader fReader = new FileReader(fileName);
BufferedReader bReader = new BufferedReader(fReader);

বন্ধ () মেথড BufferedReader বস্তুর পদ্ধতি বিমূর্ত ঘনিষ্ঠ () কল করবে রিডার বর্গ যা পরিণামে বাস্তবায়িত পদ্ধতি কল করবে InputStreamReader বর্গ, যা পরে বন্ধ হয়ে InputStream অবজেক্ট।

সুতরাং, শুধুমাত্র bReader.close () যথেষ্ট।


4
উত্স কোড যা দেখায় তা উল্লেখ হিসাবে উপযুক্ত নয়। এটি স্পেসিফিকেশন যা বলে, এক্ষেত্রে জাভাদোক, তার উপর নির্ভর করা যায়।
লার্নের মার্কুইস

1

জাভা 7 থেকে শুরু করে আপনি চেষ্টা-সহ-সংস্থান বিবৃতি ব্যবহার করতে পারেন

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
    return br.readLine();
}

যেহেতু BufferedReaderউদাহরণটি চেষ্টা-সহ-সংস্থার বিবৃতিতে ঘোষণা করা হয়েছে, চেষ্টা স্টেটমেন্টটি সাধারণভাবে বা হঠাৎ করেই সম্পূর্ণ হয় কিনা তা বিবেচনা না করেই এটি বন্ধ হয়ে যাবে। সুতরাং আপনাকে finallyবিবৃতিতে এটি নিজেকে বন্ধ করার দরকার নেই । (নেস্টেড রিসোর্স স্টেটমেন্টগুলির ক্ষেত্রেও এটি ঘটেছে)

এটি সম্পদগুলির সাথে কাজ করার পুনঃসংশ্লিষ্ট উপায়, আরও বিস্তারিত তথ্যের জন্য ডকুমেন্টেশন দেখুন


এটি ২০০৯ সাল থেকে @ এমসিডোওয়েলের উত্তরের প্রায় অনুরূপ, এতে কিছু প্রকার কেস ইস্যু রয়েছে যা ঘটতে পারে covers
tresf

0

আপনাকে কেবল বাফারড্রেডার বন্ধ করতে হবে অর্থাৎ রিডারক্লস () এবং এটি কার্যকর হবে।


0

আমি দেরি করেছি, কিন্তু:

BufferReader.java:

public BufferedReader(Reader in) {
  this(in, defaultCharBufferSize);
}

(...)

public void close() throws IOException {
    synchronized (lock) {
        if (in == null)
            return;
        try {
            in.close();
        } finally {
            in = null;
            cb = null;
        }
    }
}

আইহী যে তার প্রশ্নের উত্তর দেয় না? তিনি / তিনি জিজ্ঞেস করে এটা প্রয়োজনীয় FileReader এবং BufferedReader একটি উদাহরণ কোড বন্ধ করতে হবে।
টর্নাক্সও

@ টর্নাক্স 7 নং, এটি উদাহরণ কোড নয়। আমি শুধু জাভা উত্স কোড অংশ লিখেছি। সুতরাং, আপনি সিটিআরএল / সেন্টিমিডি কী (আইডিই উপর নির্ভর করে) এর সাথে কিছু বাফারড্রিডার ফাংশনে ক্লিক করলে আপনি বাফারড্রেডারের উত্স কোড দেখতে পাবেন এবং আপনি সেই কোডটির টুকরোটি খুঁজে পেতে পারেন। সুতরাং, আপনি যেমন বাফারড্রেডারকে দেখতে পাচ্ছেন কেবল ফাইলআরডারকে নিজেই বন্ধ করুন (এই ক্ষেত্রে ফাইল ইন রিডার হয় 'ইন', সুতরাং, আপনি যখন বাফার রিডারক্লোজকে কল করেন) এটি ইনক্লোজকে () ভিতরে কল করে, ঠিক বাফার রিডারক্লু পদ্ধতিতে)
দিমিত্রি গ্যাশকো

0

আপনি না আবৃত পাঠক / লেখক বন্ধ করতে হবে।

আপনি যদি ডক্স ( Reader.close(), Writer.close()) এ একবার দেখে থাকেন তবে আপনি দেখতে পাবেন যে Reader.close()এতে লেখা আছে:

স্ট্রিমটি বন্ধ করে এবং এর সাথে যুক্ত যেকোনও সিস্টেম সংস্থান প্রকাশ করে।

যা কেবলমাত্র বলে যে এটি "এর সাথে যুক্ত কোনও সিস্টেমের সংস্থানগুলি মুক্তি দেয়"। যদিও এটি নিশ্চিত করে না .. এটি আপনাকে গভীরতর চেহারা শুরু করার জন্য একটি ঠেলাঠেলি দেয়। এবং আপনি যদি Writer.close()এটিতে যান তবে কেবলমাত্র এটি নিজেই বন্ধ হয়ে যায় states

এই জাতীয় ক্ষেত্রে, উত্স কোডটি একবার দেখার জন্য আমরা ওপেনজেডিকে উল্লেখ করি ।

বাফারডাইটার লাইনে 265 এ আপনি দেখতে পাবেন out.close()। সুতরাং এটি নিজেই বন্ধ হচ্ছে না .. এটি অন্যরকম কিছু। আপনি "এর occurences জন্য ক্লাস অনুসন্ধান করেন out" তোমার দিকে কন্সট্রাকটর যে বিজ্ঞপ্তি পাবেন লাইন 87 যে outবর্গ গোপন যেখানে এটা অন্য কন্সট্রাকটর আহ্বান এবং তারপর হয় লেখক বরাদ্দ outএটা নিজের পরামিতি outপরিবর্তনশীল ..

তো .. অন্যের কী হবে? আপনি বাফারড্রেডার লাইন 514 , বাফারডিনপুটস্ট্রিম লাইন 468 এবং ইনপুটস্ট্রিম রিডার লাইন 199 এ একই রকম কোড দেখতে পাবেন । অন্যেরা আমি জানি না তবে তারা যা করে তা অনুমান করার পক্ষে এটি পর্যাপ্ত হওয়া উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.