我写了一个小程序,主要是显示当前磁盘上的目录与文件
但是只要切换到NTFS格式分区,就会抛出很多异常
哪位高手来帮忙看一看吧源程序如下:
DirectoryTreeModel.java文件(定义TreeModel):
import java.lang.*;
import java.util.*;
import java.io.*;
import javax.swing.event.*;
import javax.swing.tree.*;public class DirectoryTreeModel implements TreeModel
{
  private DirectoryVariable root;
  private EventListenerList listenerList = new EventListenerList();  /**
   * Construct an empty tree
   */
  public DirectoryTreeModel()
  {
    root = null;
  }  /**
   * Set the root to a given DirectoryVariable
   */
  public void setRoot( DirectoryVariable dirVariable )
  {
    DirectoryVariable oldRoot = dirVariable;
    root = dirVariable;
    fireTreeStructureChanged( oldRoot );
  }  public Object getRoot()
  {
    return root;
  }  public int getChildCount( Object parent )
  {
    return (( DirectoryVariable )parent).getSubDirs().size();
  }  public Object getChild( Object parent, int index )
  {
    ArrayList subDirs = (( DirectoryVariable )parent).getSubDirs();
    File f = (File)subDirs.get( index );
    return new DirectoryVariable( f.getAbsolutePath() );
  }  public int getIndexOfChild( Object parent, Object child )
  {
    int n = getChildCount( parent );
    for( int i = 0; i < n; i++ )
    {
      if( getChild( parent, i ).equals( child ) )
      {
        return i;
      }
    }
    return -1;
  }  public boolean isLeaf( Object node )
  {
    DirectoryVariable dirNode = ( DirectoryVariable )node;
    File dir = new File( dirNode.toString() );
    return dir.isFile();
  }  public void valueForPathChanged( TreePath path, Object newValue )
  {
  }  public void addTreeModelListener( TreeModelListener l )
  {
    listenerList.add( TreeModelListener.class, l );
  }  public void removeTreeModelListener( TreeModelListener l )
  {
    listenerList.remove( TreeModelListener.class, l );
  }  protected void fireTreeStructureChanged( Object oldRoot )
  {
    TreeModelEvent event = new TreeModelEvent( this, new Object[] {oldRoot} );
    EventListener[] listeners = listenerList.getListeners( TreeModelListener.class );
    for( int i = 0; i < listeners.length; i++ )
    {
      ((TreeModelListener)listeners[i]).treeStructureChanged( event );
    }
  }
}class DirectoryVariable
{
  private String path;
  private ArrayList subDirs;  public DirectoryVariable( String aPath )
  {
    path = aPath;
    subDirs = new ArrayList();    /**
     * test whether the path is a Directory or a File
     * if a Directory, get all of its subDirectory and subFiles
     */
    File fileNode = new File( path );
    if( fileNode.isDirectory() )
    {
      File[] subFile = fileNode.listFiles();
      for( int i = 0; i < subFile.length; i++ )
      {
        subDirs.add( subFile[i] );
      }
    }
  }  public ArrayList getSubDirs()
  {
    return subDirs;
  }  public String toString()
  {
    return path;
  }
}DirectoryTreeFrame.java文件(定义初始框架窗口):
import java.lang.*;
import java.awt.*;
import java.io.*;
import java.awt.event.*;
import javax.swing.*;public class DirectoryTreeFrame extends JFrame
{
  private static final int DEFAULT_WIDTH = 400;
  private static final int DEFAULT_HEIGHT = 300;
  String defaultPath = "C:\\Documents and Settings\\1";
  JPanel jPanel1 = new JPanel();
  BorderLayout borderLayout1 = new BorderLayout();
  JComboBox jComboBox1 = new JComboBox();
  JLabel statusBar = new JLabel();
  JPanel jPanel2 = new JPanel();
  BorderLayout borderLayout2 = new BorderLayout();
  JScrollPane jScrollPane1 = new JScrollPane();
  JTree jTree1 = new JTree();  public DirectoryTreeFrame() {
    try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }
  private void jbInit() throws Exception {
    jPanel1.setLayout(borderLayout1);
    this.setSize( DEFAULT_WIDTH, DEFAULT_HEIGHT );
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    jPanel2.setLayout(borderLayout2);
    statusBar.setMaximumSize(new Dimension(32, 32767));
    statusBar.setMinimumSize(new Dimension(32, 16));
    statusBar.setOpaque(false);
    statusBar.setPreferredSize(new Dimension(32, 16));
    statusBar.setText("");
    jComboBox1.setEditable(true);
    jComboBox1.addActionListener(new DirectoryTreeFrame_jComboBox1_actionAdapter(this));
    jComboBox1.addItem( defaultPath );
    File[] roots = File.listRoots();
    for( int i = 0; i < roots.length; i++ )
    {
      jComboBox1.addItem( roots[i].toString() );
    }
    this.getContentPane().add(jPanel1, BorderLayout.CENTER);
    jPanel1.add(jComboBox1, BorderLayout.NORTH);
    jPanel1.add(statusBar, BorderLayout.SOUTH);
    jPanel1.add(jPanel2, BorderLayout.CENTER);
    jPanel2.add(jScrollPane1, BorderLayout.CENTER);
    jScrollPane1.getViewport().add(jTree1, null);
  }  void jComboBox1_actionPerformed(ActionEvent e) {
    String dirPath = (String)jComboBox1.getSelectedItem();
    File dirSelected = new File( dirPath );
    if( !dirSelected.exists() )
    {
      dirPath = defaultPath;
      JOptionPane.showMessageDialog( null, "The Directory NOT exist!" );
    }
    DirectoryVariable dirVariable = new DirectoryVariable( dirPath );
    DirectoryTreeModel model = new DirectoryTreeModel();
    model.setRoot( dirVariable );
    jTree1.setModel( model );
    jTree1.putClientProperty( "JTree.lineStyle", "Angled" );
  }}class DirectoryTreeFrame_jComboBox1_actionAdapter implements java.awt.event.ActionListener {
  DirectoryTreeFrame adaptee;  DirectoryTreeFrame_jComboBox1_actionAdapter(DirectoryTreeFrame adaptee) {
    this.adaptee = adaptee;
  }
  public void actionPerformed(ActionEvent e) {
    adaptee.jComboBox1_actionPerformed(e);
  }
}DirectoryTree.java文件(实现目录树):
import java.lang.*;
import java.awt.*;
import javax.swing.*;public class DirectoryTree
{
  boolean  packFrame = false;  /**
   * Construct the application
   */
  public DirectoryTree()
  {
    DirectoryTreeFrame frame = new DirectoryTreeFrame();    //Validate frames that have preset sizes
    //Pack frames that have useful preferred size info, e.g. from their layout
    if( packFrame )
    {
      frame.pack();
    }
    else
    {
        frame.validate();
    }    //Center the window
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    Dimension frameSize = frame.getSize();
    if( frameSize.width > screenSize.width )
    {
      frameSize.width = screenSize.width;
    }
    if( frameSize.height > screenSize.height )
    {
      frameSize.height = screenSize.height;
    }
    frame.setLocation( (screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2 );
    frame.setVisible( true );
  }  /**
   * Main method
   *
   * @param args String[]
   */
  public static void main( String args[] )
  {
    String windowsLookAndFeel = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
    try
    {
      UIManager.setLookAndFeel( windowsLookAndFeel );
    }
    catch( Exception e )
    {
      e.printStackTrace();
    }    new DirectoryTree();
  }
}

解决方案 »

  1.   

    楼主,是这样子——碰到“System Volume Information”这样的目录 subFile == null,这就导致了问题。下边是做了一下修正:  public DirectoryVariable( String aPath )
      {
        path = aPath;
        subDirs = new ArrayList();    /**
         * test whether the path is a Directory or a File
         * if a Directory, get all of its subDirectory and subFiles
         */
        File fileNode = new File( path );
        if( fileNode.isDirectory() )
        {
          File[] subFile = fileNode.listFiles();
          if (subFile == null)
              return;
          for( int i = 0; i < subFile.length; i++ )
          {
                  subDirs.add(subFile[i]);
          }
        }
      }当然,System Volume Information 中的东西就看不到了,这应该是合理的。
      

  2.   

    多谢doway(john) 
    正解!!!