একটি পাঠযোগ্য স্ট্রিম কীভাবে বন্ধ করবেন (শেষ হওয়ার আগে)?


90

পাঠযোগ্য স্ট্রিম কীভাবে বন্ধ করবেন closeNode.js এ ?

var input = fs.createReadStream('lines.txt');

input.on('data', function(data) {
   // after closing the stream, this will not
   // be called again

   if (gotFirstLine) {
      // close this stream and continue the
      // instructions from this if
      console.log("Closed.");
   }
});

এটি এর চেয়ে ভাল হবে:

input.on('data', function(data) {
   if (isEnded) { return; }

   if (gotFirstLine) {
      isEnded = true;
      console.log("Closed.");
   }
});

তবে এটি পড়ার প্রক্রিয়াটি থামবে না ...


6
সতর্কতা: এই প্রশ্নটি কেবলমাত্র fsমডিউলটির প্রসঙ্গে । closeমধ্যে নেই Stream.Readable
Zamnuts

4
ভাল খবর. নোড সংস্করণ 8 সরবরাহ করেstream.destroy()
জোয়েটউইডল

আপনি কল করতে পারবেন নাreadable.push(null) && readable.destroy();
আলেকজান্ডার মিলস 0

উত্তর:


39

দাওয়াত input.close()। এটি ডক্সে নেই, তবে

https://github.com/joyent/node/blob/cfcb1de130867197cbc9c6012b7e84e08e53d032/lib/fs.js#L1597-L1620

স্পষ্টভাবে কাজটি করে :) এটি আসলে আপনার মতো কিছু করে isEnded

সম্পাদনা করুন 2015-এপ্রিল -19 নীচের মন্তব্যগুলির উপর ভিত্তি করে, এবং স্পষ্ট করতে এবং আপডেট করতে:

  • এই পরামর্শটি হ্যাক, এবং নথিভুক্ত নয়।
  • যদিও স্রোতের দিকে তাকানোর জন্য lib/fs.js এটি এখনও> 1.5 বছর পরে কাজ করে।
  • কলিংকে destroy()পছন্দনীয় হওয়া সম্পর্কে আমি নীচের মন্তব্যে একমত ।
  • সঠিকভাবে নীচে বর্ণিত হিসাবে এটি জেনেরিকের জন্য fs ReadStreamsনয়, এর জন্য কাজ করেReadable

জেনেরিক সমাধান হিসাবে: এটি অন্তত ডকুমেন্টেশন সম্পর্কে আমার উপলব্ধি থেকে এবং তাত্ক্ষণিকভাবে দেখে মনে হচ্ছে এটির মতো উপস্থিত নেই _stream_readable.js

আমার প্রস্তাবটি আপনার পাঠযোগ্য স্ট্রিমটিকে বিরতি দেওয়া মোডে রেখে দেওয়া হবে, কমপক্ষে আপনার প্রবাহের ডেটা উত্সে আরও প্রক্রিয়াজাতকরণ রোধ করবে। করতে ভুলবেন না unpipe()এবং সব সরান dataযাতে ঘটনা শ্রোতাকে pause()হিসাবে উল্লেখ করা হয়েছে, আসলে একটু থামেন ডক্স


এটি দীর্ঘ করুন: ডকুমেন্টেশন থেকে কিছু রেফারেন্স যুক্ত করুন! :-)
আয়নিক বিজাউ

4
খুব ভালো! উত্স কোডটি সেরা ডকুমেন্টেশন সংস্থান বলে মনে হচ্ছে। ;-)
আয়নিক বিজাউ

আসলে আমি destroyপরিবর্তে কল করতে পছন্দ করব । আপনি যদি অটোস্লোজকে সত্যতে সেট করেন তবে কমপক্ষে এটিকে বলা হয়। উত্স কোডটি দেখে (আজ) পার্থক্যগুলি সর্বনিম্ন ( destroyকল close) তবে এটি ভবিষ্যতে পরিবর্তিত হতে পারে
মার্সেলো ডিনিজ

@ নীটজানশেকড ফাইলটি আপডেট করা হয়েছে। এটি কি সঠিক লিঙ্ক: github.com/joyent/node/blob/… ? (এতে কমিট আইডি রয়েছে, সুতরাং এটি ভবিষ্যতে
বদলাবে না

4
close()পঠনযোগ্য কোন বিষয় নেই , এর কি কখনও সমাধান হয় না? আমার ডেটা এক্সচেঞ্জ সর্বদা অসম্পূর্ণ ...
কোডম্যানএক্স

74

সম্পাদনা: সুসংবাদ! নোড.জেএস 8.0.0 দিয়ে শুরু readable.destroyকরা আনুষ্ঠানিকভাবে উপলভ্য: https://nodejs.org/api/stream.html#stream_readable_destroy_error

রিড স্ট্রিম.ডেস্ট্রয়

আপনি যে কোনও সময় রিডস্ট্রিম.ডেস্ট্রয় ফাংশনটিতে কল করতে পারেন ।

var fs = require('fs');

var readStream = fs.createReadStream('lines.txt');
readStream
    .on('data', function (chunk) {
        console.log(chunk);
        readStream.destroy();
    })
    .on('end', function () {
        // This may not been called since we are destroying the stream
        // the first time 'data' event is received
        console.log('All the data in the file has been read');
    })
    .on('close', function (err) {
        console.log('Stream has been destroyed and file has been closed');
    });

পাবলিক ফাংশনটি ReadStream.destroyনথিভুক্ত করা হয়নি (নোড.জেএস ভি0.12.2) তবে আপনি গিটহাবের সোর্স কোডটি দেখতে পারেন ( অক্টোবর 5, 2012 কমিট) )

destroyফাংশন অভ্যন্তরীণভাবে চিহ্নিত ReadStreamউদাহরণস্বরূপ ধ্বংস এবং কলের closeফাইল মুক্তি ফাংশন।

ফাইলটি কখন বন্ধ হবে তা জানতে আপনি ঘনিষ্ঠ ইভেন্টটি শুনতে পারেন । শেষ ঘটনা ফায়ার হবে না যদি না তথ্য সম্পূর্ণরূপে ধ্বংস করা হয়।


মনে রাখবেন যে destroy(এবং close) ফাংশনগুলি fs.ReadStream এর জন্য নির্দিষ্ট । জেনেরিক স্ট্রিমের অংশ নেই read পাঠযোগ্য "ইন্টারফেস"।


কমপক্ষে নোডের সর্বশেষতম সংস্করণে (অন্যদের চেক করেননি) ফাইল বর্ণনাকারী স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায় । এটি বলেছিল, প্রবাহটি errorকখনই না পড়লে শেষ পর্যন্ত প্রবাহিত হয় তা নিশ্চিত করার জন্য আমি কোনও ধরণের নিখুঁত পরীক্ষা করিনি। এর বাইরে, আমি কেবলমাত্র অন্যান্য ফাঁস নিয়েই উদ্বিগ্ন হলাম ইভেন্ট হ্যান্ডলারগুলি - আবারও, আমি এটির বিষয়ে 100% নিশ্চিত নই, তবে আমরা সম্ভবত 2010 / আই সি আইজ্যাকের সুসমাচারটি বলে যে হ্যান্ডলাররা হ'ল প্রেরকগুলি যখন gc'd হয় তখন ছাঁটাই করা হয়: groups.google.com/d/msg/nodejs/pXbJVo0NtaY/BxUmF_jp9LkJ
মিকর্মক্নিল

4
যদি ডেটা খুব ছোট হয় on('data') তবে কেবল একবারে ট্রিগার হবে, তাই কোনও হবে না .close(), কেবল অন্য কাউকে স্মরণ করিয়ে দিন।
বিটফিশজিজ


12

আপনি পারবেন না। নোড 5.3.0 অনুযায়ী জেনেরিক রিডেবল স্ট্রিমটি বন্ধ / বন্ধ / বাতিল / বাতিল করার কোনও নথিভুক্ত উপায় নেই । এটি নোড স্ট্রিম আর্কিটেকচারের একটি সীমাবদ্ধতা।

যেমন অন্যান্য উত্তরগুলি এখানে ব্যাখ্যা করেছে, নোড দ্বারা সরবরাহযোগ্য পাঠযোগ্যগুলির নির্দিষ্ট বাস্তবায়নের জন্য অদ্বন্ধিত হ্যাকগুলি রয়েছে , যেমন fs.ReadStream । এগুলি যদিও কোনও পঠনযোগ্যের জন্য জেনেরিক সমাধান নয়।

এখানে যদি কেউ আমাকে ভুল প্রমাণ করতে পারে তবে দয়া করে করুন। আমি যা বলতে চাইছি তা করতে সক্ষম হতে চাই অসম্ভব, এবং সংশোধন করে আনন্দিত হবে।

সম্পাদনা : এখানে আমার কার্যনির্বাহী: আমার পাইপলাইনের জন্য বাস্তবায়িত করুন .destroy()যদিও জটিল সিরিজের unpipe()কল। এবং এত জটিলতার পরেও, এটি সব ক্ষেত্রে সঠিকভাবে কাজ করে না

সম্পাদনা : নোড ভি 8.0.0 destroy()পাঠযোগ্য স্ট্রিমগুলির জন্য একটি এপিআই যুক্ত করেছে


4
এখন রয়েছে stream.pipeline, যা "ফরওয়ার্ডিং ত্রুটিগুলি হ্যান্ডেল করার এবং সঠিকভাবে পরিষ্কার করার এবং পাইপলাইনটি সম্পূর্ণ হয়ে গেলে কলব্যাক সরবরাহ করার দাবি করে।" এটা কি সাহায্য করে?
অ্যান্ড্রুডটন

11

সংস্করণে 4.*.*নাল মানটিকে প্রবাহে ঠেলে একটি ট্রিগার করবেEOF সংকেতকে ।

থেকে nodejs ডক্স

যদি নাল ব্যতীত অন্য কোনও মান পাস করা হয় তবে পুশ () পদ্ধতিটি পরবর্তী স্ট্রিম প্রসেসরদের গ্রাস করার জন্য কাতারে অনেকগুলি ডেটা যোগ করে। যদি নাল পাস হয়ে যায় তবে এটি স্ট্রিমের (ইওএফ) শেষের ইঙ্গিত দেয়, এর পরে আর কোনও ডেটা লেখা যায় না।

এই পৃষ্ঠায় অসংখ্য অন্যান্য বিকল্প চেষ্টা করার পরে এটি আমার পক্ষে কাজ করেছিল।


4
আমার জন্য কাজ কর. তবে, আমার প্রত্যাশিত আচরণ পেতে নালাকে চাপ দেওয়ার পরে ডাকা () কলব্যাক কল করা এড়ানো দরকার - যথা পুরো স্ট্রিমটি থেমে আছে।
ধনী আপোডাচ

6

এই ধ্বংস মডিউল একটি স্ট্রিম ধ্বংস পরার নিশ্চিত করতে বিভিন্ন API গুলি আর Node.js বাগ হ্যান্ডলিং বোঝানো হয়। এখনই সেরা পছন্দ এক।

এনবি। নোড 10 থেকে আপনি .destroyপরবর্তী নির্ভরতা ছাড়াই পদ্ধতিটি ব্যবহার করতে পারেন ।


3

আপনি এর সাথে স্ট্রিমটি সাফ এবং বন্ধ করতে পারেন yourstream.resume() , যা স্ট্রিমের সমস্ত কিছু ফেলে দেবে এবং শেষ পর্যন্ত এটি বন্ধ করে দেবে।

থেকে সরকারী দস্তাবেজ :

পঠনযোগ্য.পরিবর্তন ():

ফিরুন: এই

এই পদ্ধতিটি পাঠযোগ্য স্ট্রিমকে 'ডেটা' ইভেন্টগুলি নির্গত করে আবার শুরু করতে পারে।

এই পদ্ধতিটি প্রবাহকে প্রবাহিত মোডে স্যুইচ করবে। আপনি যদি কোনও স্ট্রিম থেকে ডেটা গ্রাহ্য করতে না চান তবে আপনি এর 'শেষ' ইভেন্টে যেতে চান তবে ডেটা প্রবাহটি খোলার জন্য আপনি স্ট্রিম.রেসুম () কল করতে পারেন।

var readable = getReadableStreamSomehow();
readable.resume();
readable.on('end', () => {
  console.log('got to the end, but did not read anything');
});

এটিকে "স্রোত" প্রবাহ বলা যেতে পারে। আমাদের ক্ষেত্রে অবশ্যই আমাদের 'data'ইভেন্ট শ্রোতা ছিল, তবে আমরা এটি একটি বুলিয়ান পরীক্ষা করে দেখিয়েছি if (!ignoring) { ... }যাতে আমরা যখন স্ট্রিমটি শুকিয়ে যাচ্ছি তখন ডেটা প্রক্রিয়া করে না। ignoring = true; readable.resume();
জোয়েটউইডল

4
অবশ্যই এটি স্ট্রিমটি 'end'এক পর্যায়ে ধরে নিয়েছে। সমস্ত স্ট্রিম এমনটি করবে না! (যেমন একটি স্রোত যা প্রতি সেকেন্ডে চিরদিনের জন্য তারিখ প্রেরণ করে))
জোয়েটউইডল

3

এটি একটি পুরানো প্রশ্ন তবে আমিও উত্তরটি খুঁজছিলাম এবং আমার বাস্তবায়নের জন্য সেরাটি খুঁজে পেয়েছি। উভয় endএবংclose ইভেন্ট নির্গত হয় তাই আমি মনে করি এটিই সবচেয়ে পরিষ্কার সমাধান।

এটি নোড ৪.৪ এ কৌশলটি করবে * * (লেখার সময় স্থিতিশীল সংস্করণ):

var input = fs.createReadStream('lines.txt');

input.on('data', function(data) {
   if (gotFirstLine) {
      this.end(); // Simple isn't it?
      console.log("Closed.");
   }
});

খুব বিশদ ব্যাখ্যার জন্য দেখুন: http://www.bennadel.com/blog/2692-you-have-to-exp Clearly-end-streams- after-pines-break-in-node- js.htm


2

এই কোডটি এখানে কৌশলটি দুর্দান্তভাবে করবে:

function closeReadStream(stream) {
    if (!stream) return;
    if (stream.close) stream.close();
    else if (stream.destroy) stream.destroy();
}

WritStream.end () হ'ল লিখনের স্ট্রিম বন্ধ করার উপায় ...


4
আপনি কেন উল্লেখ করেন? এন্ড () হ'ল চলন্ত উপায়, তবে তারপরে আপনার কোডটি বন্ধ এবং ধ্বংস ব্যবহার করে এবং এমনকি পরিণতি ব্যবহার করে না?
লুকাস বি

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