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

このQ&Aのポイント
  • サーバ側からクライアント側へファイル転送をJavaで行おうとしています。
  • 1つめのファイルはきちんと転送できるのですが、2つめのファイルが転送完了後に確認すると0バイトとなっており、きちんと動作しません。
  • サーバ、クライアントで警告が出ており、「ローカル変数len1(recvMsgSize1)は読み取られません」と表示されます。
回答を見る
  • ベストアンサー

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

サーバ側からクライアント側へファイル転送を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
  • 回答数2
  • ありがとう数1

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

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

1.警告について data1 にすべてのデータが満たされるとは限らないので、以下のように変更します。他も同様です。 これでコンパイル時の警告は消えますよ。 ---- int len1; while((len1 = fin1.read(data1)) != -1){ out2.write(data1); } ---- ↓ ---- int len1; while(len1 = fin1.read(data1) != -1){ out2.write(data1,0,len1); } ---- 2.2番目が0バイトになる原因について クライアントの2番目のループが始まった瞬間に -1 でループが終了しています。 なので、ループを開始する前に available() のチェックを挟みます。 こんな感じで ---- // 1番目のファイル終了 // 2番目のファイルが送られてくるのを待つ while(in2.available() <= 0){ // Thread.Sleep(100) や、タイムアウトの処理を挟む } // 2番目のファイル開始 ----

santa1359
質問者

お礼

丁寧な解説ありがとうございました。 本当にいいアドバイスとなりました。 無事解決することができました。

santa1359
質問者

補足

お返事ありがとうございます。 アドバイスいただいた通り編集して以下のようになりました。 サーバ側 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 len1; while((len1 = fin1.read(data1)) != -1){ out2.write(data1, 0, len1); } 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); int len2 = 0; while((len2 = fin2.read(data2)) != -1){ out2.write(data2, 0, len2); } 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]; while((recvMsgSize1 = in2.read(byteBuffer1)) != -1){ fout1.write(byteBuffer1, 0, recvMsgSize1); } System.out.println(filename1 + "を受信完了しました"); fout1.close(); // ルートファイルシステム(uml-root-hardy)の転送 while(in2.available() <= 0){ Thread.sleep(100); } String filename2 = args[3]; System.out.println("受信するファイル : " + filename2); FileOutputStream fout2 = new FileOutputStream(filename2); int recvMsgSize2; byte[] byteBuffer2 = new byte[bufSize]; while((recvMsgSize2 = in2.read(byteBuffer2)) != -1){ fout2.write(byteBuffer2, 0, recvMsgSize2); } System.out.println(filename2 + "を受信完了しました"); fout2.close(); } 実行結果(サーバ側) putモードに入りました 送信ファイル : linux.uml linux.umlを送信完了しました 送信ファイルuml-root-hardy uml-root-hardyを送信完了しました 実行結果(クライアント側) putモードに入りました 受信するファイル : linux.uml linux.umlを受信完了しました このようになり、クライアント側がいつまでたっても2つめのファイルの 受信を始めてくれません。 また一つめのファイルに関しては受信はできているのですが、 従来のものよりもかなり大きな容量で保存されています。 どのように対処するべきでしょうか。 何度もすみません。

その他の回答 (1)

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

同僚は誰も助けないのか・・・ 例1 ---- 1つ目 サーバー送信 → クライアント受信 そして サーバー受取 ← クライアント受信完了通知(ファイルサイズなど) 2つ目 サーバー送信 → クライアント受信 そして サーバー受取 ← クライアント受信完了通知(ファイルサイズなど) ---- 例2 ---- 1つ目 サーバー受信 ← クライアント ファイルリクエスト 1つ目 サーバー送信 → クライアント受信 2つ目 サーバー受信 ← クライアント ファイルリクエスト 2つ目 サーバー送信 → クライアント受信 ---- 例2の方はHTTPなどで一般的に使用されている方式ですね。 クライアントが受信に失敗したら、再送要求も出せますし。

関連するQ&A

  • Javaでファイル転送プログラム

    Javaを用いてファイル転送プログラムを作成しています。 http://d.hatena.ne.jp/rintaromasuda/20060327/1143412352 を参考に作成したのですが、うまく転送できません。 プログラムは以下の通り。 ◎サーバ側 import java.net.*; import java.io.*; public class UMLFileServer { public static void main(String[] args) throws IOException{ if (args.length != 2) throw new IllegalArgumentException("An argument should be port and filename"); int servPort = Integer.parseInt(args[0]); String filename = args[1]; System.out.println("Output file name : " + args[1]); //Create FileOutputStream FileOutputStream fout = new FileOutputStream(filename); //Create ServerSocket ServerSocket servSock = new ServerSocket(servPort); int recvMsgSize; //int bufSize = servSock.getReceiveBufferSize(); int bufSize = 32; System.out.println("Size of ReceiveBuffer : " + bufSize); //Socket accepting loop while(true){ System.out.println("Wait for accepting... "); Socket clntSock = servSock.accept(); byte[] byteBuffer = new byte[bufSize]; System.out.println("Accepted client at " + clntSock.getInetAddress().getHostAddress() + " on port " + clntSock.getPort()); //Create InputStream InputStream in = clntSock.getInputStream(); //Read message and print it out int totalByte = 0; while((recvMsgSize = in.read(byteBuffer)) != -1){ System.out.println("Message : " + new String(byteBuffer,0,recvMsgSize)); System.out.println("Size : " + recvMsgSize); //Write to file totalByte = totalByte + recvMsgSize; fout.write(byteBuffer,0,recvMsgSize); } System.out.println("Recieved file size : " + totalByte); clntSock.close(); fout.close(); fout = null; } } } ◎クライアント側 import java.net.*; import java.io.*; public class UMLFileClient { public static void main(String[] args) throws IOException{ if (args.length != 3) throw new IllegalArgumentException("Arguments should be host,port and filepath"); String server = args[0]; int serverPort = Integer.parseInt(args[1]); String filename = args[2]; byte[] data = new byte[32]; //ソケットの作成 Socket socket = new Socket(server,serverPort); System.out.println("Connected to server"); //ストリームの作成 FileInputStream fin = new FileInputStream(filename); OutputStream out = socket.getOutputStream(); //ファイルの内容を読み出し、送信する System.out.println("Sending file : " + filename); int totalSize = 0; int len = 0; while ((len = fin.read(data)) != -1) { totalSize = totalSize + len; System.out.println(new String(data,0,len)); out.write(data, 0, len); } fin.close(); fin = null; System.out.println("size of file : " + totalSize); socket.close(); } } ◎実行結果 Output file name : hiroyasu.txt Size of ReceiveBuffer : 32 Wait for accepting... Accepted client at 192.168.71.104 on port 36608 Recieved file size : 0 Wait for accepting... 以上です。どなたか解決方法をご教授ください。

    • ベストアンサー
    • 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
  • ストリームの問題について【至急】

    import java.io.*; public class FileStreamDemo { public static void main(String[] args){ try{ byte[] buffer=new byte[1024]; FileInputStream fileInputStream= new FileInputStream(new File(args[0])); FileOutputStream fileOutputStream= new FileOutputStream(new File(args[1])); System.out.println("コピーファイル: "+fileInputStream.available()+"バイト"); while(true){ if(fileInputStream.available()<1024){ int remain=-1; while((remain=fileInputStream.read())!=-1){ fileOutputStream.write(remain); } break; } else{ fileInputStream.read(buffer); fileOutputStream.write(buffer); } } fileInputStream.close(); fileOutputStream.close(); System.out.println("コピー完了"); } catch(ArrayIndexOutOfBoundsException e){ System.out.println( "using:java FileStreamDemo src des"); e.printStackTrace(); } catch(IOException e){ e.printStackTrace(); } } } JAVAの入門者です。 JAVAの教科書に書いてあるように、上のプログラムを書きましたけど… コンパイルすると、エラーメッセージが出て来ます。 エラー中身は下記のとおりです。 【using:java FileStreamDemo src des java.lang.ArrayIndexOutOfBoundsException: 0 at FileStreamDemo.main(FileStreamDemo.java:8) 】 どうすればいいのか悩んでいます。 誰か、助けていただけないのでしょうか?どこか間違ってるか、教えてください。 よろしく、お願いします。

  • ファイルロック後の書き込みについて

    ファイルAをロックしファイルBを読み込み ファイルAに書き込むプログラムを作成しています。 単体起動では問題無く動くのですが 複数起動するとファイルの書き込みが行われなくなってしまいます。 ロックしたプログラム以外はロックエラーになり ロックについては正常に動いているように見えます。 なぜ書き込みが行われなくなってしまうかご教授いただけますか? import java.io.* ; import java.nio.*; import java.nio.channels.*; public class CopyFile { public static void main(String[] args) throws Exception { try{ FileInputStream fis = null; FileOutputStream output = null; FileChannel outChannel = null; FileLock outFileLock = null; byte buf[] = new byte[2048]; int len; int count = 0; if (args.length != 2) { System.out.println("使用法: java CopyFile ファイル名1 ファイル名2"); System.exit(0); } //if String source= args[0]; String target= args[1]; File sourceFile = new File(source); File targetFile = new File(target); fis = new FileInputStream(sourceFile); output = new FileOutputStream(targetFile); outChannel = output.getChannel(); outFileLock = outChannel.tryLock(); if (outFileLock == null) { System.out.println("rock error!!"); System.exit(0); } else { while ((len = fis.read(buf)) != -1) { output.write(buf, 0, len); count += len; } Thread.sleep(5000); output.flush(); output.close(); fis.close(); } }catch(Exception e){ System.out.println(e); } } } // Class CopyFile

    • ベストアンサー
    • Java
  • javaによるファイル送信のプログラム

    ユニキャスト通信のおけるプログラミングで、1のプログラムを2のプログラムを使ってファイル送信ができるようにしたいのですがうまくいきません。私のjavaの知識が授業についていかなくて図書館でいろいろと本を探したのですが見つかりませんでした。誰か教えていただけませんか? /*1*/ import java.net.*; import java.io.*; public class udpechoServer{ static final int echo_PORT = 7; //エコーポート番号 static final int BUFSIZE = 1024; //バッファサイズ public static void main(String[] args) throws IOException{ int port = echo_PORT; //ポート番号 int cliport; //クライアントポート番号 int len; //データ長 int i; //キーインバッファクリアインデックス DatagramSocket sock = null; //データグラムソケット宣言,初期化 byte[] buf = new byte[BUFSIZE]; byte[] wbuf = new byte[BUFSIZE]; String recvdata; //受信データ try{ sock = new DatagramSocket(port); DatagramPacket recvpacket = new DatagramPacket(buf,BUFSIZE); DatagramPacket sendpacket = new DatagramPacket(buf,BUFSIZE); System.out.println("Connected to echo server"); while(true){ sock.receive(recvpacket); //データ受信 recvdata = new String(recvpacket.getData(),0,recvpacket.getLength()); recvdata = recvdata.trim(); //トリミング(CRLF) wbuf = recvdata.getBytes(); //文字列→バイト配列変換 i = 0; len = wbuf.length; buf = new byte[BUFSIZE]; while(wbuf[i] != 0x0d){ //途中のCR検出 buf[i] = wbuf[i]; //データコピー i++; if(i >=len){ break; } } recvdata = new String(buf,0,i); //バイト配列→文字列変換 System.out.println(recvdata); //画面出力 InetAddress ipadr = recvpacket.getAddress(); cliport = recvpacket.getPort(); buf = recvdata.getBytes(); len = buf.length; sendpacket = new DatagramPacket(buf,len,ipadr,cliport); sock.send(sendpacket); //データ送信 recvpacket.setLength(BUFSIZE); //データグラムパケット長リセット } }catch(SocketException e){ e.printStackTrace(); } } } /*2 */ import java.io.*; class FileCopy { public static void main(String argv[]){ try{ InputStream in = new FileInputStream(argv[0]); //入力ファイルを開く //BufferedInputStreamオブジェクトの生成 BufferedInputStream bin = new BufferedInputStream(in); OutputStream out = new FileOutputStream(argv[1]); //出力ファイルを開く //BufferedOutputStreamオブジェクトの生成 BufferedOutputStream bout = new BufferedOutputStream(out); byte buf[] = new byte[1024]; int c; //読み込みデータがなくなるまで読み込み while((c = bin.read(buf, 0, buf.length)) != -1){ bout.write(buf, 0, c); //データの書き込み処理 } System.out.println("\""+argv[0]+"\" was converted into \""+argv[1]+"\""); bin.close(); //入力ファイルを閉じる bout.close(); //出力ファイルを閉じる }catch(Exception e){} } }

    • ベストアンサー
    • Java
  • java 緊急質問

    java プログラムの課題です このプログラムはファイルを読み込むと最初に十数行の空行が出来てしまいます またファイル内のメールアドレスのみを読み取りたいのですが@の入っていない文も読み取ってしまいます。 あと読み込んだメールアドレスの数だけカウントしたいのですがそこもうまくいっていません。 @を含む一文だけを読み取るようにしたいです。 import java.io.*; public class Email11 { public static void main(String[] argv) throws Exception { String input = "fileContainingEmails.txt"; String output = "copyPasteMyEmails.txt"; BufferedReader cin; cin = new BufferedReader(new InputStreamReader(System.in)); String userInput; System.out.println("Enter input file name [default name: fileContainingEmails.txt]"); userInput = cin.readLine(); if (userInput.equals("")) userInput = input; String name; if (userInput.equals(input)) name = output; else name = userInput; String userOutput; System.out.println("Enter output file name [default name: " + name + " ]"); userOutput = cin.readLine(); if (userOutput.equals("")) userOutput = name; System.out.println("Input FIle : " + userInput); System.out.println("Output FIle : " + userOutput); BufferedReader fin; fin = new BufferedReader(new FileReader(userInput)); String lineFromFile = ""; while (true) { if (!fin.ready()) break; fin.readLine(); lineFromFile = fin.readLine(); System.out.println(lineFromFile.substring(0, lineFromFile.indexOf('@')+1)); PrintWriter fout; fout = new PrintWriter(new FileWriter(userOutput, true)); fout.println(lineFromFile.substring(0, lineFromFile.indexOf('@')+1)); fout.close(); } fin.close(); int count = 0; for (int p = 0; p < lineFromFile.length(); p++) { if (lineFromFile.equals('@')); count++; } if (count == 0) System.out.println("Sorry, no email addresses were found in the file " + userInput); else System.out.println(count + "email addresses were found, and copied to " + userOutput); どのように書き直したらよいのでしょうか?

    • ベストアンサー
    • Java
  • 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で認証するためにログオンするようなクラスはありますか?そのクラスの使い方、ソース、参考になるようなホームページがありましたら、教えてください。 よろしくお願い致します。

  • 圧縮クライアントのプログラム

    java eclipeを使って通信のプログラムを勉強しています。 参考にしている本は、TCP/IPソケットプログラミングjava編です。 本に書かれてるソースコードのとおりに入力したら、 Exception in thread "main" java.io.FileNotFoundException: test.txt (No such file or directory) at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream.<init>(Unknown Source) at java.io.FileInputStream.<init>(Unknown Source) at socket_127.CompressClient.main(CompressClient.java:20) というエラーが出ました。 このエラーを調べると、 「指定されたパス名で示されるファイルが開けなかったことを通知します。」とかかれていました。このプログラムが入っているフォルダの中にtest.txtというテキストファイルを作成して同じフォルダに入れてあります。 このプログラムの引数は、 <Server> IPアドレス <Port>  110 <File> test.txt としました。 このエラーをとる方法を教えていただけないでしょうか? 下にソースコードを載せますので、解決方法をお願いします。 package socket_127; import java.net.*; // for Socket import java.io.*; // for IOException and [File]Input/OutputStream public class CompressClient { public static final int BUFSIZE = 256; // Size of read buffer public static void main(String[] args) throws IOException { if (args.length != 3) throw new IllegalArgumentException("Parameter(s): <Server> <Port> <File>"); String server = args[0]; int port = Integer.parseInt(args[1]); String filename = args[2]; FileInputStream fileIn = new FileInputStream(filename); FileOutputStream fileOut = new FileOutputStream(filename + ".gz"); Socket sock = new Socket(server, port); sendBytes(sock, fileIn); InputStream sockIn = sock.getInputStream(); int bytesRead; byte[] buffer = new byte[BUFSIZE]; while ((bytesRead = sockIn.read(buffer)) != -1) { fileOut.write(buffer, 0, bytesRead); System.out.print("R"); } System.out.println(); sock.close(); fileIn.close(); fileOut.close(); } private static void sendBytes(Socket sock, InputStream fileIn) throws IOException { OutputStream sockOut = sock.getOutputStream(); int bytesRead; byte[] buffer = new byte[BUFSIZE]; while ((bytesRead = fileIn.read(buffer)) != -1) { sockOut.write(buffer, 0, bytesRead); System.out.print("W"); } sock.shutdownOutput(); } }

  • ファイル名に変数を使う(Java)

    初心者です。よろしくお願いします。 Javaで、ファイル名に変数を使ってファイルを作成する方法を教えて下さい。 例えば1.txtから100.txtまで100個のファイル(全部中身は『1』)を作りたい場合でお願いします。 下のコードを100回のforループに入れればいいと思うのですが、 “○○○”の部分がわかりません。 よろしくお願いします。 try {   PrintWriter fout = new PrintWriter(new BufferedWriter(   new FileWriter("○○○.txt"))); fout.println(1); fout.close(); } catch (Exception e) { System.out.println("書き込みエラー:" + e); System.exit(1); }

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

    ファイルの読み込みをStringTokenizerを使ってやりたいのですが、 使い方がいまいち理解できません。今自分で作っているプログラムでは効率が悪いです。 プログラムの一部を載せるのでアドバイスお願いします。 <プログラム> InputStreamReader fisr = new InputStreamReader(client. getInputStream()); BufferedReader fin = new BufferedReader(fisr); String name = fin.readLine(); System.out.println(name); while(n!=10){ FileInputStream objFis = new FileInputStream("eitango"+rand[n]+".txt"); InputStreamReader objlsr = new InputStreamReader(objFis,"Shift_jis"); BufferedReader objBr = new BufferedReader(objlsr); PrintWriter out = new PrintWriter(client.getOutputStream(),true); //1行ずつファイルを読み込む if (n==0){ out.println("Hello,clientNo:" + number +"\n"); } for(a=0;a!=6;a++){ if(a==5){ String ans = objBr.readLine(); ans2 = ans.length(); System.out.println("ans2 = "+ans2); } if(a!=5){ out.println(objBr.readLine()); } }

    • ベストアンサー
    • Java

専門家に質問してみよう