在java中访问文件时出错
我正在编写一个程序,检查重复的文件并将结果显示在表格中。我已经设置了一个表格模型,还设置了一个按钮,该按钮将触发程序检查重复文件并将其显示在表格上。但在表格模型上显示时会出现错误。这是我的密码:在java中访问文件时出错,java,arrays,file,Java,Arrays,File,我正在编写一个程序,检查重复的文件并将结果显示在表格中。我已经设置了一个表格模型,还设置了一个按钮,该按钮将触发程序检查重复文件并将其显示在表格上。但在表格模型上显示时会出现错误。这是我的密码: //This is the code that checks for duplicate files and displays it on the table model public void findDuplicateFiles(File[] files) throws IOException
//This is the code that checks for duplicate files and displays it on the table model
public void findDuplicateFiles(File[] files) throws IOException {
Map<String, List<File>> filesByHash = new HashMap<>();
for (File file : files) {
if (!file.isFile()) {
continue;
}
String hash = MD5.asHex(MD5.getHash(file));
List<File> filesForHash = filesByHash.get(hash);
if (filesForHash == null) {
filesByHash.put(hash, filesForHash = new ArrayList<>());
}
filesForHash.add(file);
}
for (Map.Entry<String, List<File>> entry : filesByHash.entrySet()) {
List<File> filesForHash = entry.getValue();
if (filesForHash.size() > 1) {
String hash = entry.getKey();
System.out.printf("%,d files have hash %s:%n",
filesForHash.size(), hash);
int index = filesForHash.size() - 1;
filesForHash.remove(index);
for (File file : filesForHash) {
System.out.println(" " + file);
fileTableModel.setFiles(file.listFiles());
}
}
//System.out.println(" No Duplicate Found ");
}
}
//This is the code that triggers a button and calls the above method for duplicate
checkDup = new JButton("Find Duplicate");
checkDup.setMnemonic('t');
checkDup.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
try {
findDuplicateFiles(currentFile.listFiles());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
toolBar.add(checkDup);
//Here is the Table Model code.
class FileTableModel extends AbstractTableModel {
public File[] files;
public FileSystemView fileSystemView = FileSystemView.getFileSystemView();
public String[] columns = {
"Icon",
"File",
"Path/name",
"Size",
"Last Modified",
};
FileTableModel() {
this(new File[0]);
}
FileTableModel(File[] files) {
this.files = files;
}
public Object getValueAt(int row, int column) {
File file = files[row];
switch (column) {
case 0:
return fileSystemView.getSystemIcon(file);
case 1:
return fileSystemView.getSystemDisplayName(file);
case 2:
return file.getPath();
case 3:
return file.length();
case 4:
return file.lastModified();
default:
System.err.println("Fatal Error");
}
return "";
}
public int getColumnCount() {
return columns.length;
}
public Class<?> getColumnClass(int column) {
switch (column) {
case 0:
return ImageIcon.class;
case 3:
return Long.class;
case 4:
return Date.class;
}
return String.class;
}
public String getColumnName(int column) {
return columns[column];
}
public int getRowCount() {
return files.length;
}
public File getFile(int row) {
return files[row];
}
public void setFiles(File[] file) {
this.files = file;
fireTableDataChanged();
}
//这是检查重复文件并将其显示在表模型上的代码
public void findDuplicateFiles(文件[]文件)引发IOException{
Map filesByHash=new HashMap();
用于(文件:文件){
如果(!file.isFile()){
继续;
}
String hash=MD5.asHex(MD5.getHash(file));
List filesForHash=filesByHash.get(hash);
if(filesForHash==null){
put(hash,filesForHash=newarraylist());
}
filesForHash.add(文件);
}
for(Map.Entry:filesByHash.entrySet()){
List filesForHash=entry.getValue();
if(filesForHash.size()>1){
String hash=entry.getKey();
System.out.printf(“%,d个文件具有哈希%s:%n”,
filesForHash.size(),hash);
int index=filesForHash.size()-1;
filesForHash.remove(索引);
for(文件:filesForHash){
System.out.println(“+文件);
fileTableModel.setFiles(file.listFiles());
}
}
//System.out.println(“未找到重复项”);
}
}
//这是触发按钮并调用上述方法进行复制的代码
checkDup=newjbutton(“查找重复项”);
checkDup.setmemonic('t');
checkDup.addActionListener(新ActionListener(){
已执行的公共无效行动(行动事件ae){
试一试{
findDuplicateFiles(currentFile.listFiles());
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
});
工具栏。添加(选中DUP);
//下面是表格模型代码。
类FileTableModel扩展了AbstractTableModel{
公共文件[]个文件;
public FileSystemView FileSystemView=FileSystemView.getFileSystemView();
公共字符串[]列={
“图标”,
“文件”,
“路径/名称”,
“大小”,
“上次修改”,
};
FileTableModel(){
此文件(新文件[0]);
}
FileTableModel(文件[]文件){
this.files=文件;
}
公共对象getValueAt(int行,int列){
文件=文件[行];
开关(列){
案例0:
返回fileSystemView.getSystemIcon(文件);
案例1:
返回fileSystemView.getSystemDisplayName(文件);
案例2:
返回文件.getPath();
案例3:
返回file.length();
案例4:
返回文件.lastModified();
违约:
System.err.println(“致命错误”);
}
返回“”;
}
public int getColumnCount(){
返回列的长度;
}
公共类getColumnClass(int列){
开关(列){
案例0:
返回ImageIcon.class;
案例3:
返回Long.class;
案例4:
返回日期.class;
}
返回字符串.class;
}
公共字符串getColumnName(int列){
返回列[列];
}
public int getRowCount(){
返回文件.length;
}
公共文件getFile(int行){
返回文件[行];
}
公共void setFiles(文件[]文件){
this.files=文件;
fireTableDataChanged();
}
}
这是我每次单击按钮时得到的错误代码:
2 files have hash Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
da8f60e8474f7c89f368e5d6d379dcdc:
C:\Users\Mbaegbu\Documents\Bandicam\bandicam 2014-07-02 10-55-03-421 - Copy.jpg
at com.twmacinta.util.FileTableModel.getRowCount(DupFileBrowser.java:900)
at javax.swing.JTable$ModelChange.<init>(Unknown Source)
at javax.swing.JTable.sortedTableChanged(Unknown Source)
at javax.swing.JTable.tableChanged(Unknown Source)
at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)
at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)
at com.twmacinta.util.FileTableModel.setFiles(DupFileBrowser.java:909)
at com.twmacinta.util.DupFileBrowser.findDuplicateFiles(DupFileBrowser.java:418)
at com.twmacinta.util.DupFileBrowser$10.actionPerformed(DupFileBrowser.java:325)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
2个文件在线程“AWT-EventQueue-0”java.lang.NullPointerException中存在哈希异常
da8f60e8474f7c89f368e5d6d379dcdc:
C:\Users\Mbaegbu\Documents\Bandicam\Bandicam 2014-07-02 10-55-03-421-Copy.jpg
位于com.twmacinta.util.FileTableModel.getRowCount(DupFileBrowser.java:900)
在javax.swing.JTable$ModelChange(未知来源)
位于javax.swing.JTable.sortedTableChanged(未知源)
位于javax.swing.JTable.tableChanged(未知源)
位于javax.swing.table.AbstractTableModel.fireTableChanged(未知源)
位于javax.swing.table.AbstractTableModel.fireTableDataChanged(未知源)
位于com.twmacinta.util.FileTableModel.setFiles(DupFileBrowser.java:909)
位于com.twmacinta.util.DupFileBrowser.findDuplicateFiles(DupFileBrowser.java:418)
位于com.twmacinta.util.DupFileBrowser$10.actionPerformed(DupFileBrowser.java:325)
在javax.swing.AbstractButton.fireActionPerformed(未知源)
位于javax.swing.AbstractButton$Handler.actionPerformed(未知源)
在javax.swing.DefaultButtonModel.fireActionPerformed(未知源)
位于javax.swing.DefaultButtonModel.setPressed(未知源)
位于javax.swing.plaf.basic.BasicButtonListener.mouseReleased(未知源代码)
位于java.awt.Component.ProcessMouseeEvent(未知源)
位于javax.swing.JComponent.ProcessMouseeEvent(未知源)
非常感谢您的帮助。您正在将调用File.listFiles()的结果传递给表模型的setFiles()方法。如果调用它的文件不是目录,则listFiles()将返回null。这会导致您遇到空指针异常。根据堆栈跟踪,问题实际上在类FileTableModel中。你也可以提供那个类吗?好的,我会马上更新…@Christian我已经更新了你使用哈希的代码,但是即使冲突的概率很低,也不是因为两个文件的内容具有相同的哈希值,所以它们的内容是相同的。所以,现在是2014年,很快就是2015年,所以你真的应该使用——远远不是it@yole你的建议是什么,在这种情况下我应该怎么做。据我从你的代码中看到的,你调用listFiles()的文件从来都不是一个目录,所以我不知道你希望这段代码如何运行