第五次作业:文件的扫描
本次作业在文件扫描的基础上,加入了GUI界面,通过JList来显示扫描文件夹中的文件。并拓展了使用下拉菜单来对文件进行分类。根据后缀的不同,分为几类。
先上代码和图。
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JScrollPane; import javax.swing.event.ChangeEvent; public class test { public JList fileList; public static String[] bmp =new String[20]; public static String[] gif =new String[20]; public static String[] jpg =new String[20]; public static int i=0,j=0,k=0; /** * @param args */ public static void listenDirectory(File dir) throws IllegalAccessException{ //判断dir是否存在,使用Fire类的 if(!dir.exists()){ //如果不存在,则抛出异常 throw new IllegalAccessException("目录"+dir+"不存在。"); } //判断dir是否为目录使用Fire类的isdirectory方法 if(!dir.isDirectory()){ throw new IllegalArgumentException(dir+"不是目录"); } //获得指定目录dir下的文件及子目录并输出 // String[] fileNames=dir.list(); // for(String s:fileNames){ // System.out.println(dir+"\\"+s); // } // System.out.println(); final File[] files = dir.listFiles(); for(File file:files){ if(file.getName().contains("bmp")){ //寻找文件名带有“bmp”的文件 bmp[i]=dir+"\\"+file.getName(); //将带有“bmp”的文件名放入数组中 i++;} if(file.getName().contains("gif")){ //寻找文件名带有“gif”的文件 gif[j]=dir+"\\"+file.getName(); //将带有“gif”的文件名放入数组中 j++;} if(file.getName().contains("jpg")){ //寻找文件名带有“jpg”的文件 jpg[k]=dir+"\\"+file.getName(); //将带有“jpg”的文件名放入数组中 k++;} // System.out.println(file); } //实现只列出目录下的所有文件名称 // System.out.println(); // File[] filess = dir.listFiles(); // for(File fil:filess){ // //如果是文件,则输出 // if(fil.isFile()){ // System.out.println(fil); // } // } final JFrame frame = new JFrame(); frame.getContentPane(); frame.setLayout(new BorderLayout(2,1)); String[] formats = { "所有格式", "bmp格式", "gif格式", "jpg格式" }; final JComboBox formatList = new JComboBox(formats); final JList fileList = new JList(files); fileList.setForeground(new Color(10,171,226)); //设置JList的颜色 fileList.setBackground(new Color(0,0,0)); //设置JList的颜色 fileList.setSelectionBackground(new Color(8,49,134)); //设置JList的颜色 fileList.setSelectionForeground(new Color(140,171,226)); //设置JList的颜色 final JScrollPane scrollPane = new JScrollPane(fileList); scrollPane.setColumnHeaderView(new JLabel("图片目录")); //给JList顶部加一个标签 frame.add(formatList, BorderLayout.NORTH); frame.add(scrollPane, BorderLayout.CENTER); frame.setVisible(true); Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); frame.setBounds(d.width/2, d.height/2, 250, 400); // formatList.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { if (e.getSource() == formatList) { if(formatList.getSelectedIndex()==0) { fileList.setListData(files); //列表框选择所有文件时,显示所有文件 } if(formatList.getSelectedIndex()==1) { fileList.setListData(bmp); //列表框选择“bmp”文件时,显示带“bmp”的文件 } if(formatList.getSelectedIndex()==2) { fileList.setListData(gif); //列表框选择“gif”文件时,显示带“gif”的文件 } if(formatList.getSelectedIndex()==3) { fileList.setListData(jpg); //列表框选择“jpg”文件时,显示带“jpg”的文件 } }}}); } public static void main(String[] args) { try { test.listenDirectory(new File("D:\\java目录")); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
此次作业按照老师上次的留言,加上了备注~
我专门建了一个目录,往里面放了三种类型的图片文件。gif jpg 和bmp。
并且加入了滚动条,在目录放不下的时候显示。
下拉菜单显示了三种格式和显示所有。
这是选择三种类型文件时的截图。在选择不同类型的文件时,只显示该类型的文件。
这是所扫描文件的目录。
本次作业在筛选文件时,有很大提高。首先先对所有的文件名保存到数组中,然后对每一个名字进行筛选,根据不同的后缀放入不同的数组中去。最后在选择下拉菜单时,选择哪一类型的菜单,就显示哪一类型的数组。
这次作业的制作,让我在用FIle及foreach循环有了更加深刻的印象。
======================================================================================
------------------------------------------分 割 线--------------------------------------------
======================================================================================
在做第二个打破记录时,遇到了问题
import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; public class TestRandomAccessFile{ private File file; public static void main(String[] args){ TestRandomAccessFile traf = new TestRandomAccessFile(); traf.init(); traf.record("Adom",30); traf.listAllRecords(); } public void record(String record_breaker, int times){ try{ RandomAccessFile raf = new RandomAccessFile(file,"rw"); boolean flag = false; while(raf.getFilePointer() < raf.length()){ String name = raf.readUTF(); int record; record = raf.readInt(); if(record_breaker.equals(name)&&record<times){ raf.writeInt(times); record = times; flag = true; break; }else{ raf.skipBytes(4); } } if(!flag){ raf.writeUTF(record_breaker); raf.writeInt(times); } raf.close(); }catch(Exception e){ e.printStackTrace(); } } public void init(){ if(file == null){ file = new File("record.txt"); try{ file.createNewFile(); }catch(IOException e){ e.printStackTrace(); } } } public void listAllRecords(){ try{ RandomAccessFile raf = new RandomAccessFile(file,"r"); while(raf.getFilePointer() < raf.length()){ String name = raf.readUTF(); int times = raf.readInt(); System.out.println("name:" + name + "\trecord:" + times); } raf.close(); }catch(Exception e){ e.printStackTrace(); } } }
通过raf.readInt();只能读取第一行的Billy的22的记录,无法读取第二行中adom的30,从而无法继续比较,所以没有实现打破记录的功能。。。