質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

3回答

674閲覧

MIDIファイルを指定のディレクトリに入れているのに「指定されたパスが見つかりません」と実行時エラーを返される

hangyo

総合スコア12

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2018/11/19 08:32

編集2018/11/19 09:51

Javaで「MIDIファイルを入力し、音の強弱を基にしてBPMを推定する」というプログラムを書いているのですが、Visual Studio Codeとeclipseでコンパイル・実行したところ、

発生している問題・エラーメッセージ

Exception in thread "main" java.io.FileNotFoundException: Input\Midi19.mid (指定されたパスが見つかりません。)

と返されました。

javaファイルとMIDIファイルはそれぞれ

MIDIファイル:\プログラム\Input
javaファイル:\プログラム\src\MIDI

に入っています。
以前の質問で回答された方々から、「クラスパスではなくてMIDIファイルが見つからないと言われている」との助言をいただきました。このプログラムは入力するMIDIファイルをInputディレクトリに入れておく必要があるのですが、Inputディレクトリに入れているはずなのにエラーが返ってきます。このエラーの原因を知りたいです。

コマンドプロンプトでコンパイル:「シンボルが見つかりません」
Visual Studio Code、eclipseでコンパイル:「Exception in thread "main" java.io.FileNotFoundException: Input\Midi19.mid (指定されたパスが見つかりません。)

dirコマンドを実行してみました。
!イメージ説明

MIDIファイルを入れたInputディレクトリをMIDIディレクトリに移動させましたが、コマンドプロンプトでコンパイルしても以下のエラーを返されます。

MIDIMain.java:15: エラー: シンボルを見つけられません Binary bi=new Binary(a); //error point ^ シンボル: クラス Binary 場所: クラス MIDIMain MIDIMain.java:15: エラー: シンボルを見つけられません Binary bi=new Binary(a); //error point ^ シンボル: クラス Binary 場所: クラス MIDIMain MIDIMain.java:16: エラー: シンボルを見つけられません Text te=new Text(a); //error point ^ シンボル: クラス Text 場所: クラス MIDIMain MIDIMain.java:16: エラー: シンボルを見つけられません Text te=new Text(a); //error point ^ シンボル: クラス Text 場所: クラス MIDIMain MIDIMain.java:17: エラー: シンボルを見つけられません MIDIPlay mp=new MIDIPlay(bi,te); //error point ^ シンボル: クラス MIDIPlay 場所: クラス MIDIMain MIDIMain.java:17: エラー: シンボルを見つけられません MIDIPlay mp=new MIDIPlay(bi,te); //error point ^ シンボル: クラス MIDIPlay 場所: クラス MIDIMain MIDIMain.java:30: エラー: シンボルを見つけられません ArrayList<Track> Tr=new ArrayList<Track>(); //error point ^ シンボル: クラス Track 場所: クラス MIDIMain MIDIMain.java:30: エラー: シンボルを見つけられません ArrayList<Track> Tr=new ArrayList<Track>(); //error point ^ シンボル: クラス Track 場所: クラス MIDIMain MIDIMain.java:35: エラー: シンボルを見つけられません Tr.add(new Track(I)); //error point ^ シンボル: クラス Track 場所: クラス MIDIMain MIDIMain.java:53: エラー: シンボルを見つけられません ArrayList<Note> Nt=Tr.get(0).getNote(); //error point ^ シンボル: クラス Note 場所: クラス MIDIMain MIDIMain.java:62: エラー: シンボルを見つけられません ArrayList<Delta> delta=new ArrayList<Delta>(); //error point ^ シンボル: クラス Delta 場所: クラス MIDIMain MIDIMain.java:62: エラー: シンボルを見つけられません ArrayList<Delta> delta=new ArrayList<Delta>(); //error point ^ シンボル: クラス Delta 場所: クラス MIDIMain MIDIMain.java:75: エラー: シンボルを見つけられません delta.add(new Delta(Nt.get(j).getDelta())); //error point ^ シンボル: クラス Delta 場所: クラス MIDIMain MIDIMain.java:82: エラー: シンボルを見つけられません Delta maxdelta=delta.get(0); //error point ^ シンボル: クラス Delta 場所: クラス MIDIMain エラー14個

該当のソースコード

java

1package MIDI; 2import java.io.*; 3import java.util.ArrayList; 4import java.util.StringTokenizer; 5 6 7public class MIDIMain{ 8 9 10 public static void main(String args[])throws IOException{ 11 12 //MIDI読み込み~タイミングデータ作成 13 String a="Midi19"; 14 double BPM=154; 15 Binary bi=new Binary(a); //error point 16 Text te=new Text(a); //error point 17 MIDIPlay mp=new MIDIPlay(bi,te); //error point 18 te.TextClose(); 19 bi=null; 20 te=null; 21 22 23 //タイミングデータ読み込み、Trackごとにデータを格納していく 24 File fp=new File("Output/"+a+".txt"); 25 FileReader fr=new FileReader(fp); 26 BufferedReader br=new BufferedReader(fr); 27 String line=""; 28 StringTokenizer token; 29 30 ArrayList<Track> Tr=new ArrayList<Track>(); //error point 31 int I=0; 32 while((line=br.readLine())!=null){ 33 if(line.equals("Track"+(I+1))){ 34 line=br.readLine(); 35 Tr.add(new Track(I)); //error point 36 if(!line.equals("")){ 37 I++; 38 continue; 39 } 40 while(!((line=br.readLine()).equals(""))){ 41 token=new StringTokenizer(line,","); 42 int Time=Integer.parseInt(token.nextToken()); 43 int Volume=0; 44 while(token.hasMoreTokens()){ 45 Volume+=Integer.parseInt(token.nextToken()); 46 } 47 Tr.get(I).addNote(Time,Volume); 48 } 49 I++; 50 } 51 } 52 53 ArrayList<Note> Nt=Tr.get(0).getNote(); //error point 54 for(int i=0;i<Tr.size();i++){ 55 Nt=Tr.get(i).getNote(); 56 if(Nt.size()!=1){ 57 break; 58 } 59 } 60 61 //音とその次の音の発音時刻の差を格納し,出現数カウント 62 ArrayList<Delta> delta=new ArrayList<Delta>(); //error point 63 for(int i=0;i<Tr.size();i++){ 64 Nt=Tr.get(i).getNote(); 65 for(int j=0;j<Nt.size();j++){ 66 int flag=0; 67 for(int k=0;k<delta.size();k++){ 68 if(delta.get(k).getDelta()==Nt.get(j).getDelta()){ 69 flag=1; 70 delta.get(k).PlusCount(); 71 break; 72 } 73 } 74 if(flag==0){ 75 delta.add(new Delta(Nt.get(j).getDelta())); //error point 76 } 77 } 78 } 79 System.out.println(); 80 81 //デルタTの出現回数最多を求める 82 Delta maxdelta=delta.get(0); //error point 83 for(int i=1;i<delta.size();i++){ 84 if(maxdelta.getCount()<delta.get(i).getCount()){ 85 maxdelta=delta.get(i); 86 } 87 } 88 89 //テンポ値第一候補算出 90 double MaxBPM=(60.0/(((double)maxdelta.getDelta())*60.0/BPM/(double)mp.getDeso())); 91 System.out.println("第一候補"+MaxBPM); 92 93 //拍の開始位置をずらしながら,BPMごとに1拍目が一番強い回数をカウント 94 for(int i=0;i<Tr.size();i++){ 95 Tr.get(i).setVolume(maxdelta.getDelta()); 96 ArrayList<Integer> Volume=Tr.get(i).getVolume(); 97 if(Volume!=null){ 98 int[][] Eva=new int[4][32]; 99 int[][] Eva2=new int[4][32]; 100 int[][] roop=new int[4][32]; 101 int[][] addVolume=new int[4][32]; 102 for(int k=0;k<4;k++){ 103 for(int l=0;l<Math.pow(2, k+2);l++){ 104 for(int j=l;j<Volume.size()-Math.pow(2, k+2)-l;j+=Math.pow(2, k+2)){ 105 roop[k][l]++; 106 int[] V=new int[]{Volume.get(j) 107 ,Volume.get((int)(j+Math.pow(2, k))) 108 ,Volume.get((int)(j+Math.pow(2, k)*2)) 109 ,Volume.get((int)(j+Math.pow(2, k)*3))}; 110 if(V[0]>0&&V[0]<=V[2]){ 111 Eva2[k][l]++; 112 } 113 114 115 if(V[0]>0&&V[0]>V[1]&&V[0]>V[2]&&V[0]>V[3]){ 116 Eva[k][l]++; 117 } 118 } 119 } 120 } 121 122 double[] max=new double[4]; 123 int[] maxl=new int[4]; 124 for(int l=0;l<4;l++){ 125 if(max[0]<=(double)Eva[0][l]/(double)roop[0][l]){ 126 max[0]=(double)Eva[0][l]/(double)roop[0][l]; 127 maxl[0]=l; 128 } 129 } 130 131 for(int k=1;k<4;k++){ 132 for(int l=maxl[0];l<Math.pow(2, k+2);l+=4){ 133 if(max[k]<=(double)Eva[k][l]/(double)roop[k][l]){ 134 max[k]=(double)Eva[k][l]/(double)roop[k][l]; 135 maxl[k]=l; 136 } 137 } 138 } 139 System.out.println(); 140 int kekka=0; 141 double Min=0; 142 for(int k=0;k<4;k++){ 143 if(60<=MaxBPM/Math.pow(2,k)&&MaxBPM/Math.pow(2,k)<=300){ 144 if((double)Eva2[k][maxl[k]]/(double)roop[k][maxl[k]]<=Min||Min==0){ 145 Min=(double)Eva2[k][maxl[k]]/(double)roop[k][maxl[k]]; 146 kekka=(int)(MaxBPM/Math.pow(2,k)+0.5); 147 } 148 } 149 } 150 151 System.out.println("結果"+kekka); 152 break; 153 } 154 } 155 } 156 157}

試したこと

全てのクラスをpublicにした。
javaファイルと同じディレクトリにMIDIファイルを入れてみたが、変わらなかった。

補足情報(FW/ツールのバージョンなど)

OS:Windows 10 64bit
eclipse IDE:2018-09

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

srcディレクトリに
・javaファイルを入れたMIDIフォルダ
・MIDIファイルを入れたInputフォルダ
を入れ、srcディレクトリでjavac MIDI/MIDIMain.javaコマンドを実行するとコンパイルに成功、うまく実行できました!

回答してくださったお二方、ありがとうございました!

投稿2018/11/20 04:27

hangyo

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

そういう相対パスのファイルアクセスでは、カレントディレクトリが基準になって、底からの相対パスになりますんで、まずはカレントディレクトリがどこにあるかを調べましょう

#「java カレントディレクトリ」でぐぐろう

投稿2018/11/19 08:49

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hangyo

2018/11/19 09:03

カレントディレクトリを取得するjavaファイルを作成してみたほうが良いですか?
y_waiwai

2018/11/19 09:07

カレントディレクトリをprintするのは1行でできるので、それをファイルアクセスするコードの直前にでも入れて、なんと表示されるのか見てみればいいかと
hangyo

2018/11/19 09:17

同じMIDIディレクトリ内で作成してみました。実行結果は先ほど載せた画像の一番下のパスと同様のものになります。
y_waiwai

2018/11/19 09:25

ならそこからの Input\Midi19.mid というのは、 ...プログラム¥src\MIDI\Input\Midi19.mid へのアクセスとなりますが、それであってますか?
hangyo

2018/11/19 09:28

はい、合ってます。
y_waiwai

2018/11/19 11:56 編集

> MIDIファイル:\プログラム\Input なんか質門に書いてあるのとは違うような。 まあ、あってると言うならこれで解決ですねw
guest

0

細かいパス構成がわからないですが、絶対パスにしてはどうでしょうか。

この先気になったこと
srcに入れてますが、そうするとパッケージが変わってくる気が・・・ srcのパスで実行しなくてはいけない気がします(違いましたら申し訳ありません。)
個人的な意見ですが、パスはコマンドプロンプトでdirコマンドを打って、その写真を貼るといいと思われます。

投稿2018/11/19 08:51

yukkuri

総合スコア624

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hangyo

2018/11/19 09:02

回答ありがとうございます。その時のパスも載せたほうがよろしいですか?
yukkuri

2018/11/19 09:04

その時のパス、が私には曖昧ですが、貼らなくていいかと。
hangyo

2018/11/19 09:14

画像を載せました。
yukkuri

2018/11/19 09:19

上の人が考えよう、という趣旨のことを言っていますが・・・・・・このパスがプログラム実行時のソースだと思いますので、ここにInputフォルダを置きましょう。
hangyo

2018/11/19 09:52

画像を更新しました。これでよろしいでしょうか?
yukkuri

2018/11/19 11:57

ん?Inputを作ってコンパイルしたらエラー->ありえません。どういうことでしょうか。コンパイルエラーは解決していない、ということでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問