chapter3_4 ディレクトリとファイルの情報を表示 | Javaをはじめよう

chapter3_4 ディレクトリとファイルの情報を表示

今回はjava.awt.Listコンポーネントにディレクトリの内容を表示するサンプルプログラムです。

ちょっと長いプログラムです。

コピーしたい方はこちらからどうぞ。

FileLister.java

001: import java.awt.Button;
002: import java.awt.FlowLayout;
003: import java.awt.Font;
004: import java.awt.Frame;
005: import java.awt.List;
006: import java.awt.Panel;
007: import java.awt.TextField;
008: import java.awt.event.ActionEvent;
009: import java.awt.event.ActionListener;
010: import java.awt.event.ItemEvent;
011: import java.awt.event.ItemListener;
012: import java.awt.event.WindowAdapter;
013: import java.awt.event.WindowEvent;
014: import java.io.File;
015: import java.io.FilenameFilter;
016: import java.io.IOException;
017: import java.text.DateFormat;
018: import java.util.Date;
019: 
020: /**
021:  * このクラスは、作成したウィンドウに、指定されたディレクトリにあるファイルとサブディレク
022:  * トリのリストを表示します。リストのエントリをクリックすると、それに関する詳しい情報を
023:  * 表示します。エントリをダブルクリックすると、ファイルの場合には内容を表示し、ディレクト
024:  * リの場合には一覧表示を行います。オプション指定されたFilenameFilterは一覧表示のフィルタ
025:  * 処理を行います。
026:  */
027: public class FileLister extends Frame implements ActionListener, ItemListener{
028:     private List list; //ディレクトリ内容の表示に使うリスト。
029:     private TextField details; //詳細情報の表示に使います。
030:     private Panel buttons; //ボタンを保持します。
031:     private Button up, close; //UpボタンとCloseボタン。
032:     private File currentDir; //現在一覧表示されているディレクトリ。
033:     private FilenameFilter filter; //ディレクトリ用のフィルタ。
034:     private String[] files; //ディレクトリの内容。
035:     private DateFormat dateFormatter = //日付と時刻の正確な表示に使います。
036:         DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
037:     
038:     /**
039:      * コンストラクタ: GUIを作成し、初期ディレクトリの内容を一覧表示します。
040:      */
041:     public FileLister(String directory, FilenameFilter filter){
042:         super("File Lister"); //ウィンドウを作成します。
043:         this.filter = filter; //フィルタがあれば、保存します。
044:         
045:         //ユーザがウィンドウを閉じたら、ウィンドウを消します
046:         addWindowListener(new WindowAdapter(){
047:             public void windowClosing(WindowEvent e){ dispose(); }
048:         });
049:         
050:         list = new List(12, false); //リストを設定します。
051:         list.setFont(new Font("MonoSpaced", Font.PLAIN, 14));
052:         list.addActionListener(this);
053:         list.addItemListener(this);
054:         
055:         details = new TextField(); //詳細エリアを設定します。
056:         details.setFont(new Font("MonoSpaced", Font.PLAIN, 12));
057:         details.setEditable(false);
058:         
059:         buttons = new Panel(); //ボタン用パネルを設定します。
060:         buttons.setLayout(new FlowLayout(FlowLayout.RIGHT, 15, 5));
061:         buttons.setFont(new Font("SansSerif", Font.BOLD, 14));
062:         
063:         up = new Button("Up a Directory"); //ボタンを設定します。
064:         close = new Button("Close");
065:         up.addActionListener(this);
066:         close.addActionListener(this);
067:         
068:         buttons.add(up); //ボタン用パネルにボタンを追加します。
069:         buttons.add(close);
070:         
071:         this.add(list, "Center"); //ウィンドウに部品を追加します。
072:         this.add(details, "North");
073:         this.add(buttons, "South");
074:         this.setSize(500, 350);
075:         
076:         listDirectory(directory); //初期ディレクトリをリスト表示します。
077:     }
078:     
079:     /**
080:      * このメソッドはlist()メソッドを使って取得したディレクトリのエントリを
081:      * Listコンポーネントに表示します。
082:      */
083:     public void listDirectory(String directory){
084:         //文字列をFileオブジェクトに変換し、ディレクトリが存在するか検査します。
085:         File dir = new File(directory);
086:         if(!dir.isDirectory())
087:             throw new IllegalArgumentException("FileLister: no such directory");
088:         
089:         //(フィルタ処理された)ディレクトリのエントリを取得します。
090:         files = dir.list(filter);
091:         
092:         //ファイル名のリストをソートします。
093:         java.util.Arrays.sort(files);
094:         
095:         //リストから古いエントリを削除し、新しいエントリを追加します。
096:         list.removeAll();
097:         list.add("[Up to Parent Directory]"); //特別なエントリ。
098:         for(int i = 0; i < files.length; i++) list.add(files[i]);
099:         
100:         //ウィンドウのタイトルバーと詳細ボックスにディレクトリ名を表示します。
101:         this.setTitle(directory);
102:         details.setText(directory);
103:         
104:         //このディレクトリを保持しておきます。
105:         currentDir = dir;
106:     }
107:     
108:     /**
109:      * このアイテムリスナメソッドは、Fileの様々なメソッドを使って、ファイルや
110:      * ディレクトリに関する情報を取得し、表示します。
111:      */
112:     public void itemStateChanged(ItemEvent e){
113:         //Up To Parentを除くために1マイナスします。
114:         int i = list.getSelectedIndex() - 1; 
115:         
116:         if(i < 0) return;
117:         String filename = files[i]; //選択された項目を取得します。
118:         File f = new File(currentDir, filename); //Fileに変換します。
119:         if(!f.exists())
120:             throw new IllegalArgumentException("FileLister: " +
121:                                                 "no such file or directory");
122:         //ファイルやディレクトリの詳細を取得し、文字列に連結します。
123:         String info = filename;
124:         if(f.isDirectory()) info += File.separator;
125:         info += " " + f.length() + " bytes ";
126:         info += dateFormatter.format(new Date(f.lastModified()));
127:         if(f.canRead()) info += " Read";
128:         if(f.canWrite()) info += " Write";
129:         
130:         //詳細文字列を表示します。
131:         details.setText(info);
132:     }
133:     
134:     /**
135:      * エントリがダブルクリックされる、あるいはボタンがクリックされると、このアクション
136:      * リスナが呼び出されます。ファイルがダブルクリックされた場合、FileViewerを作成して、
137:      * そのファイルを表示します。ディレクトリがダブルクリックされた場合、listDirectory()
138:      * を呼んで、ディレクトリを表示します。
139:      */
140:     public void actionPerformed(ActionEvent e){
141:         if(e.getSource() == close) this.dispose();
142:         else if(e.getSource() == up){ up(); }
143:         else if(e.getSource() == list){ //項目がダブルクリックされた場合、
144:             int i = list.getSelectedIndex(); //その項目を検査し、
145:             if(i == 0) up(); //第1項目であれば親ディレクトリを表示します。
146:             else{ //そうでなければ、ファイル名を取得します。
147:                 String name = files[i - 1];
148:                 File f = new File(currentDir, name); //Fileに変換します。
149:                 String fullname = f.getAbsolutePath();
150:                 //ディレクトリ内容をリスト表示します。
151:                 if(f.isDirectory()) listDirectory(fullname);
152:                 else new FileViewer(fullname).setVisible(true); //ファイルを表示します。
153:             }
154:         }
155:     }
156:     
157:     //親ディレクトリの内容を表示するためのメソッド
158:     protected void up(){
159:         String parent = currentDir.getParent();
160:         if(parent == null) return;
161:         listDirectory(parent);
162:     }
163:     
164:     //main()が利用するメソッド
165:     public static void usage(){
166:         System.out.println("Usage: java FileLister [directory_name] " +
167:                            "[-e file_extension]");
168:         System.exit(0);
169:     }
170:     
171:     /**
172:      * FileListerをスタンドアロンで実行するためのmain()メソッドです。コマンドライン引数
173:      * を解析し、FileListerオブジェクトを作成します。拡張子が指定された場合、それに対応
174:      * するFilenameFilterを作成します。ディレクトリが指定されていない場合、カレントディ
175:      * レクトリを使います。
176:      */
177:     public static void main(String[] args) throws IOException{
178:         FileLister f;
179:         FilenameFilter filter = null; //フィルタを指定することもできます。
180:         //ディレクトリが指定されていない場合、カレントディレクトリを使います。
181:         String directory = null;
182:         
183:         //引数配列を順に解析します。
184:         for(int i = 0; i < args.length; i++){
185:             if(args[i].equals("-e")){
186:                 if(++i >= args.length) usage();
187:                 //無名クラスで使えるようにfinalにします。
188:                 final String suffix = args[i];
189:                 
190:                 //このクラスは簡単なFilenameFilterです。指定されたファイルを一覧表示
191:                 //するかどうかを判断するためにaccept()メソッドを定義します。ファイル名
192:                 //指定された拡張子を持つ場合、あるいはディレクトリである場合には、
193:                 //一覧を表示します。
194:                 filter = new FilenameFilter(){
195:                     public boolean accept(File dir, String name){
196:                         if(name.endsWith(suffix)) return true;
197:                         else return (new File(dir, name)).isDirectory();
198:                     }
199:                 };
200:             }
201:             else{
202:                 //ディレクトリがすでに指定してある場合、エラーになります。
203:                 if(directory != null) usage();
204:                 else directory = args[i];
205:             }
206:         }
207:         
208:         //ディレクトリの指定がない場合、カレントディレクトリを使います。
209:         if(directory == null) directory = System.getProperty("user.dir");
210:         //指定されたディレクトリとフィルタを使ってFileListerオブジェクトを作成します。
211:         f = new FileLister(directory, filter);
212:         //ウィンドウを閉じたとき、アプリケーションが終了するように設定します。
213:         f.addWindowListener(new WindowAdapter(){
214:             public void windowClosed(WindowEvent e){ System.exit(0); }
215:         });
216:         //最後に、ウィンドウを表示します。
217:         f.setVisible(true);
218:     }
219: }


実行結果は次のようになります。

Javaをはじめよう-ss013

<APIList>
「java.awt.Button」
「java.awt.FlowLayout」
「java.awt.Font」
「java.awt.Frame」
「java.awt.List」
「java.awt.Panel」
「java.awt.TextField」
「java.awt.event.ActionEvent」
「java.awt.event.ActionListener」
「java.awt.event.ItemEvent」
「java.awt.event.ItemListener」
「java.awt.event.WindowAdapter」
「java.awt.event.WindowEvent」
「java.io.File」
「java.io.FilenameFilter」
「java.io.IOException」
「java.text.DateFormat」
「java.util.Date」

分からないところがあればコメントにお願いします。