プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。Java初心者です
Javaプログラムを実行する同じディレクトリにあるテキストファイルとデータファイルをコマンドラインで同時に読み込み
それぞれ違う配列に格納したいのですが、1つのファイルの読み込みは出来ても2つ同時の読み込みと配列格納でつまづいています。

読み込むテキストファイルには以下のような1行の文が、
Dr. Fujita is great!

読み込むデータファイルには以下のような文字が書かれています。
AC 4C 7C 10C KC 3D 6D 9D QD JB 3C 6C 9C QC 2D 5D 8D JD JA 2C 5C 8C JC AD 4D 7D 10D KD

配列に格納する際、テキストファイルの場合は全て大文字にし、アルファベット以外の記号(スペース含)は全て消して配列に格納します。
上の例でいえばこのような状態で格納です↓
DRFUJITAISGREAT

データファイルの場合は、2組1文字をそのまま配列に格納です。ただしスペースは飛ばします。
上の例でいえば、ACを配列0に、4Cを配列1に、7Cを配列2に、、、と格納していきます。

import java.io.*;
public class sample{
public static void main(String[] args){
try{
FileReader f = new FileReader(args[0]);
BufferedReader b = new BufferedReader(f);
Strings;
while((s=b.readLine())!=null){
System.out.println(s); ←読み込んでるか確認
}
}catch(Exception e){
System.out.println(no file);
}
}
}

ファイルの指定は実行時に、java sample datafile.dat textfile.txt と指定します。
読み込むプログラムは以上のように書いたのですが、2つファイルを読み込むにはどのように記述したらよいのでしょうか。
FileReaderを2つ作成?しても最初に指定したデータファイルの内容がまた読み込まれるだけで・・・
読み込んだら変数sに入りますが、たとえばs.substring()なんかでわけて配列に入れようとしても、s.substring()←ここでエラーが出てしまいます。
あと、Dr. Fujita is great!のアルファベットを大文字にし、記号(スペース含)を飛ばして格納するにはどうしたらよいのでしょうか。

宜しくお願いします

A 回答 (2件)

まずコンパイルエラーの対処方法ですが


>System.out.println(no file);
ここはno fileという文字列を標準出力したいのでしょうか?
そうであれば、no fileを"no file"の様に""で囲んであげてください。

>String[] da = s.split("\\s+"); ←ここのsでエラー。変数sが見つけられないと出ます・・・
>s2 = s2.toUpperCase(); ←ここのs2でエラー。sと同じエラーです
>String[] ta = s2.split("[^A-Z]+"); ←ここのs2でエラー
変数sとs2がスコープ切れしています。
ローカル変数のスコープは宣言したブロックの内側で、宣言した行以降で有効です。
ですので、try{~}の中の処理に続けて記述してやれば良いと思います。

ですが、それでコンパイルが通っても、以下の記述に問題があるので、恐らく実行時例外がおきます。
>while((s=b.readLine())!=null){
>}
>while((s2=b2.readLine())!=null){
>}
このやり方ではwhileブロック終了後のsとs2は常にnullになります。
よって、後のsplitメソッドを呼ぶ段でNullPointerExceptionがスローされるはずです。
ファイルの内容を一行取得するだけであれば、whileを使う必要は無いです。
改行文字を含んでいる場合を考慮する必要があるならば、それならそれで、もう少し工夫が必要です。

以上です。
    • good
    • 0
この回答へのお礼

ご指摘の通り直したらできました!ありがとうございました!
実はもう一つ、ファイルの書き込みでつまづいています。
もしよろしければご教授ください。
本当にありがとうございました!

お礼日時:2010/01/30 21:30

>読み込むプログラムは以上のように書いたのですが、2つファイルを読み込むにはどのように記述したらよいのでしょうか。


>FileReaderを2つ作成?しても最初に指定したデータファイルの内容がまた読み込まれるだけで・・・
ソースの中で
FileReader f = new FileReader(args[0]);
としている箇所がありますが、
String[] argsの中にはコマンドライン引数として渡された文字列が空白文字区切りで区切られて格納されます。

>ファイルの指定は実行時に、java sample datafile.dat textfile.txt と指定します。
この場合ですと、
args[0] =>datafile.dat
args[1] =>textfile.txt
という風に格納されているという事ですね。
ファイルの読み込みに関してはその辺りを考慮して少し修正を加えれば問題無いと思います。

読み込んだ文字列を配列に格納する方法に関してですが、
簡単な実装方法としては文字列をStringクラスのsplitメソッドで分割してやるという方法があります。
<例>
//datafile.dat
String df = "AC 4C 7C 10C KC 3D 6D 9D QD JB 3C 6C 9C QC 2D 5D 8D JD JA 2C 5C 8C JC AD 4D 7D 10D KD";
//1文字以上連続する空白文字を区切り文字とみなして正規表現で分割して配列に格納
String[] da = df.split("\\s+");

//textfile.txt
String tf = "Dr. Fujita is great!";
//大文字に変換
tf = tf.toUpperCase();
//1文字以上連続するアルファベット以外の文字を区切り文字とみなして正規表現で分割して配列に格納
String[] ta = tf.split("[^a-zA-Z]+");

以上です。

この回答への補足

ありがとうございます。ファイルの読み込みとsplitメソッド非常に参考になりました!
しかしファイルを読み込んでも配列に格納のところでエラーが出てしまいます。

String s;
while((s=b.readLine())!=null)
この記述だと、sに"AC 4C 7C 10C KC 3D 6D 9D QD JB 3C 6C 9C QC 2D 5D 8D JD JA 2C 5C 8C JC AD 4D 7D 10D KD"が代入されたことになるのですよね?
つまりmiyajima24さんの例で言えばsがString df と同じですよね。

なので、splitでわけるために、String[] da = s.split("\\s+");と記述したのですが、
s.splitのsの部分でエラーがでます。sはStringで定義しているのでmiyajima24さんのString df と同じはずなのですが・・・

import java.io.*;
public class sample{
public static void main(String[] args){
try{
FileReader f = new FileReader(args[0]);
FileReader f2 = new FileReader(args[1]);
BufferedReader b = new BufferedReader(f);
BufferedReader b2 = new BufferedReader(f2);
String s, s2;
//data fileの読み込み
while((s=b.readLine())!=null){
}
//text fileの読み込み
while((s2=b2.readLine())!=null){
}
}catch(Exception e){
System.out.println(no file);
}
String[] da = s.split("\\s+"); ←ここのsでエラー。変数sが見つけられないと出ます・・・
s2 = s2.toUpperCase(); ←ここのs2でエラー。sと同じエラーです
String[] ta = s2.split("[^A-Z]+"); ←ここのs2でエラー
}
}


なぜこのsでエラーが出るのでしょうか?

補足日時:2010/01/29 15:06
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!