CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 基础类

有关java中目录分区的问题

楼主iambirdiambird()2005-09-23 00:03:07 在 Java / J2SE / 基础类 提问

我写了一个小程序,主要是显示当前磁盘上的目录与文件  
  但是只要切换到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();  
      }  
  } 问题点数:20、回复次数:2Top

1 楼doway(john)回复于 2005-09-23 00:49:44 得分 20

楼主,是这样子——碰到“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   中的东西就看不到了,这应该是合理的。  
  Top

2 楼iambirdiambird()回复于 2005-09-24 22:25:10 得分 0

多谢doway(john)    
  正解!!!Top

相关问题

  • 有关分区的问题
  • 有关分区视图的问题
  • 怎样获取硬盘分区的目录及文件信息
  • 如何得到当前目录所挂载的磁盘分区?
  • 求助,如何增加fc4的根目录分区容量??
  • 有关文件目录名
  • 有关树型目录!
  • fedora 3 中mount fat32的分区,有中文的目录无法ls?
  • 求助:有关adsi访问活动目录的问题(我是写java的,vb不会啊)
  • 请大家帮助,有关Linux硬盘分区的问题

关键词

  • swing
  • root
  • null
  • directoryvariable
  • screensize
  • framesize
  • subfile
  • directorytreemodel
  • dirvariable
  • windowslookandfeel

得分解答快速导航

  • 帖主:iambirdiambird
  • doway

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo