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

このQ&Aのポイント
  • java eclipseを使って通信のプログラムを勉強しています。TCP/IPソケットプログラミングjava編のソースコードを参考にしています。
  • プログラムを実行すると「test.txt (No such file or directory)」というエラーが出る問題に遭遇しました。テキストファイルがプログラムのフォルダに存在しないようです。
  • プログラムの引数は、<Server> IPアドレス、<Port> 110、<File> test.txtです。エラーを解消する方法について教えていただけませんか?
回答を見る
  • ベストアンサー

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

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(); } }

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

  • ベストアンサー
  • f272
  • ベストアンサー率46% (7996/17095)
回答No.1

> Exception in thread "main" java.io.FileNotFoundException: test.txt (No such file or directory) このエラーに対処するには,ファイルが見つからないということですから > このプログラムが入っているフォルダの中にtest.txtというテキストファイルを作成して同じフォルダに入れてあります。 このファイルの置き場所を変えるだけです。普通はProjectのルートフォルダに入れるでしょう。

debukawa
質問者

お礼

f272さん、回答ありがとうございます。 Projectのルートフォルダにtest.txtを入れたら、 > Exception in thread "main" java.io.FileNotFoundException: test.txt (No such file or directory) を取り除くことができました。ありがとうございます。 次はこのようなエラーが生じました。 Exception in thread "main" java.net.ConnectException: Connection timed out: connect 該当行は、この部分です。 Socket sock = new Socket(server, port); このエラーは接続時にエラーが生じたという意味ですよね。 このクライアント側のプログラムは本に書かれていたものなので、 問題ないと思うのですが… もしかすると、私が作ったサーバ側に問題があるのでしょうか? そのプログラムを載せますので、アドバイスをいただきたいです。 package socket_129; import java.net.*; // Socketに必要 import java.io.*; // IOException,[File]Input/OutputStreamに必要 public class CompressServer { public static void main(String[] args) throws IOException { if (args.length != 1) // 引数の数が正しいか調べる。 throw new IllegalArgumentException("Parameter(s): <Port>"); int port = Integer.parseInt(args[0]); // サーバポート ServerSocket servSock = new ServerSocket(port); // クライアントの接続要求を受け付けるサーバソケットを生成する。 Logger logger = new ConsoleLogger(); // ログメッセージをコンソールに出力する。 Socket clntSock = servSock.accept(); // ブロックして接続を待つ。 ProtocolFactory protoFactory = new CompressProtocolFactory(); // CompressProtocolFactory()インスタンスを生成する。 protoFactory.createProtocol(clntSock, logger); // createProtocol()メソッドを実行する。 } }

その他の回答 (1)

  • f272
  • ベストアンサー率46% (7996/17095)
回答No.2

> Exception in thread "main" java.net.ConnectException: Connection timed out: connect 接続を確立しようとしたけど,できないまま時間がたったのであきらめた,ということ。 サーバ側の問題です。 このクライアントプログラムを実行させたときに,サーバが接続を待っている状態でないと当然サーバは何もしません。そうするとそのうちにクライアントはタイムアウトします。と言う事で クライアントプログラムを実行する前に,サーバプログラムを実行して待たせておく その状態でクライアントプログラムを実行する

debukawa
質問者

お礼

回答ありがとうございます。 サーバを実行してから、クライアントを実行しました。 すると、次のようにコンソール画面に表示されました。 WException in thread "main" java.net.SocketException: Connection reset at java.net.SocketInputStream.read(Unknown Source) at java.net.SocketInputStream.read(Unknown Source) at socket_127.CompressClient.main(CompressClient.java:34) 34行目はこの部分です。 while ((bytesRead = sockIn.read(buffer)) != -1) { 1つWが表示されたということは、送信するバイトが1つソケット出力ストリームに 書き込まれたことになるのですが、どうしてあとが続かないのでしょうか?

debukawa
質問者

補足

すいません。無事問題を解決できました。 アドバイスありがとうございました。

関連する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
  • ストリームの問題について【至急】

    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) 】 どうすればいいのか悩んでいます。 誰か、助けていただけないのでしょうか?どこか間違ってるか、教えてください。 よろしく、お願いします。

  • 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によるファイル送信のプログラム

    ユニキャスト通信のおけるプログラミングで、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
  • 大きな容量のファイルを転送する

    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
  • for文について【ID3タグ取得のプログラム】

    ID3タグ取得のプログラムなのですがちゃんと動いたのは良いんですが解らないプログラム部分がありました。 ググったり過去の質問探したりしたのですが解答が見つかりません。 お手数ではありますがご教授願います。 以下はプログラムです。 /*ID3タグ取得プログラム*/ import java.io.*; import java.nio.channels.*; import java.util.Arrays; class TagInfo{ final private String name; final private int pos; final private int len; public TagInfo(String name,int pos,int len){ this.name=name; this.pos=pos; this.len=len; } public String getName() { return name; } public int getPos() { return pos; } public int getLen() { return len; } } public class M_data { private static byte[] copyOfRange(byte b[],int pos, int len){ byte[] a=new byte[len]; System.arraycopy(b,pos,a,0,len); return a; // return java.util.Arrays.copyOfRange(b,pos,pos+len); } static void music() throws IOException{ File file = new File("C:/music/music4.mp3"); FileInputStream fis=new FileInputStream(file); String charsetName="Shift_JIS"; //if(1<args.length) charsetName=args[1]; FileChannel fc=fis.getChannel(); fc.position(fc.size()-128); byte[] b=new byte[128]; if(fis.read(b)==128 && b[0]=='T' && b[1]=='A' && b[2]=='G'){ TagInfo[] infos={new TagInfo("Song title:",3,30),new TagInfo("Artist:",33,30), new TagInfo("Album:",63,30),new TagInfo("Year:",93,4), new TagInfo("Comment:",97,30),new TagInfo("Genre:",127,1) }; int i=0; /*以下のfor文です*/ for(TagInfo info: infos){ System.out.print(i + info.getName()); System.out.println(new String(copyOfRange(b,info.getPos(),info.getLen()),charsetName)); i++; } } } public static void main(String[] args) throws IOException{ music(); } }

    • ベストアンサー
    • Java
  • javaの課題プログラムでどうしてもわかりません。

    以下(senderTest)のプログラムを適切に繰り返すように書き換えたいのですが、どうしてもうまくいきません。while文で自分なりに繰り返した結果は同じ文字を送り続けるというものになってしまいました。 本来は送信して、待機状態になりまた新たに文字を入力したら送信、また待機というようにしたいのですがどうしたらよいでしょうか? どうかよろしくおねがいします。 ******************************** senderTest import java.io.*; import java.net.*; public class senderTest { private InetAddress address; private int port = 13400; private DatagramSocket socket; public senderTest() throws Exception { this.address = InetAddress.getByName("192.168.0.16"); this.socket = new DatagramSocket(); } public void send(String s) throws Exception { byte buffer[]; buffer = s.getBytes("Shift_JIS"); DatagramPacket packet = new DatagramPacket(buffer, buffer.length, this.address, this.port); this.socket.send(packet); } public static void main(String[] args)throws IOException { senderTest sender1; System.out.println("↓送信する文字を入力してください↓"); String name = ("健児>"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String msg = name +br.readLine(); try { sender1 = new senderTest(); sender1.send(msg); System.out.println("『" + msg + "』を送信しました。"); } catch (Exception ex) { System.err.println("Error: " + ex.getMessage()); } } } ********************************

    • ベストアンサー
    • Java
  • ファイル転送が正常に動作しない

    サーバ側からクライアント側へファイル転送を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
  • プログラムからメソッドを呼び出したいのですが

    今、ArtName.javaのプログラムにM_data.javaのプログラム内のメッソドを呼び出したいのですがコンパイルするとエラーになってしまいます。どのように記述すればメッソドを呼び出すことができるかご教授お願いたします。 以下がプログラムになります。 /*ArtName.java*/ import java.io.*; import java.nio.channels.*; import java.util.Arrays; class ArtName{ public static void an(String[] arg){ int i,j,number,song; char artname[]=new char[song]; M_data.music(); number=1; for(i=0;i<song;i++){ for(j=0;j<song;j++){ if(TagInfo[i]!=TagInfo[j]){ number++; } } } } } /*M_data.java*/ import java.io.*; import java.nio.channels.*; import java.util.Arrays; class TagInfo{ final private String name; final private int pos; final private int len; public TagInfo(String name,int pos,int len){ this.name=name; this.pos=pos; this.len=len; } public String getName() { return name; } public int getPos() { return pos; } public int getLen() { return len; } } public class M_data { private static byte[] copyOfRange(byte b[],int pos, int len){ byte[] a=new byte[len]; System.arraycopy(b,pos,a,0,len); return a; // return java.util.Arrays.copyOfRange(b,pos,pos+len); } static void music() { File file = new File("C:/Users/NEC-PCuser/Downloads/ Answer .mp3"); FileInputStream fis=new FileInputStream(file); String charsetName="Shift_JIS"; //if(1<args.length) charsetName=args[1]; FileChannel fc=fis.getChannel(); fc.position(fc.size()-128); byte[] b=new byte[128]; if(fis.read(b)==128 && b[0]=='T' && b[1]=='A' && b[2]=='G'){ TagInfo[] infos={new TagInfo("Song title:",3,30),new TagInfo ("Artist:",33,30)}; int i=0; /*以下のfor文です*/ for(TagInfo info: infos){ System.out.print(i + info.getName()); System.out.println(new String(copyOfRange(b,info.getPos (),info.getLen()),charsetName)); i++; } } } public static void main(String[] args) throws IOException{ music(); } } ArtName.javaをコンパイルすると Artname.java:17シンボルが見つかりません。 シンボル:ArtNameのクラス        if(TagInfo[i]!=TagInfo[j]{ とエラーになります。どのように記述すればコンパイルできるかお教えてください。 よろしくお願いいたします。

  • プログラムからメソッドを呼び出したいのですが

    今、ArtName.javaのプログラムにM_data.javaのプログラム内のメッソドを呼び出したいのですがコンパイルするとエラーになってしまいます。どのように記述すればメッソドを呼び出すことができるかご教授お願いたします。 以下がプログラムになります。 /*ArtName.java*/ import java.io.*; import java.nio.channels.*; import java.util.Arrays; class ArtName{ public static void an(String[] arg){ int i,j,number,song; char artname[]=new char[song]; M_data.music(); number=1; for(i=0;i<song;i++){ for(j=0;j<song;j++){ if(TagInfo[i]!=TagInfo[j]){ number++; } } } } } /*M_data.java*/ import java.io.*; import java.nio.channels.*; import java.util.Arrays; class TagInfo{ final private String name; final private int pos; final private int len; public TagInfo(String name,int pos,int len){ this.name=name; this.pos=pos; this.len=len; } public String getName() { return name; } public int getPos() { return pos; } public int getLen() { return len; } } public class M_data { private static byte[] copyOfRange(byte b[],int pos, int len){ byte[] a=new byte[len]; System.arraycopy(b,pos,a,0,len); return a; // return java.util.Arrays.copyOfRange(b,pos,pos+len); } static void music() { File file = new File("C:/Users/NEC-PCuser/Downloads/ Answer .mp3"); FileInputStream fis=new FileInputStream(file); String charsetName="Shift_JIS"; //if(1<args.length) charsetName=args[1]; FileChannel fc=fis.getChannel(); fc.position(fc.size()-128); byte[] b=new byte[128]; if(fis.read(b)==128 && b[0]=='T' && b[1]=='A' && b[2]=='G'){ TagInfo[] infos={new TagInfo("Song title:",3,30),new TagInfo ("Artist:",33,30)}; int i=0; /*以下のfor文です*/ for(TagInfo info: infos){ System.out.print(i + info.getName()); System.out.println(new String(copyOfRange(b,info.getPos (),info.getLen()),charsetName)); i++; } } } public static void main(String[] args) throws IOException{ music(); } } ArtName.javaをコンパイルすると Artname.java:17シンボルが見つかりません。 シンボル:ArtNameのクラス        if(TagInfo[i]!=TagInfo[j]{ とエラーになります。どのように記述すればコンパイルできるかお教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • Java