• ベストアンサー

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

サーバ側からクライアント側へ ファイルを転送したいと考えています。 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

  • ファイル転送が正常に動作しない

    サーバ側からクライアント側へファイル転送をJavaで行おうとしています。 そこで以下のようなプログラムを作成し、実行するのですが 実行自体はうまくいき、1つめのファイルはきちんと転送できるのですが、 2つめのファイルが転送完了後に確認すると0バイトとなっており、 きちんと動作しません。どうするべきでしょうか。 サーバ側 ※上でソケットはつないであります。 if(command.equals("put.") == true){ System.out.println("putモードに入りました"); // カーネル(linux.uml)の送信 String filename1 = args[1]; byte[] data1 = new byte[1024]; //ストリームの作成 FileInputStream fin1= new FileInputStream(filename1); BufferedOutputStream out2 = new BufferedOutputStream(sock.getOutputStream()); System.out.println("送信ファイル : " + filename1); //int totalSize1 = 0; int len1; while((len1 = fin1.read(data1)) != -1){ out2.write(data1); } out.flush(); fin1.close(); System.out.println(filename1 + "を送信完了しました"); // ルートファイルシステム(uml-root-hardy)の送信 String filename2 = args[2]; byte[] data2 = new byte[1024]; //ストリームの作成 FileInputStream fin2 = new FileInputStream(filename2); //ファイルの内容を読み出し、送信する System.out.println("送信ファイル" + filename2); //long totalSize2 = 0; long len2 = 0; while((len2 = fin2.read(data2)) != -1){ out2.write(data2); } out.flush(); fin2.close(); System.out.println(filename2 + "を送信完了しました"); } クライアント側 ※上でソケットはつないであります。 if(change.equals("put.") == true){ System.out.println("putモードに入りました"); // 2つのファイルを転送する // カーネル(linux.uml)の転送 String filename1 = args[2]; System.out.println("受信するファイル : " + filename1); // FileOutputStreamの作成 FileOutputStream fout1 = new FileOutputStream(filename1); BufferedInputStream in2 = new BufferedInputStream(sock.getInputStream()); int recvMsgSize1; int bufSize = 1024; byte[] byteBuffer1 = new byte[bufSize]; //int totalByte1 = 0; while((recvMsgSize1 = in2.read(byteBuffer1)) != -1){ fout1.write(byteBuffer1); } System.out.println(filename1 + "を受信完了しました"); fout1.close(); // ルートファイルシステム(uml-root-hardy)の転送 String filename2 = args[3]; System.out.println("受信するファイル : " + filename2); FileOutputStream fout2 = new FileOutputStream(filename2); long recvMsgSize2; //byte[] byteBuffer = new byte[bufSize]; byte[] byteBuffer2 = new byte[bufSize]; //long totalByte2 = 0; while((recvMsgSize2 = in2.read(byteBuffer2)) != -1){ fout2.write(byteBuffer2); } System.out.println(filename2 + "を受信完了しました"); fout2.close(); } またプログラム中では、サーバ、クライアントでそれぞれ len1,len2(サーバ側)、recvMsgSize1,recvMsgSize2(クライアント側) に警告で「ローカル変数len1(recvMsgSize1)は読み取られません」 と出ています。 どのように解決するべきでしょうか。

    • ベストアンサー
    • Java
  • Javaで端末を操作

    サーバ側がらクライアント側へファイルを転送し、 UserModeLinuxを起動するというプログラムを作成しています。 ファイルを転送するまでは完了したのですが UserModeLinxuを起動するためには クライアント側の端末で 「linux.uml ubd0=uml-root-hardy umid=uml1」 と入力する必要があります。 これをどのように行えばよいかまったくわかりません。 これを使ったらどうか。こんなプログラムがあるなど 何でもいいので実現するためにアドバイスいただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Java
  • MicroC コンパイラ 変数宣言

    MicroC コンパイラ 変数宣言について質問です BYTE tmp1; WORD tmp2; なる定義があったとして 変数型範囲はどの範囲になるのでしょう 下記の定義は見つかったのですが 上記は分かりません 変数型 バイト数 範囲 (unsigned) char 1 0 .. 255 signed char 1 - 128 .. 127 (signed) short (int) 1 - 128 .. 127 unsigned short (int) 1 0 .. 255 (signed) int 2 -32768 .. 32767 unsigned (int) 2 0 .. 65535 (signed) long (int) 4 -2147483648 .. 2147483647 unsigned long (int) 4 0 .. 4294967295 float 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038 double 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038 long double 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038

  • 長さ3のバイト配列

    長さ3のバイト配列 0~16777215の範囲の数値がありまして byte[ ] byteArrayA =BitConverter.GetBytes(0x00); byte[ ] byteArrayB =BitConverter.GetBytes(0xffffff); で、 00-00-00 FF-FF-FF と、長さ3固定のバイト配列を返して欲しい場合はどうすればいいのでしょう? そのまんまだとINT16かINT32かで配列の個数が違ってきますよね。 INT32型でだと4個の配列になっちゃいますが、3個でいいんです。 どうしましょう?

  • UserModeLinuxを転送されたファイルで起動

    UserModeLinuxという仮想化技術について学んでいます。 UserModeLinuxを起動するためには、 カーネルとルートファイルシステムが必要だと考えていました。 そこで、自分のパソコンでは https://help.ubuntu.com/community/UserModeLinux を参考にUMLを起動できるようになりました。 次にJavaでファイル転送プログラムを作成し、 ファイル転送にも成功しました。 そこで受信した側のPCの端末から起動しようとしたのですが、 「user-mode-linuxをインストールしてください。」 というエラーが出てしまいます。 カーネルとルートファイルシステム以外に必要なものがあるのでしょうか。

    • ベストアンサー
    • Java
  • 配列変数の宣言「その2」

    「その2」 「その1」でも述べましたが、配列変数の宣言の仕方は2種類あると思います。 (1)・・・ int hairetu[]; (2)・・・ int [] hairetu; この宣言をした後、init()メソッドを使いこの2つの配列変数の範囲(?)を指定したいと思います。 (1)の指定方法・・・ hairetu = new int[10]; (2)の指定方法・・・ hairetu[] = new int[10]; (2)を指定するときは(1)の指定方法が使えませんでした。これはなぜでしょうか? 逆に、(1)を指定するときには(1)は配列変数であるにもかかわらず、[] なしでも指定ができるのでしょうか? 知っていれば教えてください。

    • ベストアンサー
    • Java
  • Javaの配列の宣言方法のメリット?

    1週間ほど前からJavaを独学している者です。 C言語をその前からやっていて、初心者レベル程度ならわかると思います。 そこで、質問です。 C言語の配列宣言:   int array[10]; Javaの配列宣言:   int array[] = new int[10]; 二つの言語とも、要素10個のarray1次元配列変数を宣言していると思います。 C言語の書き方はシンプルなので、納得がいきますが、Javaの方はどうしてこの形で宣言をするのかわかりません。(自分が言語製作者ならシンプルな書き方を採用します) だから、このような宣言の方法をとるということは何か理由があるのだと思います。 自分が思うところ、JavaはC言語より、柔軟で多機能だとおもうので、その影響で汎用性をますために、 長くなっているのかな~?と思っています。 こんごJavaの学習を進めていくと、例えば、   int array[] = new double[10]; //←エラーになりました みたいに型のちがう、宣言が出てきたりするのでしょうか? ちらっと、学習に使っている本をみたところ、動的配列の作成は別の操作で実現しているようなので、 「動的とは関係ないのかな?」と思っています。 長くなりましたが、Javaの配列宣言のメリットを教えてください。

    • ベストアンサー
    • Java
  • 大きな容量のファイルを転送する

    UserModeLinuxを起動する際のルートファイルシステム(4294971392バイト) をサーバ側からクライアント側に転送したいと考えています。 以下のプログラムを実行した結果、エラーが出てしまいます。 容量が大きなファイルのため、出てきてしまうエラーだと思うのですが。 またおかしなことに、エラーが出るのでプログラムを停止して クライアント側のディレクトリを確認すると ルートファイルシステムが存在し、UserModeLinuxを起動することもできました。しかしコンソールにはエラーが表示されるので困っています。 このような場合にどのように対処するべきでしょうか。 サーバ側 import java.net.*; import java.io.*; public class FileTransferServerroot { public static void main(String[] args) throws IOException{ if (args.length != 2) throw new IllegalArgumentException("Arguments should be host,port and filepath"); int serverPort = Integer.parseInt(args[0]); String filename = args[1]; byte[] data = new byte[32]; //ソケットの作成 ServerSocket socket = new ServerSocket(serverPort); Socket sock = socket.accept(); System.out.println("Connected to server"); //ストリームの作成 FileInputStream fin = new FileInputStream(filename); OutputStream out = sock.getOutputStream(); //ファイルの内容を読み出し、送信する System.out.println("Sending file : " + filename); int totalSize = 0; int len = 0; for(;;){ len = fin.read(data); totalSize += len; out.write(data, 0, len); if(totalSize == 4294971392L) break; } fin.close(); fin = null; System.out.println("linux.umlを送信完了しました"); socket.close(); } } クライアント側 import java.net.*; import java.io.*; public class FileTransferClientroot { public static void main(String[] args) throws IOException{ if (args.length != 3) throw new IllegalArgumentException("An argument should be port and filename"); String host = args[0]; int servPort = Integer.parseInt(args[1]); String filename = args[2]; System.out.println("Output file name : " + filename); //Create FileOutputStream FileOutputStream fout = new FileOutputStream(filename); //Create ServerSocket Socket servSock = new Socket(host, servPort); int recvMsgSize; int bufSize = 32; System.out.println("Size of ReceiveBuffer : " + bufSize); byte[] byteBuffer = new byte[bufSize]; //Create InputStream InputStream in = servSock.getInputStream(); //Read message and print it out int totalByte = 0; //while((recvMsgSize = in.read(byteBuffer)) != -1){ for(;;){ recvMsgSize = in.read(byteBuffer); totalByte += recvMsgSize; fout.write(byteBuffer,0,recvMsgSize); if(totalByte == 4294971392L) break; } System.out.println("linux.umlを受信完了しました"); servSock.close(); fout.close(); fout = null; } } 実行結果(サーバ側) Connected to server Sending file : uml-root-hardy Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException at java.net.SocketOutputStream.socketWrite(Unknown Source) at java.net.SocketOutputStream.write(Unknown Source) at FileTransferServerroot.main(FileTransferServerroot.java:25) 実行結果(クライアント側) Output file name : uml-root-hardy Size of ReceiveBuffer : 32 Exception in thread "main" java.lang.IndexOutOfBoundsException at java.io.FileOutputStream.writeBytes(Native Method) at java.io.FileOutputStream.write(Unknown Source) at FileTransferClientroot.main(FileTransferClientroot.java:28)

    • ベストアンサー
    • Java
  • javaプログラム初心者です。

    入力ファイルの内容をWebサーバプログラムへ送信し、サーバからの応答を別ファイルに出力するクライアントプログラムを作っているのですが、出力ファイルにはなにも書き込みがされていません。(サーバからの応答は事前に不明でその長さが可変長である) 以下が作ったプログラムです。間違っているところを詳しくご指摘いただけるとありがたいです。お願いします。 import java.net.*; import java.io.*; public class client{ static final int BUFSIZE = 1792; public static void main(String[] args){ try{ String server = args[0]; //接続先のIPアドレス File file1 = new File(args[1]); //入力ファイル(HTTPリクエスト) FileReader filereader = new FileReader(file1); BufferedReader br = new BufferedReader(filereader); int serverport = Integer.parseInt(args[2]); //ポート番号 File file2 = new File(args[3]); //サーバからの応答をファイルに書き込む用 FileWriter filewriter = new FileWriter(file2); BufferedWriter bw = new BufferedWriter(filewriter); byte[] bytebuffer = new byte[BUFSIZE]; String str; while((str = br.readLine()) != null){ //入力ファイルの内容を1行ずつ読み込む bytebuffer = str.getBytes(); //入力ファイルの文字列をバイトに変換 } Socket socket = new Socket(server,serverport); //ソケットの生成 System.out.println("Connected to server...sending echo string"); InputStream in = socket.getInputStream(); //入出力ストリームの取得 OutputStream out = socket.getOutputStream(); out.write(bytebuffer); //文字列を送信 int receive; while((receive = in.read(bytebuffer))!=-1){ bw.write(new String(bytebuffer)); //サーバからの応答をファイルに出力 } bw.close(); socket.close(); }catch(IOException e){ } } }

  • JAVAで別端末へファイル転送

    JAVAで端末から端末にファイルを自動的に転送するプログラムを作成しています。転送手段はUNC(\\path)形式で以下のソースのように転送しています。 -------------------------------------------------- ※READ_FILE → 送信側ファイルパス  WRITE_FILE → 受信側ファイルパス //ファイルを読み込む FileInputStream readFile = new FileInputStream(READ_FILE); //読み込んだファイルを書き込む File writeFile = new File(WRITE_FILE); writeFile.createNewFile(); FileOutputStream fo = new FileOutputStream(writeFile); int count = 0; byte[] buf = new byte[16384]; while ((count=readFile.read(buf)) != -1) { fo.write(buf, 0, count); } readFile.close(); fo.close(); -------------------------------------------------- ここで問題になってしまったのが、認証です。エクスプローラでその端末の認証をすませてしまえば、問題なくこのソースは通るのですが、認証せずに実行すると FileInputStream readFile = new FileInputStream(READ_FILE); のところで落ち FileNotFoundException:(ログオン失敗: ユーザー名を認識できないか、またはパスワードが間違っています。) となってしまいます。 JAVAで認証するためにログオンするようなクラスはありますか?そのクラスの使い方、ソース、参考になるようなホームページがありましたら、教えてください。 よろしくお願い致します。