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;// 记录是否是文件名查找 }
相关推荐
* 异常处理可以应用于各种场景,例如数据库操作、文件操作、网络操作等。 * 异常处理可以提高程序的健壮性和可靠性。 十、总结 * 异常处理是 Java 编程语言中的一种重要机制,用于处理程序在运行时可能出现的错误...
- 此外还需要导入标准Java库如`java.io.*`等用于文件操作。 #### 代码分析与解读 1. **类定义**:`public class ShapefileReader`定义了一个名为`ShapefileReader`的公共类,用于处理Shapefile文件的读取工作。 ...
在Java编程中,判断文件类型通常不是通过文件扩展名,而是通过读取文件的头部字节来识别。这是因为有些文件可能没有明确的扩展名,或者扩展名被恶意篡改。文件头内容通常包含特定的标识符,这些标识符是文件格式的...
4. **性能优化**:Java的并发处理和垃圾回收机制,使得文件操作和数据处理更加高效。 5. **社区支持**:开源项目通常拥有活跃的开发者社区,能提供持续的更新和问题解答。 二、文件管理系统的工作原理 文件管理...
在实际开发中,你可能还需要处理更多细节,例如重试机制、异常处理、文件上传、文件删除等。了解这些知识点后,你就能在Web服务器和Linux环境下实现与FTP服务器的交互,有效地管理和读取远程文件。
通过本文介绍的方法,您可以轻松实现Java应用程序中对FTP服务器的文件上传与下载操作,并能有效地指定文件上传和下载的目标目录。这对于企业级应用中的文件管理有着重要的作用。同时,在实际应用过程中还需注意安全...
基于java的p2p文件传输代码.rar基于java的p2p文件传输代码.rar基于java的p2p文件传输代码.rar基于java的p2p文件传输代码.rar基于java的p2p文件传输代码.rar基于java的p2p文件传输代码.rar基于java的p2p文件传输代码....
9. **异常处理**:在处理文件操作时,可能会遇到各种异常,如文件不存在、权限不足等。因此,良好的异常处理机制是必不可少的,以确保系统在出现问题时能优雅地处理并给用户反馈。 10. **服务器配置**:根据实际...
1分让你得到sftp常用操作工具,工具实现如下操作: 1)得到当前工作目录地址 2)改变目录为配置的远程目录 3)取文件目录列表 4)取文件列表 5)下载文件 6)复制文件 7)删除文件 8)目录是否存在,文件是否存在 9)移动文件 ...
综上所述,一个基于Java的文件管理系统是一个全面的项目,涵盖了文件操作、目录管理、搜索、读写、流操作、异常处理、命令行交互、多线程以及可能的安全性考虑等多个核心模块。通过学习和实践这样的系统,开发者可以...
在Java编程环境中,读取DBF(dBase文件格式)是一种常见的需求,特别是在处理旧的数据库数据或与GIS系统交互时。DBF文件是dBase系列数据库管理系统的数据存储格式,它包含了表格结构和数据。以下是一些关于如何在...
轻松方便的把class文件转化为java文件
在这个项目中,我们使用了Java的核心库来实现客户端与服务器之间的文件交换,利用TCP(传输控制协议)作为通信的基础。TCP保证了数据的可靠传输,通过建立连接、顺序发送和确认接收来确保数据不丢失、不重复、按序...
这个Java工程文件旨在提供一个解决方案,帮助开发者读取`.shp`文件,获取其中的几何对象坐标,并将这些坐标写入新的文件中。下面我们将深入探讨如何用Java处理`.shp`文件以及相关的技术要点。 首先,要读取`.shp`...
【标题】"javalesson"揭示了这个项目的核心内容,它是一个与Java编程相关的学习资源或教程集合。"从Java编程开始"表明这个项目是为初学者设计的,旨在引导他们逐步掌握Java语言的基础和进阶知识。 【描述】中的...
总的来说,Java 文件夹复制和远程备份涉及到了文件操作、网络通信、异常处理、效率优化以及数据安全等多个方面,这些知识点对于构建一个可靠的远程备份系统至关重要。在实际应用中,还需要根据具体需求进行定制和...
在Java编程环境中,实现远程文件传输是一项常见的任务,特别是在分布式系统和网络应用中。这个小程序可能涉及到了几个关键的Java技术点,包括网络编程、I/O流处理以及可能的多线程技术。以下是对这些知识点的详细...
《Java版学生信息管理系统:构建GUI界面与文件保存机制》 在信息技术领域,开发一个学生信息管理系统是一项常见的任务,尤其对于初学者来说,这能够帮助他们掌握基础的编程概念和数据库管理技能。在这个项目中,...
7. **异常处理**:Java提供了强大的异常处理机制,通过try-catch-finally语句块来捕获和处理运行时可能出现的问题。 8. **集合框架**:Java集合框架包括ArrayList、LinkedList、HashMap等数据结构,它们用于存储和...
与传统的`java.io`包相比,`java.nio`提供了非阻塞I/O操作,能更有效地处理大量数据。它使用缓冲区(Buffer)进行数据交换,减少了系统调用的次数,从而提高了性能。 1. **打开文件通道** 使用`java.nio....