2012-05-12 12 views
0

私はJavaでソケットを介してファイルを転送しようとしています。実際には転送できました。しかし、問題が発生しました。私は300メガバイトのファイルを転送例えば、クライアントが..私は問題があるかもしれないと思いまして....Javaのソケットを介してファイルを転送

サーバー側

File myFile = new File (basePath+"\\"+input.readUTF()); 
byte [] mybytearray = new byte [1024]; 
FileInputStream fis = new FileInputStream(myFile); 
BufferedInputStream bis = new BufferedInputStream(fis); 
txtArea.append("Sending... \n"); 
while (true) 
{ 
    int i = bis.read(mybytearray, 0, mybytearray.length); 
      if (i == -1) { 
     break; 
    } 
    output.write(mybytearray, 0, i); 
    txtArea.append("Sending chunk " + i + "\n"); 

} 
output.flush(); 

クライアント側

output.writeUTF("get"); 
txtArea.append("Starting to recive file... \n"); 
       long start = System.currentTimeMillis(); 
       byte [] mybytearray = new byte [1024]; 
       txtArea.append("Connecting... \n"); 
       output.writeUTF(remoteSelection); 
       FileOutputStream fos = new FileOutputStream(basePath+"\\"+remoteSelection); 
       BufferedOutputStream bos = new BufferedOutputStream(fos); 
       int bytesRead = input.read(mybytearray, 0, mybytearray.length); 
       while(bytesRead != -1) 
       { 
        bos.write(mybytearray, 0, bytesRead); 
        txtArea.append("got chunk" + bytesRead +"\n"); 
        bytesRead = input.read(mybytearray, 0, mybytearray.length); 
       } 
bos.flush(); 
+5

書き込みの前に-1をチェックする必要があります。あなたはまた、Javadocで特に警告されている方法でavailable()を誤用しています。あなたはファイルサイズがintに収まると仮定しています。その他など – EJP

+0

EJPが指摘していることに加えて、BufferedInputStreamでも使用可能かどうかチェックしています。基本的な入力ストリームのバッファ長だけを返します。 – dragon66

+0

どうすればファイルのサイズを確認できますか?私はバイト[]を使用しようとするmybytearray =新しいバイト[(int)myFile.length()];前に..しかし、それはエラーを返します。私は大きなファイル.. 600メガバイトを送信しようとするとヒープの外です。 –

答えて

2

のみ299メガバイトを受け取ることになります次のようにJavaでストリームをコピーする標準的な方法は、次のとおりです。

int count; 
byte[] buffer = new byte[8192]; // or whatever you like really, not too small 
while ((count = in.read(buffer)) > 0) 
{ 
    out.write(buffer, 0, count); 
} 

任意の長さの入力のための作品。入力全体をメモリにロードしません。そうすることによってレイテンシを追加することはありません。

複数のファイルを送信する場合は、最初にDataOutputStream.writeLong()を使用して長さを送信する必要があります。それを逆関数を介して他端で読む。その終わりのループ条件を調整して、正確にその多くのバイトを読み取った後に終了します。表示されるほど単純ではありません。読者のための練習として残しました。

+0

ファイルの長さを確認するにはどうすればよいですか? –

+0

@BobyHartanto Err、 'File.length()? ' – EJP

+0

助けてくれてありがとう –

関連する問題