Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

for文について

お世話になります。

お暇な時にでもご回答頂ければ幸いです。

import java.io.*;

class DirectoryMake{
    public static void main(String args[])throws IOException{
        
        BufferedReader br = null;
        String tmp = null;
        File directory = null;
        
        try{
            br = new BufferedReader(new InputStreamReader(new FileInputStream("DN.txt")));
            
            
            while((tmp=br.readLine())!=null){
                    directory = new File("C:\\jdk\\app\\source\\CreateFolder\\" + tmp);
                    directory.mkdir();
            }
            
        }catch(IOException e){e.printStackTrace();
        }finally{
            br.close();
        }
    }
}

上記プログラムは、DN(ディレクトリネーム).txtを読み込んで、読み込んだ文字列のフォルダを作成する単純なものです。

質問は、作成したフォルダネームの冒頭に連続した数字を付与したいのです。

while()文の中にfor文を入れてもmkdir()の箇所でうまくいかず、どうすれば良いか解らなくなりました。

よろしければ、ヒントをお願い致します。

19

回答

6114

閲覧

19件の回答

評価

0

申し訳ありません。

int i = 0;

while文内にi++;を記述する事で解決致しました。

評価

0

close()がfinallyに入ってるのはいいけど、close()でもIOExceptionが出る可能性はある。
それがmain()のthrowsになってるわけだけど、これはfinally内でcatchしてつぶした方がいい。
上位に通達しても意味がないから。


ここからは好みの話だけど、私だったら

for (int  i = 0; (br.readLine()) != null; i++)

のループだな−。

あと、Fileも(String, String)のコンストラクタ。

評価

0

$氏へ

アドバイス感謝致します。
開発等した経験がありませんので、大変勉強なります。
Fileをコンストラクタで定義する意味についても少しアドバイスを頂けるとうれしいです。

評価

0

import java.io.*;

class DirectoryMake{

    public DirectoryMake(File file){
        file.mkdir();
    }
    
    public static void main(String args[]){
        BufferedReader br = null;
        String tmp = null;
        File directory = null;
        
        try{
            br = new BufferedReader(new InputStreamReader(new FileInputStream("DN.txt")));
            
            for(int i=1;(tmp=br.readLine())!=null;i++){
                    new DirectoryMake(new File("C:\\jdk\\app\\PROJECT\\FileServer\\CreateFolder\\" + String.format("%03d",i) + "_" +tmp));
            }
            
        }catch(IOException e){e.printStackTrace();
        }finally{
            try{
                if(br!=null){
                    br.close();
                }
            }catch(IOException e){e.printStackTrace();}
        }
    }
}

上記のように修正致しました。
Fileをコンストラクタで定義する箇所がいまいち理解できないように思うのですが、どうでしょうか?

評価

0

>public DirectoryMake(File file){
思いっきり勘違いしてるようだ…。

>Fileも(String, String)のコンストラクタ。
これは自分のクラスじゃなくて、Fileクラスの話だよ。



>if(br!=null){
このifではExceptionは発生しないんで、close()だけtry〜catch。

評価

0

Fileも(String,String)のコンストラクタ
なんだか、呪文のように感じてきました。

もう少しだけ教えてください。
自分のクラスというのは、DirectoryMakeクラスの事ですよね?
↑じゃなくて、Fileクラスの話というのは、
別にFileMakeクラスを作成するということでしょうか?

お願いします。

評価

0

「Aのコンストラクタ」を、「Aを引数にとるコンストラクタ」と解釈する神経が理解できない。

評価

0

いや、神経じゃなくて感性か。

評価

0

そもそも、ひとつのクラスが、
複数のコンストラクタを持つことができる、
ということは、理解しているのかな?

評価

0

Javaでは様々なクラス(機能みたいなもんと思ってください)が用意されていて、こういうものを俗にライブラリと言います。
例えば、1番目の行の
import java.io.*;
は「java.io」パッケージ内の全てのクラスを使いますという意味になります。ちなみに「File」や「BufferedReader」は「java.io」に存在するクラスです。
ライブラリの仕様が下のURLで見ることができます。↓
http://java.sun.com/javase/ja/6/docs/ja/api/index.html

下記のURLに↓
http://java.sun.com/javase/ja/6/docs/ja/api/java/io/File.html
「コンストラクタの概要」とありますが、File(String,String)というのは
File(String parent, String child) 
親パス名文字列および子パス名文字列から新しい File のインスタンスを生成します。
という部分の話になりますね。
まずはライブラリの仕様を見てから、わからないことがあれば質問する。というふうにするとお互いに良いやりとりができると思いますよ^^

評価

0

(String,String)のコンストラクタっていうのは、
文字列で二つの引数を持つコンストラクタってことですよね。

不良社員さん
それを理解していると謎がとけるのでしょうか。

なぜ、そうしなければらないか、教えて頂ければもう少し理解が深まると思うのですが。

評価

0

おいおい。

>ここからは好みの話だけど、

評価

0

$さんの言いたかったことを代弁させて頂くと
directory = new File("C:\\jdk\\app\\source\\CreateFolder\\" + tmp);
directory.mkdir();

directory = new File("C:\\jdk\\app\\source\\CreateFolder\\",tmp);
とすれば、わざわざ「mkdir()」しなくても済みますねということですね。

理由は 2010-11-16 20:54 の回答にもある通り
http://java.sun.com/javase/ja/6/docs/ja/api/java/io/File.html
の「コンストラクタの概要」をご覧になれば、分かると思います。

評価

0

コードとしてはそのとおり。ただ、

>わざわざ「mkdir()」しなくても済みますねということですね。
なぜ…? mkdirs()ならまだしも。

私は単に処理のニュアンスでこちらを使いたいだけ。
そういう意味で「好み」と書いたんだけど。


質問主へ。
なんらかの値を核として隠し、それに対しての操作を規定するのがクラスであり、実際に操作するのが個々のインスタンス。
公開された単一の操作(ここではmkdir())しかしないならインスタンス化する意味はないので、全部mainで書いていいよ
実際には新しいディレクトリに対してもっといろいろ操作があるというなら話は違うけど、それならもう少し設計を練るべきかな。


単に一覧を読み込んでディレクトリを掘るだけなら、本来はshellscriptレベルだけどね。

評価

0

混乱しております。

たぁくん氏へ
1.mkdir()をしなくても、フォルダを作成できるのでしょうか?

実際に、mkdir()を記述せずに、directory = new File("C:\\jdk\\app\\source\\CreateFolder\\",tmp);
で実行してみましたが、作成されておりません。

Fileのコンストラクタの概要にもインスタンスの生成とあるだけで、フォルダの生成とは書いていないのですが。

$氏は、String + Stringと記述するのではなく、
親パスと子パスで記述する方法が趣味だよって事ですね。

>単に一覧を読み込んでディレクトリを掘るだけなら、本来はshellscriptレベルだけどね。
Javaしか勉強した事がないので、アドバイス感謝です。
shellscriptも勉強しないとダメですね。

評価

0

コンストラクタを変えても、ディレクトリやファイルは作成されないですよ。
パラメータが変わっても動作は同じです。

>わざわざ「mkdir()」しなくても済みますねということですね。
になったのか、わからないです。

親パス・子パスに分ける方が私も好きです。

評価

0

皆様ご回答ありがとうございました。

とりあえず、一覧を読み込んでディレクトリを作成する方法が理解できました。多謝。

あとは階層構造を作成しなければならないのですが、
自分なりに考えて解らない場合はまたご質問させて頂きます。
その際はご回答して頂ければ幸いです。

ありがとう御座いました。

評価

0

>わざわざ「mkdir()」しなくても済みますねということですね。

自分何を言うてるんだ(汗
とんだ勘違いです。もうしわけありません。。。

評価

0

作成できないのは当たり前の話で、勝手に作成すると「そのファイル/ディレクトリが存在すれば…」といった判別ができない。

仮にコンストラクタによって使い分けるとしても、その文字列がファイル名を意図したものか、サブディレクトリ名を意図したものかを、Fileクラスは知る由もない。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。