• ベストアンサー

出力ストリームをバイト配列へ変換するには

出力ストリームをバイト配列へ変換するには いつもお世話になります。 BufferedOutpuStreamで取得したオブジェクトを(ByteArrayOutputStreamでインスタンス生成)、バイト配列へ変換するにはどのようにすればよいでしょうか。 ByteArrayOutputStreamだと、toByteArrayメソッドでバイト配列へ変換できるのですが、効率化を考慮し、BufferedOutputStreamへ出力するように しているのですが、この場合だと取得したBufferedOutputStreamをバイト配列へ変換する方法が分からず困っています。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

>ByteArrayOutputStreamでインスタンス生成 ByteBufferじゃ駄目なんですか?  Bruce Eckel, "Thinking in Java (4th Edition)" (Prentice Hall, 2006) によると、p.946~p.948に、次のようにあります。 The Java “new” I/O library, introduced in JDK 1.4 in the java.nio.* packages, has one goal: speed. (中略) The speed comes from using structures that are closer to the operating system’s way of performing I/O: channels and buffers. (中略) The only kind of buffer that communicates directly with a channel is a ByteBuffer?that is, a buffer that holds raw bytes. (中略) Three of the classes in the “old” I/O have been modified so that they produce a FileChannel: FileInputStream, FileOutputStream, and, for both reading and writing, RandomAccessFile. Notice that these are the byte manipulation streams, in keeping with the low-level nature of nio. The Reader and Writer character-mode classes do not produce channels, but the class java.nio.channels.Channels has utility methods to produce Readers and Writers from channels. Here’s a simple example that exercises all three types of stream to produce channels that are writeable, read/writeable, and readable: //: io/GetChannel.java // Getting channels from streams import java.nio.*; import java.nio.channels.*; import java.io.*; public class GetChannel { private static final int BSIZE = 1024; public static void main(String[] args) throws Exception { // Write a file: FileChannel fc = new FileOutputStream("data.txt").getChannel(); fc.write(ByteBuffer.wrap("Some text ".getBytes())); fc.close(); // Add to the end of the file: fc = new RandomAccessFile("data.txt", "rw").getChannel(); fc.position(fc.size()); // Move to the end fc.write(ByteBuffer.wrap("Some more".getBytes())); fc.close(); // Read the file: fc = new FileInputStream("data.txt").getChannel(); ByteBuffer buff = ByteBuffer.allocate(BSIZE); fc.read(buff); buff.flip(); while(buff.hasRemaining()) System.out.print((char)buff.get()); } } /* Output: Some text Some more *///:~

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 文字のバイトサイズの取得

    25バイト以上ある文字配列を25バイトまでに切り取りたいのです。 全て半角英数ならstr.substring(0 ,25)ですみますが 日本語も入っているのでsubstringが使えません。 そこで,バイト配列を使おうと思ったのですがうまくいきません。どうかお願いします。 例) String E = "AAAAAAAAAAAAAあああああああ"; byte S[] = new byte[100]; S=E.getBytes(); ByteArrayOutputStream out = new ByteArrayOutputStream(); for(int n = 0; n < 25 ; ++n){ out.write(S[n]); } System.out.println(out.toByteArray()); 結果として"AAAAAAAAAAAAAあああ"が出力されてほしい

    • ベストアンサー
    • Java
  • OutputStreamの内容を確認するには?

    Javaサーブレットでバイナリデータを出力したいと思っています。 デバッグのために出力した内容を、ログに出力したいのですが バッファのデータを取得する方法が見つかりません。 ●現在のソース(抜粋) ---------------------- ServletOutputStream out = response.getOutputStream(); BufferedOutputStream outbuf = new BufferedOutputStream(out); DataOutputStream outdata = new DataOutputStream(outbuf); outdata.writeLong(longValue); outdata.writeInt(intValue); outdata.writeShort(shortValue); outdata.flash(); ---------------------- 一番上が ServletOutputStream out = response.getOutputStream(); ではなく ByteArrayOutputStream out = new ByteArrayOutputStream(); であれば、toByteArray() などで問題なく内容を取得できそう なのですが、それではクライアントに出力できなくなってしまいます。 何かよい方法がありましたら教えていただけないでしょうか?

  • ByteArrayInputStreamを配列に

    ByteArrayInputStreamから読み取ったバイトデータをbyte配列に格納したいのですが,よく分かりません. ByteArrayOutputStreamにはtoBytesメソッドがあるようなのですが・・. 分かる人がいましたらサンプルコードが参考サイトへのURLを教えていただけないでしょうか.

    • ベストアンサー
    • Java
  • ByteArrayOutputStreamでの出力について

    以下のソース(抜粋)でこのreturnの箇所で「型の不一致」エラーが出てしまいます。最後にこのクラスのこのメソッドからServletへ値を戻したいのですが。 メソッドのデータ型はbyteですし、Servlet側の受容れる為の変数もbyte型にしています。 経験不足で原因が見つけられません。どなたかご教授をお願い致しますm(__)m Document document = DocumentBuilderFactory.newInstance() .newDocumentBuilder() .getDOMImplementation() .createDocument("", "rt", null); ~文字列からDOMを使ってxmlの生成処理~ Transformer transformer = TransformerFactory.newInstance() .newTransformer(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); transformer.transform(new DOMSource(document),new StreamResult(baos)); byte[] buff = baos.toByteArray(); return buff;

    • ベストアンサー
    • Java
  • 配列のNullPointerException

    String[]; s.length; これをコンパイルするとコンパイルエラーになりますが、なぜNullPointerExceptionではないのですか? 通常オブジェクトが生成されていないものに対し、メソッド、フィールドの呼び出しを行うとNullPointerExceptionになるはずなのですが…。 配列のlengthがメソッドでもフィールドでもないという事は聞いたことがありますが、これはいったい何なのですか?

    • ベストアンサー
    • Java
  • 配列のNullPointerException

    String[] s; s.length; これをコンパイルするとコンパイルエラーになりますが、なぜNullPointerExceptionではないのですか? 通常オブジェクトが生成されていないものに対し、メソッド、フィールドの呼び出しを行うとNullPointerExceptionになるはずなのですが…。 配列のlengthがメソッドでもフィールドでもないという事は聞いたことがありますが、これはいったい何なのですか?

  • Javaのコネクションやストリームについて

    Javaのコネクションやストリームを別クラスやメソッドに渡したときの、close処理について質問です。 例えば、あるクラスで取得したDBコネクションオブジェクトを、別のクラスやメソッドに渡した場合、close処理はどこで行うのが適切でしょうか? 呼び出し元で行うのが良いのか、呼び出し先で行うのが良いのか、または、両方で行うべきなのか。 どなたかご教授願います。

    • ベストアンサー
    • Java
  • int配列をbyte配列に変換

    MIDPアプリを作成している初心者です。 Image データを一旦端末のレコードストアに保存しておく為、 getRGB()で取得したint配列を、byte配列に変換しなくてはいけません。 ↓のように レコードストアに書き込むメソッドを書いてみました。 public void writeRecordStore( String name, Image image ) {     int width = image.getWidth();     int height = image.getHeight();     int[] pxData = new int[ width*height ];     byte[] byteData;     RecordStore rs = null;     try {         //画像をバイトデータに変換         image.getRGB( pxData, 0, width, 0, 0, width, height );         //レコードストアを開く         rs = RecordStore.openRecordStore( name, true );         //バイト配列に変換 ← ここがわからない                  //レコードの追加         rs.addRecord( byteData, 0, byteData.length );              } catch( Exception e ) {     } } int配列をbyte配列に変換する方法わかる方 ご教授の程お願いします。 また、まだコーディングに自信が無いので、文法のミスもご指摘頂けたらありがたいです。

    • ベストアンサー
    • Java
  • javaで配列の中身を表示する方法

    こんばんは。 私は、PHPをやっていたのですが、今度はjavaにチャレンジしてみたいと思っています。 それで、質問です。 PHPでは重宝していたのですが、print_r()メソッドにあたるメソッドはないでしょうか? このメソッドは、配列やオブジェクトの中身を全て出力してくれるメソッドなのですが…。配列の構造が見たいときなどはとても重宝しました。 ex) ■プログラム $arr = array(1, 2, 3, 4, 5); print_r($arr); ■結果: Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) ご存知の方いらっしゃいまいしたら、教えてください。

  • 最終配列にNULLが含まれる場合の対応について

    下記のソースで テキスト入出力を行う際でのご質問がございます。 最終配列がNULLの時と 文字がある場合のデータを入出力する際に Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 at ExIO3.getValue(テスト.java:53) at ExIO3.main(テスト.java:14) というエラーが表示されます。 最終配列にすべて文字が存在する場合は問題ないのですが こちらはBufferedReaderで 1レコードずつ読み込んでいるソースに問題があるのでしょうか? アドバイスどうぞよろしくお願いします。 import java.io.*; //(1)入出力パッケージのインポート import java.text.Normalizer; class ExIO3 { //mainメソッド public static void main(String[] args) throws IOException { ExIO3 object1 = new ExIO3(); //(1)抜出しメソッドgetValueと、 // ソートメソッドsortValueの呼出 object1.sortValue(object1.getValue()); } //getValueメソッド Reader getValue () throws IOException { //(2)FileReaderオブジェクトcsvの生成 FileReader csv = new FileReader ("C:\\javasample\\テスト\\src\\テストin.txt"); //(3)BufferedReaderクラスでFileReaderクラスの // オブジェクトcsvをラップ BufferedReader in = new BufferedReader(csv); //(4)PipedWriterオブジェクトpipeOutを生成 PipedWriter pipeOut = new PipedWriter(); //(5)PipedReaderオブジェクトpipeInを生成 PipedReader pipeIn = new PipedReader(pipeOut); //(6)PrintWriterクラスでPipedWriterクラスの // オブジェクトpipeOutをラップ PrintWriter out = new PrintWriter("C:\\javasample\\テスト\\src\\テストout.txt"); //************************************************************************************************ //(7)入力テキストデータ //************************************************************************************************ String line; String[] arrayline; Integer sequence_No =0 ; //行のカウンタ //(8)読み込みソースがなくなるまでBufferedReaderで1行ずつ読み込み、 // 読み込みデータをprintlnメソッドで書き込み while((line = in.readLine()) != null) { sequence_No++; //連続番号生成 arrayline = line.split(","); //====================================================== String A= arrayline[0] ; String B = arrayline[1] ; //====================================================== //************************************************************************************************ //(9)出力テキストデータ //************************************************************************************************ 顧客郵便番号_編集(A,out); out.print(","); // ※ 顧客住所_編集(B,out); out.println(""); // ※ out.flush(); } //(10)読み込みストリームのクローズ in.close(); //(11)書き込みストリームのクローズ out.close(); return pipeIn; //(12)pipeInオブジェクトのリターン } //************************************************************************************************ //顧客郵便番号_編集A1 //************************************************************************************************ private void 顧客郵便番号_編集(String a, PrintWriter out) { // TODO 自動生成されたメソッド・スタブ out.print(a.replaceAll(" ","").replaceAll(" ","")); } //************************************************************************************************ //顧客住所_編集B2 //************************************************************************************************ private void 顧客住所_編集(String b, PrintWriter out) { // TODO 自動生成されたメソッド・スタブ out.print(b); } //sortValueメソッド void sortValue(Reader source) throws IOException { } }

    • ベストアンサー
    • Java