• ベストアンサー

大きいバイトの宣言の仕方

サーバ側からクライアント側へ ファイルを転送したいと考えています。 UserModeLinuxのルートファイルシステム(4294971392バイト)を送信するのですが、 宣言の部分で 「byte[] data = new byte[4294971392]」 で宣言すると 「型intのリテラル4294971392は範囲外です」 というエラーが出てしまいます。 どのように宣言すればよいでしょうか。

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

  • ベストアンサー
  • junkUser
  • ベストアンサー率56% (218/384)
回答No.5

for(;;){ len = in.read(data); tatalSize = totalSize + len; out.write(data, 0, len); if(totalSize == 4294971392) break; } ↓↓↓↓ while((len = in.read(data)) != -1){ totalSize = totalSize + len; out.write(data, 0, len); } out.flush(); FileNotFoundException を catch のところに入れてくださいね。 とりあえず、ファイルの読み取りについて根本的な部分を勉強してはいかがでしょうか。 http://java.sun.com/javase/ja/6/docs/ja/api/index.html

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

その他の回答 (5)

  • junkUser
  • ベストアンサー率56% (218/384)
回答No.6

申し訳ありません。 No.5 のコードは送信元のものと勘違いして書いたものです。 > 受信を終わる方法はどうするべきでしょうか。 > ソケットを閉じずに行いたいと思っています。 1.ファイルサイズを先に送る。 2.ファイルに書き出しながら受信する。  コードは tatalSize ⇒ totalSize の単なる誤記ですよね? 3.エラーとは具体的にどんなエラーがでるか、開示する。  回答者には質問者が何を悩んでいるのかいまいち伝わっていないようです。  独自解釈せずにエラーメッセージをそのままコピペしてください。

santa1359
質問者

補足

お返事ありがとうございました。 おっしゃる通り、伝わっていないのかもしれません。 すみません。そこで http://oshiete1.goo.ne.jp/qa5511900.html こちらの方に改めてプログラムとエラーを載せたので お時間あれば見ていただきたいです。

すると、全ての回答が全文表示されます。
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.4

>そのエラーが出てしまうのですが。 「そのエラー」というのは「型intのリテラル4294971392は範囲外です」のことでしょうか。もしそうなら、No.3に示したとおりintの範囲で表せない数値にはLをつけてください。 あと、totalSizeはlong型で宣言していますよね。

santa1359
質問者

補足

http://oshiete1.goo.ne.jp/qa5511900.html ここに改めてプログラムなどを載せたのでお時間あったら見てください。 お返事ありがとうございました。

すると、全ての回答が全文表示されます。
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.3

4294971392という数字はJavaのint型(符号付き32ビット整数)の範囲に収まらないので、4294971392Lのように末尾にLをつけてlong型であることを示す必要があります。 しかしどのみち、Javaの配列の添字にはlong型は使えません。 そんな大きな配列を使うのではなく、No.2の方も書いているとおり“ファイルを少し読んでは送信する”を繰り返すのが普通です。

santa1359
質問者

補足

お返事ありがとうございます。No2の方も書いてある通り そのような手もあるとは思うのですが、 その際に、受信を終わる方法はどうするべきでしょうか。 同じ文章になってしまいますが。。。 ソケットを閉じて-1を返されたら終了とやれば簡単なのですが 今回はプログラムの一部としてファイル転送を行っており、 ソケットを閉じずに行いたいと思っています。 for(;;){ len = in.read(data); tatalSize = totalSize + len; out.write(data, 0, len); if(totalSize == 4294971392) break; } というように現在は行っており、そのエラーが出てしまうのですが。 よろしければアドバイスお願いします。

すると、全ての回答が全文表示されます。
  • junkUser
  • ベストアンサー率56% (218/384)
回答No.2

メモリにすべて展開する必要がありますか? もし無いのであれば、ファイルを読みながら送信してはどうかと思います。

santa1359
質問者

補足

お返事ありがとうございます。 そのような手もあるとは思うのですが、 その際に、受信を終わる方法はどうするべきでしょうか。 ソケットを閉じて-1を返されたら終了とやれば簡単なのですが 今回はプログラムの一部としてファイル転送を行っており、 ソケットを閉じずに行いたいと思っています。 for(;;){ len = in.read(data); tatalSize = totalSize + len; out.write(data, 0, len); if(totalSize == 4294971392) break; } というように現在は行っており、そのエラーが出てしまうのですが。 よろしければアドバイスお願いします。

すると、全ての回答が全文表示されます。
noname#115336
noname#115336
回答No.1

ByteArrayOutputStream を使えばいいと思います!

santa1359
質問者

補足

ありがとうございます。 ByteArrayOutputStreamというものを試してみます。 どのように仕様するものなのですかね。

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

関連するQ&A