- PR -

Streamで入ってきたデータをbyte[]として扱いたい

投稿者投稿内容
タヌキ
会議室デビュー日: 2007/03/06
投稿数: 10
投稿日時: 2007-03-09 11:35
Socket soc = new Socket("localhost",80);
try{

BufferedInputStream dis =new BufferedInputStream(soc.getInputStream());
//ここでどう書けばdisをbyte[]に出来るか知りたい
byte[] bas64 = Base64.decodeBase64(dis);

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(
"c:/Tomcat5.5/webapps/SExam/files/after.zip"));
System.out.println(bos+"bos");



[ メッセージ編集済み 編集者: タヌキ 編集日時 2007-03-09 11:46 ]

[ メッセージ編集済み 編集者: タヌキ 編集日時 2007-03-09 11:47 ]

[ メッセージ編集済み 編集者: タヌキ 編集日時 2007-03-09 12:08 ]
タヌキ
会議室デビュー日: 2007/03/06
投稿数: 10
投稿日時: 2007-03-09 11:42
書いている途中で間違えて投稿しちゃいましたごめんなさい。
ただ今Socketを使ってByte[]データ(BASE64)型の受け渡しをしているんですが、ファイルを排出した時にBASE64型だからだとは思うのですが”書庫が壊れています”とエラーが出てしまうのでBufferedInputStreamで渡ってきているデータをbyte[]に変換してdecodeBase64();をしてファイルとして排出したいのですがなかなか上手くいきません。
初歩的な質問だとは思いますがご存知の方がいらしたらご教授お願い致します。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-03-09 11:53
APIを確認しましたか?
Streamからの読み込みはそもそもbyte[]なのですが…。

http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/io/BufferedInputStream.html#read(byte[], int, int)
タヌキ
会議室デビュー日: 2007/03/06
投稿数: 10
投稿日時: 2007-03-09 12:07
nagise様早速のレスありがとうございます。
そうなんですよね、APIは確認していてそのままBase64.decodeBase64()と出来るのかと思っていたのですが何故か出来なくてdecodeBase64(dis,0,dis.length);としてもデコードしてくれないんですよ、それでbyte.byteValue(dis);みたいな感じでbyte[]に変換できるものなのかと思って試したのですが書き方が悪いのか上手く出来ないんですよ。
まだjavaを勉強し始めて短いので基本的なところが理解できていない所が多々あるので変な質問とかしているのかもしれないですが、これからもご教授お願い致します。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-03-09 13:24
引用:

タヌキさんの書き込み (2007-03-09 12:07) より:
そうなんですよね、APIは確認していてそのままBase64.decodeBase64()と出来るのかと思っていたのですが何故か出来なくてdecodeBase64(dis,0,dis.length);としてもデコードしてくれないんですよ、それでbyte.byteValue(dis);みたいな感じでbyte[]に変換できるものなのかと思って試したのですが書き方が悪いのか上手く出来ないんですよ。



??
1.BufferedInputStreamからbyte[]を取得
2.byte[]をBase64でデコードしてbyte[]を取得
わからないのはどこですか?

このBase64って言っているのは何のパッケージのBase64クラスですか?
Javaの標準APIではないですよね?

ちょっと状況がつかめません。
タヌキ
会議室デビュー日: 2007/03/06
投稿数: 10
投稿日時: 2007-03-09 13:51
nagise様レスありがとうございます。
そうですよねあまりに文章が長くなるといけないかと思いコードを簡単に纏めすぎでした。
一応自分で色々試してみて何とかdecodeBase64までこぎつける事が出来ましたが又新たな問題が出てきたので引き続きご教授願えたらと思います。
それで何が問題かと言うとByteArrayOutputStreamでBesr64にしたのですがByteArrayOutputStream bos = new ByteArrayOutputStream(new FileOutputStream(
"c:/Tomcat5.5/webapps/SExam/files/after.zip")); みたいな感じで指定した場所にFileを作るにはどうすれば宜しいのでしょうか?

今のところBufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("c:/Tomcat5.5/webapps/SExam/files/after.zip"));
の部分でファイルとして出力させているのですが、デコードが出来ていないものを出力しているわけだから当然ファイルが壊れていますと怒られてしまいます。

説明べたなので一応全文書いておきます、目を通して頂けるとありがたいです宜しくお願い致します。

送り側のコード
package upload.action;

import java.net.*;
import java.io.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.upload.FormFile;
import wicket.util.crypt.Base64;

public class UploadAction extends Action {

public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
request.setCharacterEncoding("Shift_JIS");
/*
* ファイルアップロード
*/
UploadForm uploadForm = (UploadForm) form;
FormFile ff = uploadForm.getFile1();
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
bis = new BufferedInputStream(ff.getInputStream());
bos = new BufferedOutputStream(new FileOutputStream(
"c:/Tomcat5.5/webapps/SExam/files/Before.zip"));
int b = 0;
while ((b = bis.read()) != -1) {
bos.write(b);
}
/*
* URLのインスタンスと接続 この時点では接続していない
*/

String host = "localhost";
int port = 80;
String path = "/Sample/VariousInput.do";
BufferedWriter writer;
byte[] buff = ff.getFileData();
byte[] bb64 = Base64.encodeBase64(buff);
System.out.println(": "+bb64+" : bb64");
Socket socket = new Socket(host, port);
//setRequestProperty("Accept-Language","multipart/form-data");

writer = new BufferedWriter(new OutputStreamWriter(socket
.getOutputStream()));
writer.write("GET " + path + " HTTP/1.0\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\r\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n");
writer.write("Host: " + host + ":" + port + "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\r\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n");
writer.write("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\r\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n");
writer.flush();

BufferedOutputStream br = new BufferedOutputStream(socket
.getOutputStream());
socket = new Socket(host, port);
br.write(bb64, 0, bb64.length);
br.close();
System.out.println(": "+bb64+" : bb64_2");
socket.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bis != null) {
bis.close();
}
if (bos != null) {
bos.close();
}
}
return mapping.findForward("success");
}
}

受け取り側

package upload.action;


import java.io.*;
import java.net.Socket;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import wicket.util.crypt.Base64;

public class InsertFile extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
Socket soc = new Socket("localhost",80);
try{

BufferedInputStream dis =new BufferedInputStream(soc.getInputStream());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int ret = 0;
byte[] buf = new byte[1024];
while( ( ret = dis.read(buf,ret,1024)) != -1 ){
baos.write(buf);
}
byte[] ba64 = Base64.decodeBase64(baos.toByteArray());

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(
"c:/Tomcat5.5/webapps/SExam/files/after.zip"));

}catch(Exception e){
System.out.println("エラー");
}
return mapping.findForward("success");
}
public void doPost(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
execute(mapping, form, request, response);
}

}
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-03-09 14:21
「Streamで入ってきたデータをbyte[]として扱いたい」について解決しているのでしたら、別途スレッドをあげてはいかがでしょう。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-03-09 14:23
引用:

タヌキさんの書き込み (2007-03-09 13:51) より:
一応自分で色々試してみて何とかdecodeBase64までこぎつける事が出来ましたが又新たな問題が出てきたので引き続きご教授願えたらと思います。
それで何が問題かと言うとByteArrayOutputStreamでBesr64にしたのですがByteArrayOutputStream bos = new ByteArrayOutputStream(new FileOutputStream(
"c:/Tomcat5.5/webapps/SExam/files/after.zip")); みたいな感じで指定した場所にFileを作るにはどうすれば宜しいのでしょうか?

今のところBufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("c:/Tomcat5.5/webapps/SExam/files/after.zip"));
の部分でファイルとして出力させているのですが、デコードが出来ていないものを出力しているわけだから当然ファイルが壊れていますと怒られてしまいます。



あいかわらず問題点が分かりにくいなぁ…。

1.「decodeBase64までこぎつける事が出来ました」と言っているからBase64でのデコードはできるようになった?
2.今回の質問は「指定した場所にFileを作る」方法を問うている?
3.しかし、2ですでにやり方を自分で書いているってことは出来ているんじゃないの?
4.「デコードが出来ていないものを出力しているわけだから」ってあれ?1で解決してなかったんだ?
5.そもそも4で問題になっているのはデータの中身の話だから2の問題って解決してるんじゃん。
6.で、結局分からないのは前の投稿の際の問題点だったBase64のデコードの仕方なの?

という感じで文面を読んでいたのですが…。
つまるところ問題はなんなのですか?

# ソース添付されても読むのは大変なので問題点が不明なときは大抵読み飛ばされますよ

スキルアップ/キャリアアップ(JOB@IT)