ファイルをバイナリ形式で表示する (Java+Swing編)
ディレクトリツリーの表示は JTreeクラス側で行いますので、アプリケーションとしてはツリーの各ノードにディレクトリ名を登録していくことになります。
ツリーのルートノード(最上位のノード)には、コンピュータ名を登録します。
コンピュータ名のすぐ下のノードには、接続されているドライブ名(ドライブレター)を登録します。
各ドライブ名の下のノードが、それぞれのドライブのディレクトリ構造をツリーで登録します。
FileTreeView.java
/* ----------------------------------------------------------------------- */
/**
* コンピュータ名をディレクトリツリーのルートに登録する.
*
* @return 生成したルートディレクトリのノード.
*/
private DefaultMutableTreeNode createRootDirectory() {
//! コンピュータ名を取得する.
String name = "My Computer";
try {
name = java.net.InetAddress.getLocalHost().getHostName();
}catch( Exception e ){
}
//! 取得したコンピュータ名でノードを生成する.
TreeItem rootItem = new TreeItem( name );
DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode( rootItem );
//! ディレクトリツリーに生成したルートノードを登録する.
DefaultTreeModel model = new DefaultTreeModel( rootNode );
setModel( model );
return rootNode;
}
java.net.InetAddress.getLocalHost().getHostName()を呼び出してコンピュータ名を取得できたら、ツリーのルートノードとして登録します。
コンピュータ名が取得できない場合(多分ないのですが)、「My Computer」をルートノードとして登録します。
FileTreeView.java
/* ----------------------------------------------------------------------- */
/**
* ディレクトリツリーにドライブ名を登録する.
*
* @param root ディレクトリツリーのROOTノード.
*/
private void addDriveName( DefaultMutableTreeNode root ) {
//! 論理ドライブ名をすべて取得する.
File[] roots = File.listRoots();
for( File dir : roots ){
//! ドライブ文字列からバックスラッシュ('\')を取り除く.
String path = dir.getPath();
String name = path.substring( 0, path.length() - 1 );
//! ドライブ名をROOTノードに追加する.
DefaultMutableTreeNode node = addTreeNode( root, name );
//! サブディレクトリが存在するかどうかを調べる.
addDirectory( node, dir.getPath(), true );
}
}
File.listRoots()を呼び出してコンピュータに接続されている有効なドライブのファイル情報の配列を取得します。
for()ループで回しながらドライブのファイル情報からFile.getPath()を呼び出してドライブ名の文字列を取り出します。
取り出したドライブ名の最後にセパレータ文字「\」が付いているので、これを取り除いてツリーに登録します。
さらにドライブのルートディレクトリが存在する場合は、ドライブのノードに子ノードを追加してドライブのノードが展開できるようにします。
FileTreeView.java
/* ----------------------------------------------------------------------- */
/**
* ディレクトリツリーにディレクトリ名を登録する.
*
* @param parent ディレクトリ名を登録するノード.
* @param path 該当ノードに対応した絶対パスのディレクトリ名.
* @param isDummy true = サブディレクトリが存在するかどうかだけ調べる.
*/
private void addDirectory( DefaultMutableTreeNode parent, String path, boolean isDummy ) {
//! ディレクトリ直下のファイル一覧を取得する.
path += "\\";
File dir = new File( path );
File[] files = dir.listFiles();
if( files == null ){
return;
}
for( int i = 0; i < files.length; i++ ){
File file = files[i];
if( file.isDirectory() && !file.isHidden() && file.canRead() ){
//! サブディレクトリを追加する.
DefaultMutableTreeNode node = addTreeNode( parent, file.getName() );
//! サブディレクトリの存在チェックの場合は、1件検出した時点で処理を終了する.
if( isDummy ){
return;
}
//! サブディレクトリが存在するかどうかを調べる.
addDirectory( node, file.getPath(), true );
}
}
}
File.listFiles()を呼び出して、引数で指定されたディレクトリにあるファイル情報のリストを取得します。
取得したファイル情報から次の条件が全て一致するファイルをツリーに登録します。
- ディレクトリである。
- 隠しファイルではない。
- 読み込み可能である。
メソッドの呼び出しが「サブディレクトリの存在チェック」の場合(isDummyがtrue)は、サブディレクトリがあるか無いかを調べればよいので、1個のディレクトリをツリーに登録した時点で処理を終了してループを抜けます。
展開→表示の場合、登録したディレクトリのノードが展開可能かどうかを設定する必要があるので、そのディレクトリにサブディレクトリがあるかどうかを調べます。
ディレクトリツリーへのノードの追加は、以下のメソッドで行います。
FileTreeView.java
/* ----------------------------------------------------------------------- */
/**
* ディレクトリ名またはドライブ名をディレクトリツリーに追加する.
*
* @param parent ディレクトリを登録するノード.
* @param name ディレクトリ名.
*
* @return 生成したサブディレクトリのノード.
*/
private DefaultMutableTreeNode addTreeNode( DefaultMutableTreeNode parent, String name ) {
//! ディレクトリ名のノードを生成する.
TreeItem item = new TreeItem( name );
DefaultMutableTreeNode node = new DefaultMutableTreeNode( item );
//! 親ノードに作成したノードを追加する.
parent.add( node );
return node;
}
ディレクトリ名またはドライブ名をディレクトリツリーに追加します。
ディレクトリ名またはドライブ名を保持するツリービューのノードを新規に生成し、生成したノードを引数で指定された親ノードに追加します。
親ノードを再帰呼び出しで遡って、指定されたノードに対応したディレクトリの絶対パスを生成します。
FileTreeView.java
/* ----------------------------------------------------------------------- */
/**
* 指定されたノードに対応した絶対パスを取得する.
*
* @param path 絶対パスを取得するノードのツリーパス.
*
* @return 指定されたノードに対応した絶対パス.
*/
private String getAbsolutePath( TreePath path ) {
String filePath = "";
TreePath parent = path.getParentPath();
if( parent != null ){
//! 親ディレクトリの絶対パスを取得する.
filePath += getAbsolutePath( parent );
//! 親ディレクトリがある場合は連結する為にセパレータ("\")を付ける.
if( filePath.length() > 0 ){
filePath += "\\";
}
//! 親ディレクトリとファイル名を連結して絶対パス名にする.
DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
filePath += node.toString();
}else{
;
}
return filePath;
}