একটি স্ট্রিং এ আউটপুট স্ট্রিম পান


580

জাভা.আই.আউটপ্রেম স্ট্রিম থেকে জাভাতে স্ট্রিংয়ের আউটপুটটি পাইপ করার সর্বোত্তম উপায় কী?

বলুন আমার কাছে পদ্ধতি আছে:

  writeToStream(Object o, OutputStream out)

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

আমি এই জাতীয় (অনির্ধারিত) লেখার জন্য বিবেচনা করছি:

class StringOutputStream extends OutputStream {

  StringBuilder mBuf;

  public void write(int byte) throws IOException {
    mBuf.append((char) byte);
  }

  public String getString() {
    return mBuf.toString();
  }
}

তবে এর চেয়ে ভাল উপায় আর কি আছে? আমি কেবল একটি পরীক্ষা চালাতে চাই!


6
আপনার কি কেবল এএসসিআইআই বাইট রয়েছে? আপনার কি কোনও কোডপেজ দরকার?
Horcrux7

এই ক্ষেত্রে, হ্যাঁ। যাইহোক, ভাল পয়েন্ট - আমি এটি সম্পর্কে চিন্তা করা হয়নি।
অ্যাড্রিয়ান মৌআত

উত্তর:


607

আমি একটি ব্যবহার করব ByteArrayOutputStream। এবং শেষ হলে আপনি কল করতে পারেন:

new String( baos.toByteArray(), codepage );

বা আরও ভাল:

baos.toString( codepage );

জন্য Stringকন্সট্রাকটর, codepageএকটি হতে পারে Stringঅথবা একটি দৃষ্টান্ত java.nio.charset.Charset । একটি সম্ভাব্য মান হ'ল java.nio.charset.SandardCharsets.UTF_8

পদ্ধতিটি toString()কেবলমাত্র একটি প্যারামিটার Stringহিসাবে গ্রহণ করে codepage(স্ট্যান্ড জাভা 8)।


8
বাইটআরআউটআউটপুট স্ট্রিমের কোনও টু অ্যারে () পদ্ধতি নেই; যদিও এটিতে টায়ারাইট () আছে। আপনি উত্তর ঠিক করতে পারেন? এছাড়াও, কেন baos.toString (স্ট্রিং চরসেটনাম) ব্যবহার করবেন না যা কিছুটা সহজ হবে ler
জোনিক

35
একটি বাইটারি কেবল বাইনারি ডেটা। যেমন (ইউনিকোড) পাঠ্যটি বাইনারিটিকে বিভিন্নভাবে এনকোড করা যায়, বাইটআরআউটআউটপুট স্ট্রিমটি বাইটগুলি এনকোড করার জন্য কী এনকোডিংটি ব্যবহার করা হত তা জানতে হবে, তাই এটি আবার স্ট্রিংয়ে বাইটগুলি ডিকোড করতে একই এনকোডিংটি ব্যবহার করতে পারে। কেবল কোনও যুক্তি ছাড়াই টস্ট্রিং ব্যবহার করা বুদ্ধিমানের কাজ নয় কারণ আপনি সমস্যাটিকে মোকাবেলা করার পরিবর্তে কেবল এটিকে উপেক্ষা করছেন; জাভা প্ল্যাটফর্ম এনকোডিং ব্যবহার করবে যা সঠিক হতে পারে ... না or এটি মূলত এলোমেলো। বাইটগুলিতে পাঠ্যটি লিখতে এবং এনকোডিংটি টোস্ট্রিংয়ে পাস করার জন্য আপনাকে কী এনকোডিং ব্যবহার করা হয়েছিল তা খুঁজে বের করতে হবে।
স্টিজন ডি উইট

10
কোডেপেজ সম্পর্কিত এখানে কেবল একটি স্পষ্টকরণ এখানে উল্লেখ করা হয়েছে: জাভাতে আপনি চরসেট.ডেফল্টচার্যাসেট () বা চরসেট.ফোর্নাম ("নির্দিষ্ট অক্ষর") ব্যবহার করতে পারেন; আমার জন্য যা কাজ করেছিল তা হ'ল: নতুন স্ট্রিং (baos.toByteArray (), Charset.defaultCharset ());
ওয়ালেস ব্রাউন

7
@ ওয়ালেসব্রাউন ব্যবহার defaultCharsetকরা চারসেট পুরোপুরি উপেক্ষা করার চেয়ে ভাল নয় - আপনার ব্যবহারের আগে এটি কী তা আপনার খুঁজে বের করতে হবেtoString
আর্টব্রিস্টল

4
StandardCharsets.UTF_8একটি Charset, না একটি String। তাছাড়া প্যারামিটারটি বলা হয় charsetName, না codepage
অরেঞ্জডগ

46

আমি অ্যাপাচি কমন্স আইও লাইব্রেরি পছন্দ করি। বাইটআর্যআউটপুট স্ট্রিমের এর সংস্করণটি একবার দেখুন, এর toString(String enc)পাশাপাশি একটি পদ্ধতি রয়েছে toByteArray()। কমন্স প্রকল্পের মতো বিদ্যমান এবং বিশ্বস্ত উপাদানগুলি ব্যবহার করা আপনার কোডটিকে আরও ছোট এবং সহজ করতে প্রসারিত এবং পুনরায় প্রকাশ করতে দেয়।


10
নিজেকে আপনার জীবনের এক বছর বাঁচান এবং সমস্ত সাধারণ এর API গুলি পড়ুন যাতে আপনি যখন কোনও সমস্যার মুখোমুখি হন তখন আপনি সম্পূর্ণ পরীক্ষিত এবং সম্প্রদায়ের মালিকানাধীন সমাধান আনতে পারেন।
বব হার্মম্যান

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

1
হ্যাঁ, যেহেতু মূল প্রসঙ্গটি সামগ্রীটি স্ট্রিম করা এবং উত্তোলনের সর্বোত্তম উপায় ছিল, তাই আমি কমন্স আইও উদাহরণটিকে অন্তর্ভুক্ত করেছি কারণ এটি আউটপুট স্ট্রিমকে জনসাধারণের জন্য তত্ক্ষণাত-সংজ্ঞায়িত / প্রশ্নবিদ্ধ প্রক্রিয়াটির জন্য একটি 'রাইটিং (ইনপুটস্ট্রিম)' পদ্ধতি অন্তর্ভুক্ত করে। আমিও জেডিকে নিয়ে যাব।
জো লিভার্জেড

23

এটি দুর্দান্তভাবে কাজ করেছে

OutputStream output = new OutputStream() {
    private StringBuilder string = new StringBuilder();

    @Override
    public void write(int b) throws IOException {
        this.string.append((char) b );
    }

    //Netbeans IDE automatically overrides this toString()
    public String toString() {
        return this.string.toString();
    }
};

পদ্ধতি কল = >> marshaller.marshal( (Object) toWrite , (OutputStream) output);

তারপরে স্ট্রিংটি মুদ্রণ করতে বা কেবল "আউটপুট" স্ট্রিমকে নিজেই রেফারেন্স করুন উদাহরণ হিসাবে, কনসোল থেকে স্ট্রিংটি মুদ্রণ করতে >> >> System.out.println(output);

এফওয়াইআই: আমার মেথড কলটি marshaller.marshal(Object,Outputstream)এক্সএমএল নিয়ে কাজ করার জন্য। এটি এই বিষয়ের সাথে অপ্রাসঙ্গিক।

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

আর পৃথিবী অন্য দিন বেঁচে থাকে ....


9
কেবল চরে বাইট castালাই কেবল অ্যাস্কেই কাজ করবে। বোরআরআউটপুট স্ট্রিমটি হরক্রাক্স 22 এর মতো ব্যবহার করুন
ডেভ রে

2
ডেভ রায়ের সাথে একমত আপনি ধরে নিতে পারবেন না যে আপনার বাইটটি একটি ASCII চরিত্র। আপনার একটি এনকোডিং ব্যবহার করে বাইটগুলি ব্যাখ্যা করতে হবে। বাইটআরআউটপুটস্ট্রিম.টোস্ট্রিং ("ইউটিএফ -8") বা নতুন স্ট্রিং (বাইটআরআউটআউটপুটস্ট্রিম.টোবাইটআর্রে (), "ইউটিএফ -8") ব্যবহার করুন।
মার্টিন ডাও

16

আমি এখানে যা শেষ করেছি তা এখানে:

Obj.writeToStream(toWrite, os);
try {
    String out = new String(os.toByteArray(), "UTF-8");
    assertTrue(out.contains("testString"));
} catch (UnsupportedEncondingException e) {
    fail("Caught exception: " + e.getMessage());
}

যেখানে ওএস ক ByteArrayOutputStream


2
@ জাভা জিগস আমি প্রায় 5 বছর আগে আমার উত্তরটির নীচে এটি স্পষ্ট করেছিলাম :)
অ্যাড্রিয়ান মৌট

19
"UTF-8"সঙ্গে প্রতিস্থাপন বিবেচনা করুন StandardCharsets.UTF_8
james.garriss

0
baos.toString(StandardCharsets.UTF_8);

নামযুক্ত চরসেট ব্যবহার করে বাইটগুলি ডিকোড করে বাফারের সামগ্রীগুলিকে স্ট্রিংয়ে রূপান্তর করে।

জাভা 14 - https://docs.oracle.com/

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