বাইটবফারের ফ্লিপ পদ্ধতির উদ্দেশ্য কী? (এবং কেন এটি "ফ্লিপ" বলা হয়?)


95

বাইটবফারের ফ্লিপ () পদ্ধতিটিকে "ফ্লিপ" বলা হয় কেন? এখানে "উল্টানো" কী? এপিডোকের মতে, ধারাবাহিকভাবে দুটি ফ্লিপগুলি আসল অবস্থা পুনরুদ্ধার করবে না এবং একাধিক ফ্লিপ সম্ভবত limit()শূন্য হয়ে উঠবে।

আমি কি কোনও উপায়ে পুনরায় ব্যবহার করতে "সরিয়ে নিতে" সীমা ছাড়িয়ে যেতে পারি?

আমি কি লেজকে অন্য কিছু ডেটা দিয়ে উল্টাতে পারি?


4
এটি লেখার (এবং তদ্বিপরীত) পড়া থেকে বাফারকে "ফ্লপ" করে। thushw.blogspot.com/2009/10/…
ব্রায়ান রোচ

4
@ ব্রায়ানআরচ: এটি পড়তে পড়তে লিখতে ফ্লিপ হয় তবে আপনি যদি স্থির আকারের কাঠামো না লিখেন তবে পড়তে লেখার পক্ষে তেমন কার্যকর নয়। পড়তে লিখতে উল্টানোর জন্য, resetপরিবর্তে ব্যবহার করুন।
nneonneo

"উদ্দেশ্যমূলক" প্রশ্ন জিজ্ঞাসা করতে ভুলবেন না; বা, কমপক্ষে, প্রধান প্রশ্নটি উদ্দেশ্যমূলক বলে মনে হচ্ছে: ডি

@ অ্যানিওনিও - এটি বিনা প্রশ্নবিদ্ধ ছিল, বিশদটি ব্যাখ্যা করতে আসলেই খুব বেশি সময় ব্যয় করা হয়নি, সুতরাং কেবল একটি মন্তব্য এবং একটি লিঙ্ক।
ব্রায়ান রোচ

উত্তর:


130

এর জন্য মোটামুটি সাধারণ ব্যবহারের ক্ষেত্রে ByteBufferহ'ল কিছু ডেটা স্ট্রাকচার টুকরো টুকরো করে তৈরি করা এবং তারপরে পুরো কাঠামোটি ডিস্কে লিখুন। "I / O থেকে পড়া" ( টিং) থেকে "I / O তে লেখার জন্য " ( টিং) flipফ্লিপ করতে ব্যবহৃত হয়: ভরাট করার জন্য s এর ক্রম ব্যবহার করার পরে , বাফারের সীমাটি বর্তমান অবস্থানে নির্ধারণ করবে এবং অবস্থানটি শূন্যে পুনরায় সেট করুন। এটি ভবিষ্যতের তৈরির প্রভাব ফেলে বা বাফার থেকে বাফারে যা ছিল সেগুলি সমস্ত লিখুন এবং আর কিছু নয়।ByteBufferputgetputByteBufferflipgetwriteput

সমাপ্তির পরে put, আপনি ByteBufferআবার অন্য ডেটা কাঠামো তৈরি করতে পুনরায় ব্যবহার করতে চাইতে পারেন । এটি "অপসারণ" করতে, কল করুন clear। এটি ক্ষমতার সীমাটি (সমস্ত বাফারকে ব্যবহারযোগ্য করে তোলা), এবং অবস্থানটি 0-এ পুনরায় সেট করে।

সুতরাং, একটি সাধারণ ব্যবহারের দৃশ্য:

ByteBuffer b = new ByteBuffer(1024);
for(int i=0; i<N; i++) {
    b.clear();
    b.put(header[i]);
    b.put(data[i]);
    b.flip();
    out.write(b);
}

এক প্রকার কি out?
সুজান সিওক

6
বা অন্য যে কোনও write(ByteBuffer)পদ্ধতি রয়েছে। (এটির প্রকারটি কী তা আসলেই প্রাসঙ্গিক নয় ...)
স্টিফেন সি

4
এটির উচিত Buffer.clearযা ক্ষমতা এবং পজিশনে সীমা সীমাবদ্ধ করে 0. Buffer.resetকেবলমাত্র অবস্থানে পুনরায় সেট করুন mark
কেলভিন এনজি

4
@ কেলভিনএনজি: আপনি ঠিক বলেছেন; আমি এটি প্রতিফলিত করতে উত্তর সংশোধন করেছি। সুন্দর ধরার জন্য ধন্যবাদ!
nneonneo

4
@ user963241: পড়া থেকে আমি / বাফারের মধ্যে হে, লেখ থেকে ইনপুট / আউটপুট মধ্যে বাফার।
নিনেও

7

ফ্লিপ সীমাবদ্ধতার সম্পত্তিতে বর্তমান অবস্থানের মান নির্ধারণ করে এবং অবস্থানের সম্পত্তিটি 0 তে সেট করে।

উদাহরণস্বরূপ, নীচে প্রোগ্রামটি "হ্যালো" বাফারের খালি উপাদানগুলি মুদ্রণ করে না। পদ্ধতি কলগুলির সীমা এবং অবস্থানটি ফ্লিপ দিয়ে প্রতিস্থাপন করা যেতে পারে।

CharBuffer cbuff = CharBuffer.allocate(40);
cbuff.put("hello"); 
// what below two line of code is what flip does
cbuff.limit(cbuff.position());
cbuff.position(0);      
while(cbuff.hasRemaining()) {
    System.out.println(cbuff.get());
}

বাফার এবং চ্যানেল সম্পর্কিত আরও তথ্যের জন্য http://www.zoftino.com/java-nio-tutorial দেখুন ।


খুব বিস্তৃত কভারেজের লিঙ্কটির জন্য আপনাকে ধন্যবাদ! উত্সগুলি অন্তর্ভুক্ত করা হলে এটি এত দুর্দান্ত। জাভা এপিআই ডক্সটি ব্যাখ্যা ছাড়াই 'ফ্লিপ' শব্দটি ব্যবহার করেছে বলে মনে হয়েছিল, এটি একটি সাধারণ কম্পিউটার বিজ্ঞানের শব্দ, তবে স্পষ্টতই কিছু লোক (আমাকে সহ) এটি খুঁজে পায়নি।
জন মায়ার

3

বাইটবফার অসুস্থভাবে নকশাকৃত। শালীন প্রোগ্রামারদের কাছ থেকে প্রচুর অভিযোগ রয়েছে।

সুতরাং এটি নিয়ে যুক্তি দেওয়ার চেষ্টা করবেন না, কেবল অধ্যয়ন করুন এবং সাবধানতার সাথে এপিআই ব্যবহার করুন।

এখন আমি বিকল্প উপস্থাপনা না করে এটি খারাপ করতে পারি না, সুতরাং এটি এখানে:

একটি বাফার একটি নির্দিষ্ট আছে capacity; এটি 2 পয়েন্টার বজায় রাখে: startএবং endget()এ বাইট ফেরৎ startঅবস্থান ও বাড়তি startput()বাইটটি endপজিশনে এবং ইনক্রিমেন্টে রাখে end। না flip()!


6
তাহলে অভিযোগ কি? আপনার যদি কিছু ব্যক্তিগত অভিযোগ থাকে তবে তাও ঠিক আছে, তবে এটি কেবল "এক্স এপিআই সাফল্য পেয়েছে, লোকেরা তাই বলেছে" বলার জন্য করে না।
nneonneo

13
সেই লিঙ্কটি পোস্ট করা আক্ষরিকভাবে আপনাকে প্রথমে করতে হবে। আমি কখনও আপনাকে মিথ্যা বলে অভিযুক্ত করি নি, অভিযোগের উত্স এবং প্রকৃতির বিষয়ে আপনাকে কেবল বিবৃত করতে বলেছিলাম।
নিনেনিও

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

8
এবং এটি এমনও একটি জায়গা যেখানে বিশ্বাসযোগ্য মনে না হলে লোকেরা কারও কথা গ্রহণ করবে না।
অরুনমোঝি

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

0

ফ্লিপ () পদ্ধতিটি চ্যানেল-রাইটিং বা আপেক্ষিক পেতে অপারেশনগুলির নতুন ক্রমের জন্য বাফারকে প্রস্তুত করে: এটি বর্তমান অবস্থার সীমা নির্ধারণ করে এবং পরে অবস্থানটি শূন্যে সেট করে।

বাফার এতে লিখিত ডেটা ট্র্যাক করে রাখে। লেখার পরে পোস্টিং, ফ্লিপ () পদ্ধতিটি পড়া থেকে মোডে পরিবর্তনের জন্য ডাকা হয়।

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