第五次作业:文件的扫描

本次作业在文件扫描的基础上,加入了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,从而无法继续比较,所以没有实现打破记录的功能。。。

posted on 2016-04-15 17:42  我才是高云鹏  阅读(361)  评论(0编辑  收藏  举报

导航