您的位置:首页 > 其它

第五次作业:文件的扫描

2016-04-15 17:42 323 查看
本次作业在文件扫描的基础上,加入了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,从而无法继续比较,所以没有实现打破记录的功能。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: