[英]java swing : display file system in jtree, and how to open the file
[英]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.