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](https://stat.ameba.jp/user_images/20101123/19/espelion/a3/9e/p/t02200153_0501034810876962328.png?caw=800)
<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」
分からないところがあればコメントにお願いします。
ちょっと長いプログラムです。
コピーしたい方はこちらからどうぞ。
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](https://stat.ameba.jp/user_images/20101123/19/espelion/a3/9e/p/t02200153_0501034810876962328.png?caw=800)
<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」
分からないところがあればコメントにお願いします。