ক্লোজযোগ্য বা অটোক্লোজেবল প্রয়োগ করে


127

আমি জাভা শেখার প্রক্রিয়াধীন এবং আমি implements Closeableএবং implements AutoCloseableইন্টারফেসগুলিতে কোনও ভাল ব্যাখ্যা পাই না ।

যখন আমি একটি বাস্তবায়ন করি তখন interface Closeableআমার Eclipse IDE একটি পদ্ধতি তৈরি করে public void close() throws IOException

আমি pw.close();ইন্টারফেস ছাড়াই স্ট্রিমটি বন্ধ করতে পারি । তবে, আমি কীভাবে close()ইন্টারফেসটি ব্যবহার করে পদ্ধতিটি প্রয়োগ করতে পারি তা বুঝতে পারি না । এবং, এই ইন্টারফেসের উদ্দেশ্য কী?

এছাড়াও আমি জানতে চাই: IOstreamসত্যিই বন্ধ ছিল কিনা তা আমি কীভাবে পরীক্ষা করতে পারি ?

আমি নীচের বেসিক কোডটি ব্যবহার করছিলাম

import java.io.*;

public class IOtest implements AutoCloseable {

public static void main(String[] args) throws IOException  {

    File file = new File("C:\\test.txt");
    PrintWriter pw = new PrintWriter(file);

    System.out.println("file has been created");

    pw.println("file has been created");

}

@Override
public void close() throws IOException {


}

2
আমি মনে করি সব কিছু ইতিমধ্যে বলা হয়ে গেছে, তবে সম্ভবত আপনি রিসোর্সগুলির চেষ্টা সম্পর্কে নিম্নলিখিত নিবন্ধে আগ্রহী: ডকস.অরাকল . com / javase / tutorial / essential / exception/… । প্রদত্ত উত্তরগুলি বুঝতে এটি সহায়ক হতে পারে।
crusam

উত্তর:


40

আমার কাছে মনে হচ্ছে আপনি ইন্টারফেসের সাথে খুব বেশি পরিচিত নন। আপনি যে কোড পোস্ট করেছেন তাতে আপনার প্রয়োগের দরকার নেই AutoCloseable

আপনাকে কেবল প্রয়োগ করতে হবে (বা হওয়া উচিত) Closeableবা AutoCloseableআপনি নিজের প্রয়োগ করতে চলেছেন PrintWriter, যা ফাইল বা অন্য কোনও সংস্থান পরিচালনা করে যা বন্ধ করা দরকার।

আপনার বাস্তবায়নে, কল করার জন্য এটি যথেষ্ট pw.close()। আপনার শেষ অবধি এটি করা উচিত:

PrintWriter pw = null;
try {
   File file = new File("C:\\test.txt");
   pw = new PrintWriter(file);
} catch (IOException e) {
   System.out.println("bad things happen");
} finally {
   if (pw != null) {
      try {
         pw.close();
      } catch (IOException e) {
      }
   }
}

উপরের কোডটি জাভা 6 সম্পর্কিত। জাভা 7 এ এটি আরও মার্জিতভাবে করা যেতে পারে ( এই উত্তরটি দেখুন )।


3
কেন শুধু একটি দিয়ে PrintWriter? বিশেষত AutoClosableঅবজেক্টগুলি কেবলমাত্র PrintWriter... এর চেয়ে আরও অনেক পরিস্থিতিতে ব্যবহৃত হতে পারে ...
glglgl

3
তুমি একদম সঠিক. প্রশ্নটি ছিল PrintWriterতাই আমি এটি আরও সুনির্দিষ্ট বলে উল্লেখ করেছি।
কাই

7
জাভা 6-এর পরিপ্রেক্ষিতে পরিস্থিতিটি কেন বর্ণনা করবেন AutoCloseable? try-with-resourcesপরিবর্তে আরও ভাল দেখান …
ᴠɪɴᴄᴇɴᴛ

191

AutoCloseable(জাভা in-তে প্রবর্তিত) -র সাহায্য -সংস্থান আইডিয়াম ব্যবহার করা সম্ভব করে তোলে :

public class MyResource implements AutoCloseable {

    public void close() throws Exception {
        System.out.println("Closing!");
    }

}

এখন আপনি বলতে পারেন:

try (MyResource res = new MyResource()) {
    // use resource here
}

এবং জেভিএম আপনার close()জন্য স্বয়ংক্রিয়ভাবে কল করবে ।

Closeable একটি পুরানো ইন্টারফেস। কিছু কারণেপশ্চাদপদ সামঞ্জস্য রক্ষার জন্য, ভাষা ডিজাইনাররা পৃথক একটি তৈরি করার সিদ্ধান্ত নিয়েছে। এটি কেবলমাত্র সমস্ত Closeableক্লাসকে (যেমন স্ট্রিম নিক্ষেপের মতো IOException) সংস্থান-ব্যবহারের ক্ষেত্রে ব্যবহার করার অনুমতি দেয় না , তবে এর থেকে আরও সাধারণ পরীক্ষিত ব্যতিক্রম ছোঁড়াও দেয় close()

সন্দেহ হলে, ব্যবহার করুন AutoCloseable, আপনার শ্রেণীর ব্যবহারকারীরা কৃতজ্ঞ হবে।


107
কারণটি সহজ: Closeable.close()ছোঁড়া IOException। অনেক close()পদ্ধতি সম্পদ ব্যবহার করে দেখুন-সঙ্গে-অন্যান্য পরীক্ষিত ব্যতিক্রম নিক্ষেপ উপকৃত হতে পারে (যেমন java.sql.Connection.close(), যাতে AutoCloseable.close()ছোঁড়ার Exceptionবিদ্যমান পরিবর্তন। Closeableচুক্তি সমস্ত বিদ্যমান অ্যাপ্লিকেশন বিরতি দেবে / লাইব্রেরি চুক্তি যে উপর নির্ভর close()শুধুমাত্র ছোঁড়ার IOExceptionএবং সমস্ত (চেক করা) ব্যতিক্রম।
মার্ক রোটভেল

4
@ মার্করোটটিভেল: +১, ধন্যবাদ আপনার পরামর্শ এবং মন্তব্য প্রতিফলিত করতে আমি আমার উত্তর সংশোধন করেছি।
টমাসজ নুরকিউইচ

9
এবং এছাড়াও: Closeable.close()আদর্শবান হতে হবে। AutoCloseable.close()এটি এখনও জোরালোভাবে সুপারিশ করা হয়, যদিও না।
লুকাস এদার

2
এছাড়াও, ডিফল্টটি ব্যবহার করবেন না public void close( ) throws Exception- আপনি (e..g IOException) করতে পারলে আরও সুনির্দিষ্ট ব্যতিক্রমটি ব্যবহার করুন
gerardw

3
Closeableআদর্শহীনতার গ্যারান্টি দেয় না । এটি ব্যবহারকারীর পদ্ধতি প্রয়োগের ক্ষেত্রে আদর্শের প্রয়োজনclose() । এবং IOExceptionআরও নির্দিষ্ট / উপযুক্ত কিনা নির্ভর করে ব্যবহারের ক্ষেত্রে।
xdmoore

70

Closeableপ্রসারিত হয় AutoCloseableএবং IO স্ট্রিমগুলিতে বিশেষভাবে উত্সর্গীকৃত: এটি ব্যতিক্রমের পরিবর্তে আইওএক্সেপশন ছুড়ে দেয়, এবং আদর্শবান, যেখানে অটোস্লোজেবল এই গ্যারান্টি সরবরাহ করে না।

উভয় ইন্টারফেসের জাভাদোক এ সমস্ত ব্যাখ্যা করা হয়েছে।

অটোক্লোজেবল (বা ক্লোজেবল) প্রয়োগ করে জাভা in-এ প্রবর্তিত রিসোর্স কনস্ট্রাক্টের রিসোর্স হিসাবে কোনও শ্রেণিকে ব্যবহার করার অনুমতি দেয় যা একটি ব্লকের শেষে এই ধরণের সংস্থানগুলি স্বয়ংক্রিয়ভাবে বন্ধ করে দেয়, অবশেষে অবরুদ্ধ ব্লক যুক্ত না করে যা বন্ধ হয়ে যায় স্পষ্টভাবে সংস্থান।

আপনার শ্রেণি একটি ঘনিষ্ঠ সম্পদ প্রতিনিধিত্ব করে না, এবং এই ইন্টারফেস বাস্তবায়নের একেবারেই কোনও অর্থ নেই: একটি আইওটিস্ট বন্ধ করা যায় না। এমনকি এটি ইনস্ট্যান্ট করাও সম্ভব নয়, কারণ এটির কোনও উদাহরণ পদ্ধতি নেই। মনে রাখবেন যে কোনও ইন্টারফেস বাস্তবায়নের অর্থ ক্লাস এবং ইন্টারফেসের মধ্যে একটি সম্পর্ক রয়েছে। এখানে আপনার কোনও সম্পর্ক নেই।


5
স্রোত সম্পর্কিত ক্লাসগুলির জন্য কেবল ক্লোজযোগ্য এবং অন্যের জন্য স্ব - ক্লোজেবল বাস্তবায়িত করুন যার জন্য স্ব-ক্লোজ বৈশিষ্ট্য প্রয়োজন।
লস্পিজোস

7

এখানে ছোট উদাহরণ

public class TryWithResource {

    public static void main(String[] args) {
        try (TestMe r = new TestMe()) {
            r.generalTest();
        } catch(Exception e) {
            System.out.println("From Exception Block");
        } finally {
            System.out.println("From Final Block");
        }
    }
}



public class TestMe implements AutoCloseable {

    @Override
    public void close() throws Exception {
        System.out.println(" From Close -  AutoCloseable  ");
    }

    public void generalTest() {
        System.out.println(" GeneralTest ");
    }
}

এখানে ফলাফল:

GeneralTest 
From Close -  AutoCloseable  
From Final Block

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

বন্ধ () পদ্ধতিতে, আমাদের কী স্পষ্টভাবে সংস্থানটি বন্ধ করার দরকার নেই? সম্ভবত কেবল মুদ্রণ বিবৃতি আছে।
শৈলেশ ওয়াঘমারে

@ শৈলেশ ওয়াগমারে হ্যাঁ ঠিক আছে তবে পরীক্ষার উদ্দেশ্যে আমি কোড স্নিপে উল্লেখ করেছি।
লোভা চিত্তুমুরি

@LovaChittumuri সুতরাং এটি কেমন হবে this.close()বা কোড কিছু ?, কারণ এটি স্বয়ংক্রিয়ভাবে বলা হয় (ঠিক নিশ্চিত হতে)।
Shailesh Waghmare

আপনি কি আমাকে পরীক্ষা করতে চান?
লোভা চিত্তুমুরি

6

try-with-resourcesবিবৃতি।

try-with-resources statementএকটি হল tryবিবৃতি যে এক বা একাধিক সম্পদ ঘোষণা করে। এ resourceহ'ল একটি অবজেক্ট যা প্রোগ্রামটি শেষ হওয়ার পরে অবশ্যই এটি বন্ধ করে দেওয়া উচিত। try-with-resources statementনিশ্চিত করে যে প্রতিটি রিসোর্স বিবৃতি শেষে বন্ধ করা হয়। যে কোনও অবজেক্ট বাস্তবায়ন করে java.lang.AutoCloseable, যার মধ্যে কার্যকর হয় এমন সমস্ত অবজেক্ট java.io.Closeableএকটি সংস্থান হিসাবে ব্যবহার করা যেতে পারে।

নিম্নলিখিত উদাহরণটি একটি ফাইল থেকে প্রথম লাইনটি পড়ে। এটি BufferedReaderফাইল থেকে ডেটা পড়ার উদাহরণ ব্যবহার করে। BufferedReaderএমন একটি উত্স যা প্রোগ্রামটি শেষ হওয়ার পরে অবশ্যই এটি বন্ধ করে দেওয়া উচিত:

static String readFirstLineFromFile(String path) throws IOException {
    try (BufferedReader br =
                   new BufferedReader(new FileReader(path))) {
        return br.readLine();
    }
}

এই উদাহরণস্বরূপ, চেষ্টা-সহ-সংস্থাগুলির বিবৃতিতে ঘোষিত সংস্থানটি একটি বাফারড্রেডার। ঘোষণাপত্রের বিবৃতি চেষ্টা কীওয়ার্ডের সাথে সাথেই প্রথম বন্ধনের মধ্যে উপস্থিত হবে। ক্লাস BufferedReader, জাভা এসই 7 এবং তারপরে, ইন্টারফেসটি প্রয়োগ করে java.lang.AutoCloseable। যেহেতু BufferedReaderউদাহরণটি চেষ্টা-সহ-সংস্থার বিবৃতিতে ঘোষণা করা হয়েছে, চেষ্টা স্টেটমেন্টটি সাধারণভাবে বা আকস্মিকভাবে সম্পূর্ণ হয় কিনা তা বিবেচনা ছাড়াই এটি বন্ধ হয়ে যাবে (পদ্ধতিটি BufferedReader.readLineএকটি নিক্ষেপ করার ফলে IOException)।

জাভা এসই 7 এর আগে, আপনি finallyচেষ্টাটি স্টেটমেন্টটি সাধারণভাবে বা হঠাৎ করেই সম্পূর্ণ হয় কিনা তা নির্বিশেষে কোনও উত্স বন্ধ রয়েছে তা নিশ্চিত করতে আপনি একটি ব্লক ব্যবহার করতে পারেন । নিম্নলিখিত উদাহরণটি বিবৃতিটির finallyপরিবর্তে একটি ব্লক ব্যবহার করে try-with-resources:

static String readFirstLineFromFileWithFinallyBlock(String path)
                                                     throws IOException {
    BufferedReader br = new BufferedReader(new FileReader(path));
    try {
        return br.readLine();
    } finally {
        if (br != null) br.close();
    }

}

দস্তাবেজ পড়ুন দয়া করে ।


6

সম্প্রতি আমি একটি জাভা এসই 8 প্রোগ্রামার গাইড ii বই পড়েছি।

AutoCloseableবনামের মধ্যে পার্থক্য সম্পর্কে আমি কিছু খুঁজে পেয়েছি Closeable

AutoCloseableইন্টারফেস জাভা 7. তার আগে চালু হয়, আরেকটি ইন্টারফেস নামক অস্তিত্ব Closeable। ভাষা ডিজাইনাররা নিম্নলিখিত ব্যতিক্রমগুলির সাথে এটির অনুরূপ ছিল:

  • Closeableফেলে দেওয়া ব্যতিক্রম প্রকারকে সীমাবদ্ধ করে IOException
  • Closeable আদর্শিক হতে বাস্তবায়ন প্রয়োজন।

ভাষা ডিজাইনাররা পিছিয়ে সামঞ্জস্যের উপর জোর দেয়। যেহেতু বিদ্যমান ইন্টারফেসটি পরিবর্তন করা অযাচিত ছিল তাই তারা একটি নতুন ফোন করেছে AutoCloseable। এই নতুন ইন্টারফেস তুলনায় কম কঠোর Closeable। যেহেতু Closeableএর প্রয়োজনীয়তাগুলি পূরণ করে AutoCloseable, AutoCloseableপরবর্তীকালে এটি কার্যকর করা শুরু হয়েছিল implementing


1
"এই নতুন ইন্টারফেসটি তুলনায় কম কঠোর" বলে পরিবর্তে Closeable, আমি বলার পরামর্শ দিয়েছি "এই নতুন ইন্টারফেসটি আরও সাধারণ প্রসঙ্গে ব্যবহার করা যেতে পারে, যেখানে বন্ধের সময় নিক্ষিপ্ত ব্যতিক্রমটি অবশ্যই আইওএক্সেপশন নয়"। জাভা মহাবিশ্বে, "কম কঠোর" হওয়া সম্পর্কে এটির নেতিবাচক ধারণা রয়েছে।
ফাউন্টেনহেড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.