• 締切済み

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() などで問題なく内容を取得できそう なのですが、それではクライアントに出力できなくなってしまいます。 何かよい方法がありましたら教えていただけないでしょうか?

みんなの回答

noname#80901
noname#80901
回答No.1

外部APIを使うことになりますが、参考URLのようなクラスを使えば実現できそうです。

参考URL:
http://people.apache.org/~jochen/commons-io/site/apidocs/org/apache/commons/io/output/TeeOutputStream.html
SuggieQQ
質問者

お礼

ありがとうございます。 このクラスを使うと、下記のようにして、 2つのOutputStreamをまとめることができそうですね。 ServletOutputStream out; ByteArrayOutputStream branch; TeeOutputStream(out, branch); 時間のあるときに試してみたいと思います。 結果が分かったら報告します。

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

関連するQ&A

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

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

    • ベストアンサー
    • Java
  • JSPでのiTextの動かし方について

    JSPでiTextを動かそうとしていますが、下記JSPソースプログラムでは コンパイルエラーが発生してうまいいきません 原因をお教え頂ければたすかります たぶん設定が不足していると思います 動作環境:jdk.1.6.0_26 Eclipse3.7 Apache-tomcat-7.0.29 ファイル:Program Files\Java\jre6\lib\ext\iText-5.0.6.jar と iTextAsian.jarをインストール JSPソースプログラム <%@ page import="java.io.*, com.lowagie.text.*, com.lowagie.text.pdf.*"%> <% response.setContentType( "application/pdf" ); // step 1: ドキュメントオブジェクトの作成 Document document = new Document(); // step 2: 出力のためのストリームを作成 ByteArrayOutputStream buffer = new ByteArrayOutputStream(); PdfWriter.getInstance( document, buffer ); // step 3: ドキュメントを開く document.open(); // step 4: ドキュメントにパラグラフ(文字列)を追加 document.add(new Paragraph("Hello World")); // step 5: ドキュメントを閉じる document.close(); // step 6: JSPのストリームにPDFを出力する DataOutput output = new DataOutputStream( response.getOutputStream() ); byte[] bytes = buffer.toByteArray(); response.setContentLength(bytes.length); for( int i = 0; i < bytes.length; i++ ) { output.writeByte( bytes[i] ); } %>

    • ベストアンサー
    • Java
  • 文字のバイトサイズの取得

    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
  • バイナリファイルを転送したいのですが

    お世話になります socketを用いてサーバへファイルを転送したいのですが、うまくいきません。 以下ソースからの抜粋です BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream()); BufferedInputStream in = new BufferedInputStream(new FileInputStream("test.txt")); int c; while((c = in.read()) != -1 ){  out.write(c); } 上記のようなコーディングでは転送できないのでしょうか? 出来ればファイルから1024バイトずつ読み込んで1024バイトずつ出力していき、ファイルの終端まで繰り返す処理をしたいのですが、よい方法をご存知でしたら教えていただけないでしょうか?

    • ベストアンサー
    • Java
  • Java サーブレット 画像

    サーブレットからgoogleへ接続し、googleのページをブラウザへ返す際、画像のパスが、サーブレットのURLに置き換わってしまいます。 (現象↓) http://localhost:8080/intl/ja_jp/images/logo.gif (やりたいこと↓) http://img0.gmodules.com/ig/f/vcbK_2Vv3S8/intl/ALL_jp/logo.png 上記の(やりたいこと)ようにするには、どうしたら良いでしょうか。 URL url = new URL("http://www.google.co.jp/"); HttpURLConnection urlconn = (HttpURLConnection) url.openConnection(); BufferedInputStream in = new BufferedInputStream(urlconn.getInputStream()); ServletOutputStream sout = response.getOutputStream(); int data; while ((data = in.read()) != -1) { sout.write(data); } sout.close(); urlconn.disconnect();

    • ベストアンサー
    • Java
  • ServletOutputStreamについて

    Streamについて質問です。   サーブレットより、サーバにあるファイルを読み、 それをクライアントでブラウザから表示させようと 思っているのですが、 ファイルが破壊されているためファイルを表示できない。 といった、エラーが出てしまいます。   処理の一部としては ======================================= /* pdfのデータを取得しJSPで表示させる */   // getDataよりサーバファイルをバイト配列で取得 byte data[] = getData(); ServletOutputStream sos = response.getOutputStream(); sos.write(data); sos.flush(); sos.close(); ======================================= のようにしているのですが、JSPで Content-type = "application/pdf" を指定しても、AdbeReaderは起動しますが、 ファイルが壊れているのエラーが出て表示されません。 JPGファイルでは成功したのですが、なぜでしょうか…。   サーブレット内部でFileOutputStreamを使って 同じバイト配列に対してファイルを作成すると、 問題なくサーバにファイルが作成され見ることが できるのですが、JSPで表示させると失敗してし まいます。 正直、不明です。 何か原因のヒントとかあったら教えてください。  

    • ベストアンサー
    • Java
  • socketでのバイナリファイルの扱い方

    javaのsocketを用いてファイルの送信サーバ、受信クライアントを作成しているのですが テストプログラムとしてスレッド化せずに送信・受信部のみ作りました。 症状はバイナリデータの転送がうまくできないことです。ソースを抜粋すると サーバ側で BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());//socketはSocketクラス BufferedInputStream in1 = new BufferedInputStream( new FileInputStream("test1.bmp")); BufferedInputStream in2 = new BufferedInputStream( new FileInputStream("test2.bmp")); while( (c = in1.read() ) != -1 ){   out.write(c); } while( (c = in2.read() ) != -1 ){   out.write(c); } クライアント側で BufferedOutputStream out1 = new BufferedOutputStream( new FileOutputStream("test1.out.bmp") ); BufferedOutputStream out2 = new BufferedOutputStream( new FileOutputStream("test2.out.bmp") ); BufferedInputStream in = new BufferedInputStream( s.getInputStream() ); while( ( c=in.read() ) != -1 ){   out1.write(c); } while( ( c=in.read() ) != -1 ){   out2.write(c); } とやっています。 クライアント側で1回目のin.readを抜けるときにはサーバ側は既に2回のwriteを終わっているようで ファイルはtest1.out.bmpにマージされていました。 サーバ側の1回目のwriteのオブジェクトがcloseしていないことが原因だと思い1回目のwriteが終わった時点でout.close()とした のですがそうやるとsocketも閉じてしまいsocket closeのエラーが生じてしまいました。 このようにならず1本のコネクションでバイナリのデータを複数送信する方法をご存知でしたら教えてください。 [環境] win2ksp1a,j2sdk1.4.1_03,java経験4ヶ月程度

  • java:読み込んだデータの確認

    javaを使って通信のプログラムをつくっています。 送信側でバイトデータを作成して送信します。そして受信側でそのバイトデータを読み込みます。 送信側で作ったバイト数が本当に受信側に届いたかのチェックをするには、 どうすればよいでしょうか?下のコードは、自作した受信処理です。 調べると、read(byte[] b,int off,int len)の返り値が読み込んだバイト数ということなので、 これを使うのではないかと思うのですが、どう使えばよいか分かりません。下のコードは、とりあえず、受信したらcount++として受信処理分だけ countを増やして受信したバイトを数えています。 readの返り値で受信したバイト数を取得するには、どうすればよいでしょうか? 御教授お願いします。 送信側 BufferedOutputStream out = new BufferedOutputStream(sock.getOutputStream()); for (int i = 0; i < Data; i++) {   for (;;) {     try {       out.write(i);       out.flush();       count++;       break;     } catch (IOException e) {       System.err.println((count + 1) + "つ目のバイト:書き込みエラー>>再書き込み");     }   } } 受信側 BufferedInputStream in = new BufferedInputStream(sock.getInputStream()); int ch = 0; // 読み込んだ文字 int Count = 0; // 届いたバイト数のカウンター while (ch != -1) {   try {     ch = in.read(); Count++;   } catch (IOException e) {     System.err.println(Count + "つ目のバイトデータ:読み込みエラー");   } }

    • ベストアンサー
    • Java
  • ファイル読み込み/書き込み速度を上げるには

    下記のようなファイルの読み込み/書き込み処理において、もっと効率よく(速く)読み込み・書き込みをしたい場合どのような工夫をすれば良いでしょうか? BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("sample2.data")); BufferedInputStream in = new BufferedInputStream(new FileInputStream("sample1.data")); int c ; while((c = in.read()) != -1) { out.write(c); } in.close(); out.flush(); out.close();

    • ベストアンサー
    • Java
  • サブクラスの内容をサーバで表示したいです

    まず、<jsp:include flush="true" page="/servlet/page.Sflow1"/>を使い jspでサーブレットを表示しています。 サーブレットではサブクラスを使用していますが、そのサブクラスの内容をサーバで表示するにはどうすればいいでしょうか。 以下、そのソースです。 ・・・・ public class Sflow1 extends HttpServlet{ private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String sql="select id,c_id,barcode from Flow order by id,c_id,date"; System.out.println("sql="+sql); //中略 HashMap<String,Keiro> hsFlow = new HashMap<String,Keiro>(); String idbk=""; String flowbk=null; while(rs.next()){ String id=rs.getString(1)+":"+rs.getString(2); String flow=rs.getString(3); if(id.equals(idbk)){ if(flowbk!=null){Keiro keiro=hsFlow.get(flowbk);if(keiro == null) keiro = new Keiro(); keiro.addKeiro(flow); hsFlow.put(flowbk,keiro); } } idbk = id; flowbk = flow; } PrintWriter out=response.getWriter(); Object maekeiro[]=hsFlow.keySet().toArray(); Arrays.sort(maekeiro); for(int i=0;i<maekeiro.length;i++){ System.out.println(maekeiro[i]+"からの動き"); hsFlow.get(maekeiro[i]).viewData(); out.println(maekeiro[i]+"からの動き"); } } //中略 class Keiro{ private HashMap<String,Integer> hsNext = new HashMap<String,Integer>(); private int soukei = 0; public void addKeiro(String atokeiro){ Integer i = hsNext.get(atokeiro); if (i==null) i=new Integer(0); hsNext.put(atokeiro,new Integer(i.intValue()+1)); soukei++; } public void viewData(){ Object atokeiro[]=hsNext.keySet().toArray(); Arrays.sort(atokeiro); for(int i=0;i<atokeiro.length;i++){ System.out.println("→"+atokeiro[i]+" "+(hsNext.get(atokeiro[i]).intValue()*100/soukei)+"%"); //このSystem.out.println(・・・)の部分をサーバで表示したいです。 } } } どうすれば標準出力(System.out.println)で表示した内容をそのままサーバに送れるのでしょうか? サーブレットを宣言できないのでレスポンスできず・・・ 具体的なソース等ご教示お願いいたします。

    • ベストアンサー
    • Java
このQ&Aのポイント
  • 品質チェックで印刷されるドットにずれがあり、青空写真印刷で薄い線が入る問題が発生しています。
  • お使いの環境はWindows10で、無線LAN経由で接続されています。
  • 関連するソフト・アプリは特に無いと考えているようです。
回答を見る