একটি আউটপুটস্ট্রিমে জাভা ইনপুট স্ট্রিমের লিখিত সামগ্রীগুলির সহজ উপায়


445

আমি আজ খুঁজে পেতে আছে যে আমি বলে বিষয়বস্তু লিখতে কোনো সহজ উপায় খুঁজিয়া বাহির করতে পারিনি বিস্মিত InputStreamএকটি থেকে OutputStreamজাভা। স্পষ্টতই, বাইট বাফার কোডটি লেখা কঠিন নয় তবে আমি সন্দেহ করি যে আমি কেবল এমন কিছু অনুপস্থিত যা আমার জীবনকে আরও সহজ করে তুলবে (এবং কোডটি আরও পরিষ্কার) are

সুতরাং, একটি InputStream inএবং একটি দেওয়া OutputStream out, নিম্নলিখিত লেখার জন্য একটি সহজ উপায় আছে?

byte[] buffer = new byte[1024];
int len = in.read(buffer);
while (len != -1) {
    out.write(buffer, 0, len);
    len = in.read(buffer);
}

আপনি একটি মন্তব্যে উল্লেখ করেছেন যে এটি একটি মোবাইল অ্যাপের জন্য। এটি কি দেশীয় অ্যান্ড্রয়েড? যদি তা হয় তবে আমাকে জানান এবং আমি অন্য উত্তর পোস্ট করব (এটি অ্যান্ড্রয়েডে কোডের একক লাইনই করা যায়)।
জাবারি

উত্তর:


182

জাভা 9

যেহেতু জাভা 9, নিম্নলিখিত InputStreamপদ্ধতিতে transferToস্বাক্ষর সহ একটি পদ্ধতি সরবরাহ করে :

public long transferTo(OutputStream out) throws IOException

ডকুমেন্টেশন হিসাবে বলা আছে, transferToহবে:

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

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

তাই যাতে একটি জাভা বিষয়বস্তু লিখতে InputStreamএকটি থেকে OutputStreamআপনি লিখতে পারেন:

input.transferTo(output);

11
আপনার Files.copyযতটা সম্ভব পছন্দ করা উচিত । এটি স্থানীয় কোডে প্রয়োগ করা হয়েছে এবং তাই দ্রুত হতে পারে। transferToউভয় স্ট্রিম কেবল তখনই ব্যবহার করা উচিত যখন ফাইলআরপুট স্ট্রিম / ফাইলআউটপুট স্ট্রিম না থাকে।
ZhekaKozlov

@ Kaেকা কোজলভ দুর্ভাগ্যক্রমে কোনও ইনপুট / আউটপুট স্ট্রিম Files.copyপরিচালনা করে না তবে এটি বিশেষত ফাইল স্ট্রিমের জন্য ডিজাইন করা হয়েছে ।
ইমপালার

396

যেমন ডাব্লুএমআর উল্লেখ করেছে, org.apache.commons.io.IOUtilsঅ্যাপাচি থেকে একটি পদ্ধতি বলা হয়েছে copy(InputStream,OutputStream)যা আপনি যা খুঁজছেন ঠিক তা করে।

সুতরাং তোমার আছে:

InputStream in;
OutputStream out;
IOUtils.copy(in,out);
in.close();
out.close();

... আপনার কোডে

এমন কোন কারণ আছে যা আপনি এড়িয়ে চলেছেন IOUtils?


170
আমি এই মোবাইল অ্যাপ্লিকেশনটির জন্য এড়াচ্ছি যা আমি তৈরি করছি যা এই অ্যাপ্লিকেশনটির আকারটি পাঁচ মাইল লাইন কোড সংরক্ষণ করতে পারা যায়।
জেরেমি লোগান

36
এটা যে উল্লেখ করতে হয়তো মূল্য inএবং outএকটি পরিশেষে ব্লক কোড শেষে অবশ্যই বন্ধ করতে হবে
basZero

24
@basZero বা রিসোর্স ব্লক দিয়ে চেষ্টা ব্যবহার করুন।
ওয়ারেন শিশ

1
অথবা আপনি কেবল নিজের অনুলিপি (ইন, আউট) লিখতে পারবেন ... (কম সময় নিতে হবে ...)
মাইক এম

1
আপনি যদি ইতিমধ্যে পেয়ারা লাইব্রেরি ব্যবহার করেন তবে অ্যান্ড্রেস নীচে বাইটস্ট্রিম ক্লাসের প্রস্তাব দিয়েছেন। আইওউটিলস যা করে তার অনুরূপ, তবে আপনার প্রকল্পে কমন্স আইও যুক্ত করা এড়িয়ে চলে।
জিম শক্ত

328

আপনি যদি জাভা 7 ব্যবহার করছেন তবে ফাইলগুলি (স্ট্যান্ডার্ড লাইব্রেরিতে) সর্বোত্তম পন্থা:

/* You can get Path from file also: file.toPath() */
Files.copy(InputStream in, Path target)
Files.copy(Path source, OutputStream out)

সম্পাদনা: অবশ্যই আপনি কেবল ফাইলটি থেকে ইনপুট স্ট্রিম বা আউটপুট স্ট্রিম তৈরির সময় এটি কার্যকর। file.toPath()ফাইল থেকে পাথ পেতে ব্যবহার করুন।

একটি বিদ্যমান ফাইলে (উদাহরণস্বরূপ এটি দিয়ে তৈরি করা হয়েছে File.createTempFile()) লিখতে আপনাকে REPLACE_EXISTINGকপি বিকল্পটি পাস করতে হবে (অন্যথায় FileAlreadyExistsExceptionনিক্ষেপ করা হবে):

Files.copy(in, target, StandardCopyOption.REPLACE_EXISTING)

26
আমি মনে করি না যে এটি আসলে সমস্যার সমাধান করে যেহেতু এক প্রান্তটি একটি পথ is আপনি যখন কোনও ফাইলের জন্য একটি পথ পেতে পারেন তবে আমি যতটা অবগত আছি আপনি কোনও জেনেরিক স্ট্রিমের জন্য একটি পেতে পারেন না (যেমন নেটওয়ার্কের মধ্যে একটি)।
ম্যাট শেপার্ড

4
অনুলিপি কপিরাইটস! আপনি এটি চাইলে এটি এখানে রাখতে পারেন।
ব্যবহারকারী 1079877

4
এখন এটাই আমি খুঁজছিলাম! জেডিকে উদ্ধার করতে, অন্য লাইব্রেরির দরকার নেই
ডন চ্যাডল

7
এফওয়াইআই, অ্যান্ড্রয়েডের জাভা 1.7 এ Filesউপলব্ধ নয় । আমি এতে স্তব্ধ হয়ে পড়েছি: stackoverflow.com/questions/24869323/…
জোশুয়া পিন্টার

23
মজাদারভাবে, জেডিকেও একটি রয়েছে Files.copy()যা দুটি স্ট্রিম গ্রহণ করে এবং Files.copy()অনুলিপি করার আসল কাজটি করার জন্য অন্যান্য সমস্ত ফাংশনই এটি এগিয়ে যায়। যাইহোক, এটা ব্যক্তিগত ব্যাপার (যেহেতু এটা আসলে পথ যে ফাইলগুলি পর্যায়ে সঙ্গে যুক্ত নয়), এবং দেখায় ঠিক ওপি নিজস্ব প্রশ্নে কোড (প্লাস একটি ফিরতি বিবৃতি) মত। কোনও উদ্বোধন নেই, বন্ধ হবে না, কেবল একটি অনুলিপি লুপ।
তি স্টারগা

102

আমি মনে করি এটি কার্যকর হবে তবে এটি পরীক্ষা করা নিশ্চিত করুন ... গৌণ "উন্নতি", তবে এটি পঠনযোগ্যতার জন্য ব্যয় হতে পারে।

byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1) {
    out.write(buffer, 0, len);
}

26
আমি কমপক্ষে 10 কেবি থেকে 100 কেবি বাফারের পরামর্শ দিই। এটি খুব বেশি নয় এবং প্রচুর পরিমাণে ডেটা অনুলিপি করতে গতিতে পারে।
অ্যারন ডিগুল্লা

6
while(len > 0)পরিবর্তে আপনি বলতে চাইবেন != -1, কারণ read(byte b[], int off, int len)আধুনিকটি ব্যবহার করার সময় পরেও 0 ফিরে আসতে পারে , যা একটি ব্যতিক্রম ছুঁড়েছে @out.write
phil294

12
@ ব্লাউহিরন: এটি ভুল হবে, কারণ যে InputStreamকোনও সংখ্যক বার 0 ফেরত পাঠানোর চুক্তি অনুসারে এটি সম্পূর্ণ আইনী । এবং OutputStreamচুক্তি অনুসারে , লেখার পদ্ধতিটি অবশ্যই 0 দৈর্ঘ্য গ্রহণ করে এবং lenনেতিবাচক হলে কেবল তার ব্যতিক্রম ছুঁড়ে ফেলা উচিত ।
ক্রিস্টোফার হামারস্ট্রিম

1
আপনি পরিবর্তন করে একটি লাইন সংরক্ষণ করতে পারবেন whileএকটি থেকে for, যেমন: এবং এর অধ্যায় init সংক্রান্ত ভেরিয়েবল এক নির্বাণ for (int n ; (n = in.read(buf)) != -1 ;) out.write(buf, 0, n);। =)
19উরোবার

1
@ ব্লাউহিম read()কেবল তখনই শূন্য ফিরে আসতে পারে যদি আপনি শূন্যের দৈর্ঘ্য সরবরাহ করেন যা একটি প্রোগ্রামিং ত্রুটি এবং চিরতরে লুপ করার মতো নির্বোধ শর্ত হবে। আর write()নেই না একটি ব্যতিক্রম আপনি একটি শূন্য দৈর্ঘ্য প্রদান নিক্ষেপ করা।
লার্নের মারকুইস

54

পেয়ারার ব্যবহার ByteStreams.copy():

ByteStreams.copy(inputStream, outputStream);

11
তার পরে স্ট্রিমগুলি বন্ধ করতে ভুলবেন না!
ওয়ান্ডারসসাবো

আপনি যদি ইতিমধ্যে পেয়ারাটি আমার জন্য অপরিহার্য হয়ে উঠছেন তবে এটিই সেরা উত্তর।
হং

1
@ হং আপনার যথাসম্ভব ব্যবহার Files.copyকরা উচিত ব্যবহার করুন ByteStreams.copyশুধুমাত্র যদি প্রবাহের উভয় FileInputStream / FileOutputStream নয়।
ZhekaKozlov

@ ঝেকা কোজলভ টিপটির জন্য আপনাকে ধন্যবাদ। আমার ক্ষেত্রে, ইনপুট স্ট্রিমটি অ্যান্ড্রয়েড অ্যাপের সংস্থান থেকে (আঁকতে সক্ষম) is
হংক

26

সাধারণ ফাংশন

আপনার যদি কেবলমাত্র একটি লেখার জন্য এটির প্রয়োজন InputStreamহয় Fileতবে আপনি এই সাধারণ ফাংশনটি ব্যবহার করতে পারেন:

private void copyInputStreamToFile( InputStream in, File file ) {
    try {
        OutputStream out = new FileOutputStream(file);
        byte[] buf = new byte[1024];
        int len;
        while((len=in.read(buf))>0){
            out.write(buf,0,len);
        }
        out.close();
        in.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

4
দুর্দান্ত ফাংশন, ধন্যবাদ। আপনার কি close()কলগুলি finallyব্লক করা দরকার , যদিও?
জোশুয়া পিন্টার

@ জোশপিন্টার এটি ক্ষতি করবে না
জর্ডান LaPrise

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

2
আইওএক্সেপশন পর্যাপ্ত হলে ব্যতিক্রম কেন ধরবেন?
প্রভাকর

18

JDKব্যবহারসমূহ একই কোড তাই মনে হয় সেখানে ক্লাঙ্কি তৃতীয় পক্ষের লাইব্রেরি ছাড়া কোন "সহজ" উপায় (যা সম্ভবত কিছু বিভিন্ন যাহাই হউক না কেন না) মত। নিম্নলিখিতগুলি থেকে সরাসরি অনুলিপি করা হয়েছে java.nio.file.Files.java:

// buffer size used for reading and writing
private static final int BUFFER_SIZE = 8192;

/**
  * Reads all bytes from an input stream and writes them to an output stream.
  */
private static long copy(InputStream source, OutputStream sink) throws IOException {
    long nread = 0L;
    byte[] buf = new byte[BUFFER_SIZE];
    int n;
    while ((n = source.read(buf)) > 0) {
        sink.write(buf, 0, n);
        nread += n;
    }
    return nread;
}

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

17

PipedInputStreamএবং জাভাডোক দ্বারা উল্লিখিতPipedOutputStream হিসাবে আপনার একাধিক থ্রেড থাকলে কেবল তখনই ব্যবহার করা উচিত ।

এছাড়াও, নোট করুন যে ইনপুট স্ট্রিম এবং আউটপুট স্ট্রিমগুলি IOExceptionএস এর সাথে কোনও থ্রেড বিঘ্নকে আবদ্ধ করে না ... সুতরাং, আপনার কোডটিতে একটি বাধা নীতি অন্তর্ভুক্ত করার বিষয়টি বিবেচনা করা উচিত:

byte[] buffer = new byte[1024];
int len = in.read(buffer);
while (len != -1) {
    out.write(buffer, 0, len);
    len = in.read(buffer);
    if (Thread.interrupted()) {
        throw new InterruptedException();
    }
}

যদি আপনি অসহনীয় দীর্ঘকাল ধরে আটকে থাকে এমন স্ট্রিমের বৃহত পরিমাণে ডেটা, বা স্ট্রিমের ডেটা অনুলিপি করার জন্য এই এপিআইটি ব্যবহার করার প্রত্যাশা করেন তবে এটি একটি দরকারী সংযোজন হবে।


14

যারা স্প্রিং ফ্রেমওয়ার্ক ব্যবহার করেন তাদের জন্য একটি দরকারী স্ট্রিমটিলস শ্রেণি রয়েছে:

StreamUtils.copy(in, out);

উপরের স্ট্রিমগুলি বন্ধ করে না। আপনি যদি অনুলিপিটির পরে স্রোতগুলি বন্ধ করতে চান তবে পরিবর্তে ফাইলকপি ইউটিলেস ক্লাসটি ব্যবহার করুন:

FileCopyUtils.copy(in, out);

8

জেডিকে পদ্ধতিগুলির সাহায্যে এটি খুব সহজ করার কোনও উপায় নেই, তবে ইতিমধ্যে অ্যাপোক্যালিস্প উল্লেখ করেছে যে আপনি এই ধারণাটি নিয়ে একমাত্র নন: আপনি জাকার্তা কমন্স আইও থেকে আইওউটিস ব্যবহার করতে পারেন , এতে আরও অনেক দরকারী জিনিস রয়েছে, আইএমও আসলে জেডিকে-র অংশ হওয়া উচিত ...


6

জাভা 7 এবং চেষ্টা-সহ-সংস্থানগুলি ব্যবহার করে , একটি সরলীকৃত এবং পঠনযোগ্য সংস্করণ আসে।

try(InputStream inputStream = new FileInputStream("C:\\mov.mp4");
    OutputStream outputStream = new FileOutputStream("D:\\mov.mp4")) {

    byte[] buffer = new byte[10*1024];

    for (int length; (length = inputStream.read(buffer)) != -1; ) {
        outputStream.write(buffer, 0, length);
    }
} catch (FileNotFoundException exception) {
    exception.printStackTrace();
} catch (IOException ioException) {
    ioException.printStackTrace();
}

3
লুপের ভিতরে ফ্লাশ করা অত্যন্ত পাল্টা-উত্পাদনশীল।
লার্নের মারকুইস

5

লুপের জন্য আমি কীভাবে সর্বাধিক সহজ করছি তা এখানে আসে।

private void copy(final InputStream in, final OutputStream out)
    throws IOException {
    final byte[] b = new byte[8192];
    for (int r; (r = in.read(b)) != -1;) {
        out.write(b, 0, r);
    }
}

4

কমন্স নেট এর ইউটিলি ক্লাস ব্যবহার করুন:

import org.apache.commons.net.io.Util;
...
Util.copyStream(in, out);

3

একটি আইএমএইচও আরও ন্যূনতম স্নিপেট (এটি আরও সংকীর্ণরূপে দৈর্ঘ্যের ভেরিয়েবলটিকে স্কোপ করে):

byte[] buffer = new byte[2048];
for (int n = in.read(buffer); n >= 0; n = in.read(buffer))
    out.write(buffer, 0, n);

পার্শ্ব নোট হিসাবে, আমি কেন বুঝতে পারছি না যে আরও লোক কেন forলুপ ব্যবহার করবেন না , পরিবর্তে whileএকটি অ্যাসাইন-অ্যান্ড-টেস্ট এক্সপ্রেশন যা কোনও "দরিদ্র" স্টাইল হিসাবে বিবেচিত তা বেছে নেওয়া হয়েছে।


1
আপনার পরামর্শটি প্রথম পুনরাবৃত্তিতে 0-বাইট লেখার কারণ ঘটায়। সম্ভবত কমপক্ষে করুন:for(int n = 0; (n = in.read(buffer)) > 0;) { out.write(buffer, 0, n); }
ব্রায়ান ডি আলুইস

2
@ ব্র্যান্ডআলুইস আপনি প্রথম পুনরাবৃত্তিটি ভুল হওয়ার বিষয়ে ঠিক বলেছেন। কোডটি ঠিক করা হয়েছে (আপনার পরামর্শের তুলনায় পরিষ্কার পদ্ধতিতে আইএমএইচও) - সম্পাদিত কোড দেখুন। যত্ন নেওয়ার জন্য Thx।
বোহেমিয়ান

3

এটি আমার সেরা শট !!

এবং ব্যবহার না inputStream.transferTo(...)কারণ খুব জেনেরিক। আপনি যদি আপনার বাফার মেমরিটি নিয়ন্ত্রণ করেন তবে আপনার কোড পারফরম্যান্স আরও ভাল হবে।

public static void transfer(InputStream in, OutputStream out, int buffer) throws IOException {
    byte[] read = new byte[buffer]; // Your buffer size.
    while (0 < (buffer = in.read(read)))
        out.write(read, 0, buffer);
}

আমি যখন স্ট্রিমের আকারটি আগেই জানতাম তখন আমি এই (অস্থাবর) পদ্ধতিটি ব্যবহার করি।

public static void transfer(int size, InputStream in, OutputStream out) throws IOException {
    transfer(in, out,
            size > 0xFFFF ? 0xFFFF // 16bits 65,536
                    : size > 0xFFF ? 0xFFF// 12bits 4096
                            : size < 0xFF ? 0xFF // 8bits 256
                                    : size
    );
}

2

আমি মনে করি একটি বৃহত বাফার ব্যবহার করা ভাল, কারণ বেশিরভাগ ফাইল 1024 বাইটের চেয়ে বেশি। ধনাত্মক হওয়ার জন্য পঠিত বাইটের সংখ্যা পরীক্ষা করা ভাল অভ্যাস।

byte[] buffer = new byte[4096];
int n;
while ((n = in.read(buffer)) > 0) {
    out.write(buffer, 0, n);
}
out.close();

4
বড় বাফারটি ব্যবহার করা আসলেই একটি ভাল ধারণা তবে ফাইলগুলি বেশিরভাগ ক্ষেত্রেই> 1 কে হয় না, এটি সিস্টেম কলগুলির ব্যয়কে ছোট করে তোলা।
লার্নের মারকুইস

1

আমি কোড থেকে বাফারিং শব্দার্থ ব্যবহার করি BufferedInputStreamএবং BufferedOutputStreamঅপসারণ করি

try (OutputStream out = new BufferedOutputStream(...);
     InputStream in   = new BufferedInputStream(...))) {
  int ch;
  while ((ch = in.read()) != -1) {
    out.write(ch);
  }
}

'কোড থেকে বাফারিং শব্দার্থবিজ্ঞানগুলি সরানো' কেন একটি ভাল ধারণা?
27:57

2
এর অর্থ আমি নিজে বাফারিং যুক্তিটি লিখি না, আমি জেডিকে নির্মিত একটি ব্যবহার করি যা সাধারণত যথেষ্ট ভাল।
আর্কিমিডিজ ট্রাজানো

0

আপনি অন্যটির সাথে সংযোগ করতে পারেন বলে পাইপডিনপুটস্ট্রিম এবং পাইপড আউটপুট স্ট্রিমের কিছুটা ব্যবহার হতে পারে।


1
এটি একক থ্রেডযুক্ত কোডের পক্ষে ভাল নয় কারণ এটি অচলাবস্থার হতে পারে; এই প্রশ্ন দেখতে পাবেন stackoverflow.com/questions/484119/...
Raekye

2
কিছু ব্যবহার হতে পারে কিভাবে? ইতিমধ্যে তার একটি ইনপুট স্ট্রিম এবং একটি আউটপুট স্ট্রিম রয়েছে। প্রতিটি সাহায্যের আরও একটি করে কীভাবে যুক্ত করবেন?
লার্নের মারকুইস

0

অন্য সম্ভাব্য প্রার্থী হলেন পেয়ারা আই / ও ইউটিলিটিগুলি:

http://code.google.com/p/guava-libraries/wiki/IOExplained

আমি ভেবেছিলাম যে আমি এইগুলি ব্যবহার করব কারণ একটি প্রকল্পের জন্য অন্য কোনও গ্রন্থাগার যুক্ত করার চেয়ে পেয়ারা ইতিমধ্যে আমার প্রকল্পে প্রচুর উপকারী।


আছে copyএবং toByteArrayপদ্ধতি docs.guava-libraries.googlecode.com/git-history/release/javadoc/... (পেয়ারা ইনপুট কল / আউটপুট হিসাবে "বাইট স্ট্রিম" এবং হিসাবে "গৃহস্থালির কাজ স্ট্রিম" পাঠকদের / লেখকদের স্ট্রীম করে)
Raekye

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

"বিশাল"? খুব সামান্য নির্ভরশীলতার একটি সেট সহ ২.M এমবি এবং একটি এপিআই যা সাবধানতার সাথে মূল জেডিকে ডুপ্লিকেট করা এড়িয়ে চলে।
অ্যাড্রিয়ান বেকার

0

খুব পঠনযোগ্য নয়, তবে কার্যকর, এর কোনও নির্ভরতা নেই এবং কোনও জাভা সংস্করণ দিয়ে চলে

byte[] buffer = new byte[1024];
for (int n; (n = inputStream.read(buffer)) != -1; outputStream.write(buffer, 0, n));

!= -1বা > 0? সেই পূর্বাভাসগুলি এক রকম নয়।
ইমপালার

! = -1 অর্থ ফাইলের শেষ নয়। এটি কোনও পুনরাবৃত্তি নয় তবে ছদ্মবেশে কিছুক্ষণের জন্য লুপ: যখন ((এন = ইনপুটস্ট্রিম.ড্রেড (বাফার))! = -1) ডু {আউটপুটস্ট্রিম.ওরাইট (বাফার, 0, এন) IP
আইপিপি

-1
public static boolean copyFile(InputStream inputStream, OutputStream out) {
    byte buf[] = new byte[1024];
    int len;
    long startTime=System.currentTimeMillis();

    try {
        while ((len = inputStream.read(buf)) != -1) {
            out.write(buf, 0, len);
        }

        long endTime=System.currentTimeMillis()-startTime;
        Log.v("","Time taken to transfer all bytes is : "+endTime);
        out.close();
        inputStream.close();

    } catch (IOException e) {

        return false;
    }
    return true;
}

4
আপনি দয়া করে ব্যাখ্যা করতে পারেন কেন এটি সঠিক উত্তর?
রোফোনাল


-6

আপনি এই পদ্ধতি ব্যবহার করতে পারেন

public static void copyStream(InputStream is, OutputStream os)
 {
     final int buffer_size=1024;
     try
     {
         byte[] bytes=new byte[buffer_size];
         for(;;)
         {
           int count=is.read(bytes, 0, buffer_size);
           if(count==-1)
               break;
           os.write(bytes, 0, count);
         }
     }
     catch(Exception ex){}
 }

6
catch(Exception ex){}- এটি শীর্ষ খাঁজ
ᄂ ᄀ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.