繁体   English   中英

如何在Java Swing中列出文件系统

[英]How make file system listing in Java Swing

我需要索引整个文件系统,然后转换为xml。 因此,我创建了代码,但是会产生内存不足错误(堆)。 所以我的问题是如何避免这个错误。 是由于创建File1对象还是矢量太匹配而已将虚拟内存设置了一些东西,但它再次在973产生了错误。

`

import java.util.Vector;
import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
public class Filewalk {
Vector<File1> vs= new Vector<File1>();
public void walk( String path ) {
File root = new File( path );
File[] list = root.listFiles();
if (list == null) return;
for ( File f : list ) {
if ( f.isDirectory() ) {
walk( f.getAbsolutePath() );
}
else {
File1 fv=new File1(f.getAbsoluteFile().toString(),f.length()); --we could change for the next string--
//mainRootElement.appendChild(getFile (doc, num++, f.getName(), f.length(), f.getAbsoluteFile());//
}
}
}
public static void main(String[] args) throws Exception {
Filewalk fw = new Filewalk();
File [] disks = File.listRoots();
for ( File d : disks )
fw.walk(d.toString());
//ByteArrayInputStream baos = new ByteArrayInputStream();
//ObjectInputStream oos = new ObjectInputStream(baos);
//oos.writeObject(fw.vs);
//oos.close();
}
}
class File1 {
File1 (String path1, long size1)
{ this.path=path1; this.size=size1;}
String path;
long size;} 

`

Exception in thread "main" `java.lang.OutOfMemoryError: Java heap space
at java.io.WinNTFileSystem.list(Native Method)
at java.io.File.list(File.java:973)
at java.io.File.listFiles(File.java:1051)
at listing.Filewalk.walk(Filewalk.java:8)
at listing.Filewalk.walk(Filewalk.java:12)
at listing.Filewalk.walk(Filewalk.java:12)
at listing.Filewalk.walk(Filewalk.java:12)
at listing.Filewalk.walk(Filewalk.java:12)

在listing.Filewalk.main(Filewalk.java:24)

我尝试创建一个大向量,将其传递到秋千Jtable中,以显示文件的至少一部分(自动编号,名称,大小,路径)。 无论如何,在uindexing期间,我需要分配此唯一编号并将其保存为某些内容。 也许我需要使用通过添加记录直接写入JDBC表来解决内存问题? 无论如何,如果我想将这些属性转换为xml标记,我还需要保存这个大的xml文件,以便在名称中搜索这些文件。 如何解决这个问题? 所有File1的向量的概念正确吗? 整个索引占用多少空间?

我们可以提出这样的建议吗? 我刚刚添加了上述代码的插入记录。 这是由于通过将每个文件属性添加到创建的数据库来避免内存崩溃。 但是我不知道我们可以在SQL STATEMENT中使用变量。 特别是通过使用f.method()这样的代码创建的。 可能会避免复杂性,我们可以从第二个代码中学习到nethods -一个用于创建数据库和表,第二个用于插入记录,这样我们就可以只包含方法。 因此,我不知道jow会适当地为该JDBC代码段设计try和catch规则。

`import java.sql.*;
  import java.io.File;
 public class Filewalk {
 int i=0;
 static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";   
 static final String DB_URL = "jdbc:mysql://localhost/STUDENTS"; 
  static final String USER = "root"; 
 static final String PASS = "";

 Connection conn = null; 
 Statement stmt = null;
  //STEP 2: Register JDBC driver 
  Class.forName("com.mysql.jdbc.Driver"); 

  //STEP 3: Open a connection 
  System.out.println("Connecting to a selected database..."); 
  conn = DriverManager.getConnection(DB_URL, USER, PASS); 
  System.out.println("Connected database successfully..."); 

  //STEP 4: Execute a query 
  System.out.println("Creating table in given database..."); 
  stmt = conn.createStatement(); 

  String sq = "CREATE DATABASE FILESS"; 
  stmt.executeUpdate(sq); 

  String sql1 = "CREATE TABLE SYSTEM1 " + 
               "(id INTEGER not NULL, " + 
               " name VARCHAR(255), " +  
               " path VARCHAR(255), " +  
               " size INTEGER, " +  
               " PRIMARY KEY ( id ))";  
  stmt.executeUpdate(sql1); 


  public void walk( String path ) {
  File root = new File( path );
  File[] list = root.listFiles();
 if (list == null) return;
 for ( File f : list ) {
 if ( f.isDirectory() ) {
  walk( f.getAbsolutePath() );
 }
 else {
 String sql2 = "INSERT INTO SYSTEM1" + 
 "VALUES (i++,f.getName(), f.getAbsoluteFile().toString(),f.length())"; 
 stmt.executeUpdate(sql2);
}
}

try{ 
     if(stmt!=null) 
        conn.close(); 
  }catch(SQLException se){ 
  }// do nothing 
  try{ 
     if(conn!=null) 
        conn.close(); 
  }catch(SQLException se){ 
     se.printStackTrace(); 
  }//end finally try
     }//end try 
 System.out.println("Goodbye!"); 
}//end main 


}
public static void main(String[] args) {
Filewalk fw = new Filewalk();
File [] disks = File.listRoots();
for ( File d : disks )
fw.walk(d.toString());
}
}
`

人们告诉我错误的原因是什么?

简单。 您的应用程序正在尝试使用比JVM更多的堆内存。 那是因为它试图创建一个巨大的内存Vector其中包含有关文件系统中所有文件的信息。

该应用程序在停止运行之前可以处理多少个文件,

这取决于堆的大小。 这又取决于Java堆大小参数。 阅读java命令的手册条目,注意-xmx-xms参数。

但是,这不能解决问题。 无论堆大小如何,如果文件系统足够大,应用程序都将崩溃。 您将所有数据加载到大Vector将不起作用。 期。

相反,您应该实现自己的自定义TableModel类,该类通过根据需要查询树遍历结果的数据库来进行懒加载...并且在使用该信息后不要将其保留在内存中。

但这甚至不是一个好主意(IMO)。 将用户文件系统显示为具有成千上万个条目的可滚动2D表向用户显示是一种可怕的UI设计。 更好的主意是将JTree与合适的延迟加载“模型”类一起使用,以避免构建庞大的内存数据结构。

更好的是,使用现有的文件树小部件(例如JFileChooser ,并且不要重新发明轮子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM