`
felixour
  • 浏览: 32905 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

Netjava Lesson13 文件操作与异常机制

阅读更多

2013.08.03

 

上课内容:文件操作与异常机制

 

这节课我们要讲的是文件操作与异常机制。
我们用过电脑的都知道,我们平时所有的应用程序、文本文档都是文件或者是由一堆文件在一起组成的。
如果用面向对象的思想,我们可以认为文件具有下面几个属性:文件路径,文件名,后缀名等。
而文件有下面几个方法:添加,删除,修改内容,修改后缀名,移动路径等。
这里我们说文件全名,是指带后缀名的文件名。
相对路径是不带盘符的,根目录就在我们的Java Project下,而绝对路径是带盘符的。

 

文件所属的包在java.io里,我们今天要用的是File类,通过API,我们看出File类有很多的方法,我们这里介绍几种最常用的。
首先是构造函数:
File(File parent, String child) 这里输入的是父目录和子字符串。
File(String pathname) 这里输入的是指定路径。
File(String parent, String child) 这里输入的是父路径和子路径
构造函数主要就是这三个,下面介绍一些方法:
首先是创建文件的方法:createNewFile() ,返回boolean值,能够创建有两个前提,一个是指定的目录必须存在,第二个是该文件夹下没有与该文件文件全名相同的文件。
然后我们介绍删除文件的方法:delete(),同样返回的也是boolean值。
判断文件是否存在的方法:exists(),同样也是返回boolean值。
得到文件绝对路径的方法:getAbsolutePath(),返回String类型的,为文件的绝对路径。
//我在文件处理中不小心用了getPath(),结果得到的是相对路径。
还有就是判断该File类对象是否是文件:isFile(),返回的boolean值。
判断该File类对象是否是目录:isDirectory(),返回的boolean值。
当我们要获得目录下所有文件和目录的文件:listFiles(),返回的抽象名路径数组。
当我们要获得磁盘的目录时:listRoots(),返回的是磁盘目录的路径数组。
当我们要创建一个目录时:mkdir(),但前提是必须存在父目录。
当没有父目录时,我们可以用:mkdirs(),这个可以创建很多目录。
文件类中大概就是这些比较常用,要调用其他方法的可以去查API。

 

下面我们介绍一下文件异常机制。
比如说我们要在一个目录下创建一个文件,但是该目录下有与该文件相同的文件名,这时就会抛出异常。
异常用Exception表示,错误用Error表示。一般我们把程序在编译和运行中的错误统称为异常,异常我们可以自己处理,但是错误一般是不能处理的,如文件溢出。
异常类主要有三种:
try{} catch(){}:当我们发现异常时,可以通过try和catch
throw:throw new Exception可以自定义异常
throws:可以向上抛出异常,但是上面必须用异常处理或者接着向上抛出异常,如果主函数也向上抛出异常,就由系统来处理。

 

今天我们要做的练习是要统计你磁盘中所有文件总数或者选择只统计某一种类型的文件或者根据文件名进行统计(多线程)。

我们先来看看效果图吧:



 
首先我们建立一个窗体:

public class FileFrame extends JFrame {

	public static void main(String[] args) {
		FileFrame ff = new FileFrame();
		ff.initUI();
	}

	private void initUI() {
		this.setSize(new Dimension(650, 600));// 设置窗体大小
		this.setLocationRelativeTo(null);// 设置窗体局中
		this.setDefaultCloseOperation(3);// 设置关闭按钮
		this.setResizable(false);// 设置不可调节大小
		this.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 20));// 设置流式布局
		this.getContentPane().setBackground(Color.white);// 设置背景为白色

		// 建立三个标签
		JLabel jla1 = new JLabel("路径:");
		JLabel jla2 = new JLabel("文件名");
		JLabel jla3 = new JLabel("扩展名");

		JComboBox<String> jb = new JComboBox<String>();// 目录下拉框
		jb.addItem("全部");
		jb.addItem("C:/");
		jb.addItem("D:/");
		jb.addItem("E:/");
		jb.addItem("F:/");
		jb.addItem("G:/");
		jb.setPreferredSize(new Dimension(100, 24));// 设置大小

		JTextField jtf = new JTextField();// 设置要输入文件名的文本框
		jtf.setPreferredSize(new Dimension(100, 24));// 设置文本框大小

		JComboBox<String> jcb = new JComboBox<String>();// 后缀名下拉框
		jcb.addItem(".*");
		jcb.addItem(".java");
		jcb.addItem(".txt");
		jcb.addItem(".exe");
		jcb.addItem(".jpg");
		jcb.setPreferredSize(new Dimension(100, 24));// 設置下拉框大小

		JTextArea jta = new JTextArea(24, 41);// 新建一个多行输入文本框
		jta.setEditable(false);// 设置不可编辑
		jta.setOpaque(false);// 设置透明
		jta.append("请点击开始确定按钮开始查找……");// 初始化字
		JScrollPane jcp = new JScrollPane(jta);// 设置有拉动条的面板,将多行输入文本添加进去
		jcp.setBorder(null);// 设置边界为空
		jcp.setOpaque(false);// 设置透明
		jcp.getViewport().setOpaque(false);// 设置透明

		JButton jbu = new JButton("开始查找");// 建立开始查找按钮
		jbu.setPreferredSize(new Dimension(100, 24));// 设置按钮大小
		FileListener fl = new FileListener(jb, jtf, jcb, jta);// 建立监听器
		jbu.addActionListener(fl);// 给按钮添加监听器

		jla1.setFont(new Font("微软雅黑", Font.BOLD, 15));// 设置字体大小
		this.add(jla1);// 路径文本框
		jb.setFont(new Font("微软雅黑", Font.BOLD, 15));// 设置字体大小
		this.add(jb);// 路程的复选框
		jla2.setFont(new Font("微软雅黑", Font.BOLD, 15));// 设置字体大小
		this.add(jla2);// 文件名文本框
		jtf.setFont(new Font("微软雅黑", Font.BOLD, 15));// 设置字体大小
		this.add(jtf);// 加入文件名输入框
		jla3.setFont(new Font("微软雅黑", Font.BOLD, 15));// 设置字体大小
		this.add(jla3);// 拓展名文本框
		jcb.setFont(new Font("微软雅黑", Font.BOLD, 15));// 设置字体大小
		this.add(jcb);// 文件格式复选框
		jbu.setFont(new Font("微软雅黑", Font.BOLD, 15));// 设置字体大小
		this.add(jbu);// 开始查找
		jta.setFont(new Font("微软雅黑", Font.BOLD, 15));// 设置字体大小
		this.add(jcp);// 加入路径

		this.setVisible(true);// 设置窗体可见
	}

}

 

然后我们建立一个按钮监听器,传入所需要的数据:

public class FileListener implements ActionListener {

	private JComboBox<String> jb;
	private JTextField jtf;
	private JComboBox<String> jcb;
	private JTextArea jta;

	/**
	 * 构造函数
	 * 
	 * @param jb
	 * @param jtf
	 * @param jcb
	 * @param jta
	 */
	public FileListener(JComboBox<String> jb, JTextField jtf,
			JComboBox<String> jcb, JTextArea jta) {
		this.jb = jb;
		this.jtf = jtf;
		this.jcb = jcb;
		this.jta = jta;
	}

	public void actionPerformed(ActionEvent e) {
		String path = jb.getSelectedItem().toString();// 得到路径
		if (path.equals("全部"))// 全盘遍历
		{
			String[] str = { "C:/", "D:/", "E:/", "F:/", "G:/" };
			// 循环开线程
			for (int i = 0; i < str.length; i++) {
				new FileThread(str[i], jtf, jcb, jta).start();
			}
		} else {
			new FileThread(path, jtf, jcb, jta).start();// 根据传入的路径开线程
		}
	}
}

 

下面我们就可以建立线程开始写文件了!

public class FileThread extends Thread {

	private String path;
	private JTextField jtf;
	private JComboBox<String> jcb;
	private JTextArea jta;

	/**
	 * 构造方法
	 * 
	 * @param path
	 * @param jtf
	 * @param jcb
	 * @param jta
	 */
	public FileThread(String path, JTextField jtf, JComboBox<String> jcb,
			JTextArea jta) {
		this.path = path;
		this.jtf = jtf;
		this.jcb = jcb;
		this.jta = jta;
	}

	/**
	 * 重写run方法
	 */
	public void run() {
		jta.setText(null);// 设置多行文本内容为空
		String filename = jtf.getText();// 得到文件名
		String suffix = jcb.getSelectedItem().toString();// 得到后缀名

		// 如果只有文件名而没有拓展名
		if (!filename.equals("") && suffix.equals(".*")) // 如果只有文件名
		{
			rawbol = true;
		} else {
			rawbol = false;
		}

		// 得到文件名
		if (suffix.equals(".*")) {
			name = filename;
		} else // 得到文件名加拓展名
		{
			name = filename + suffix;
		}
		int count = filecount(path);// 得到查找到的个数
		jta.append("\n" + path.toCharArray()[0] + "盘内共有" + name + "文件" + count
				+ "个");// 输出查找结果
	}

	/**
	 * 查找的文件方法
	 * 
	 * @param path路径
	 * @return 找到文件的个数
	 */
	public int filecount(String path) {
		int count = 0;// 新建记录文件个数
		File file = new File(path);// 用得到的路径创建文件对象
		if (file.isFile()) // 如果是文件
		{
			count++;// 加一
		} else if (file.isDirectory()) // 如果不是文件
		{
			File[] listfile = file.listFiles();// 建立一个文件数组
			if (listfile != null) // 如果不为空
			{
				for (int i = 0; i < listfile.length; i++) {
					if (listfile[i].isFile()) // 如果是文件
					{
						if (rawbol) // 如果只有文件名
						{
							String pathtemp = listfile[i].getPath();// 得到路径
							int m = pathtemp.lastIndexOf('\\');// 得到最后一个斜线
							int n = pathtemp.lastIndexOf('.');// 得到点
							if (m < n) // 如果点在斜线后面
							{
								String nametemp = pathtemp.substring(m + 1, n);// 得到文件名
								if (nametemp.equals(name)) // 如果要查找的跟文件名相同
								{
									jta.append("\n"
											+ listfile[i].getAbsolutePath());// 在文本框中输出结果
									count++;// 文件数量加一
								}
							}
						} else if (listfile[i].getName().endsWith(name)) // 如果以文件结尾
						{
							jta.append("\n" + listfile[i].getAbsolutePath());// 在文本框中输出结果
							count++;// 文件数量加一
						}
					} else if (listfile[i].isDirectory()) // 如果是文件夹
					{
						count += filecount(listfile[i].getAbsolutePath());// 用递归找子目录下的路径
					}
				}
			}
		}
		return count;
	}

	String name;// 文件名加扩展名,文件名可以为空
	String fileraw;// 文件名,不包含扩展名
	boolean rawbol;// 记录是否是文件名查找
}

 

  • 大小: 27.1 KB
2
3
分享到:
评论
2 楼 felixour 2013-08-05  
求求你帮帮我 写道
JComboBox<String> 这个是不是错了,博主?正确的应该是JComboBox

没有吧,JComboBox里用了泛型,我这里转成了字符串,其实不用应该也可以的。
1 楼 求求你帮帮我 2013-08-05  
JComboBox<String> 这个是不是错了,博主?正确的应该是JComboBox

相关推荐

    Java异常处理机制的静态编译实现与优化

    作为两款被广泛使用的面向对象语言,C++和Java语言都支持异常处理机制。异常处理机制通常由编译器和异常处理机制的运行时支持函数共同实现,因此,如何正确高效地实现异常处理机制是设计编译器和异常处理运行时支持函数...

    java读取shp文件代码

    - 此外还需要导入标准Java库如`java.io.*`等用于文件操作。 #### 代码分析与解读 1. **类定义**:`public class ShapefileReader`定义了一个名为`ShapefileReader`的公共类,用于处理Shapefile文件的读取工作。 ...

    Java语言的异常处理机制研究

    主要讲解Java中的常见异常处理机制,多Java中出现的异常进行了透彻的分析与讲解。

    利用java filter 实现业务异常拦截源码

    利用java filter 实现业务异常拦截 跳转到错误信息提示页面 我们在做项目中肯定都会遇到自定义业务异常 ,然后将业务异常信息跳转的统一的信息提示页面的情况,比如我们在struts的时候我们会用到struts的异常处理...

    Java异常处理的分析与研究 (2).pdf

    "Java异常处理机制分析与研究" 在Java编程中,错误是无法避免的,但通过使用Java的异常处理机制,我们可以控制和处理异常的出现,从而保证程序的安全性和可用性。下面我们将分析Java异常处理机制,并讨论如何运用它...

    带进度条的文件上传下载组件(JAVA)

    9. **异常处理**:在处理文件操作时,可能会遇到各种异常,如文件不存在、权限不足等。因此,良好的异常处理机制是必不可少的,以确保系统在出现问题时能优雅地处理并给用户反馈。 10. **服务器配置**:根据实际...

    Java程序创建Manifest文件

    当我们需要运行一个与其他jar文件有关联jar文件时,如果jar文件里面的MANIFEST.MF文件没有配置好,那在运行时就要报异常:Exception in thread "main" java.lang.NoClassDefFoundError。原因:未找到关联jar文件里面...

    java文件管理系统(控制台程序)

    综上所述,一个基于Java的文件管理系统是一个全面的项目,涵盖了文件操作、目录管理、搜索、读写、流操作、异常处理、命令行交互、多线程以及可能的安全性考虑等多个核心模块。通过学习和实践这样的系统,开发者可以...

    JAVA 读取dbf文件

    在Java编程环境中,读取DBF(dBase文件格式)是一种常见的需求,特别是在处理旧的数据库数据或与GIS系统交互时。DBF文件是dBase系列数据库管理系统的数据存储格式,它包含了表格结构和数据。以下是一些关于如何在...

    Class文件转JAVA

    轻松方便的把class文件转化为java文件

    用Java读取.shp文件的工程文件

    这个Java工程文件旨在提供一个解决方案,帮助开发者读取`.shp`文件,获取其中的几何对象坐标,并将这些坐标写入新的文件中。下面我们将深入探讨如何用Java处理`.shp`文件以及相关的技术要点。 首先,要读取`.shp`...

    小贝程序员生活\课件\java\javaclass\fifteen lesson.rar

    【标题】:“小贝程序员生活\课件\java\javaclass\fifteen lesson.rar”指出这是一个与Java编程相关的学习资源,特别聚焦于第十五课的内容。这个标题可能指的是一个压缩包,里面包含了有关Java编程第15课的课件、...

    java操作mongoDB实现文件上传预览打包下载

    对于"java操作mongoDB实现文件上传预览打包下载"这个主题,我们将深入探讨如何利用Java与MongoDB交互,实现文件的上传、下载、预览以及打包下载等功能。 首先,我们需要在Java项目中引入MongoDB的驱动库,通常是...

    Java文件夹复制(远程复制(网络传输),用于远程备份文件)

    总的来说,Java 文件夹复制和远程备份涉及到了文件操作、网络通信、异常处理、效率优化以及数据安全等多个方面,这些知识点对于构建一个可靠的远程备份系统至关重要。在实际应用中,还需要根据具体需求进行定制和...

    java-lesson-plans.rar_java课程设计

    6. **输入/输出(I/O)与NIO**:Java I/O API用于读写文件、网络通信等,而NIO(New Input/Output)提供了一种非阻塞的I/O模型,提高了效率。 7. **多线程**:Java内置对多线程的支持,可以使用Thread类或Runnable...

    学生信息管理系统(java版本+文件保存).zip

    《Java版学生信息管理系统:构建GUI界面与文件保存机制》 在信息技术领域,开发一个学生信息管理系统是一项常见的任务,尤其对于初学者来说,这能够帮助他们掌握基础的编程概念和数据库管理技能。在这个项目中,...

    小贝程序员生活\课件\java\javaclass\one lesson.rar

    7. **异常处理**:Java提供了强大的异常处理机制,通过try-catch-finally语句块来捕获和处理运行时可能出现的问题。 8. **集合框架**:Java集合框架包括ArrayList、LinkedList、HashMap等数据结构,它们用于存储和...

    java代码实现文件上传和下载

    在java代码中实现文件的上传和下载,通过页面的file文件上传到java代码段,获取文件的大小和名字

    JAVA下载远程Linux服务器的文件

    在Java编程中,有时我们需要与远程Linux服务器进行交互,例如下载或上传文件。在这个场景下,我们可以使用SMB(Server Message Block)协议,这是一种网络文件共享协议,常见于Windows系统,但同样可以应用于Linux...

    java解析dbf文件三种方法、以及解析驱动

    ### Java解析DBF文件的方法与解析驱动介绍 #### DBF文件简介 DBF(dBase File)是一种常用的数据文件格式,最初由dBase数据库应用程序创建并使用。它以表格形式存储数据,支持多种不同的数据库管理系统(DBMS)。...

Global site tag (gtag.js) - Google Analytics