一、文件选择器(JFileChooser)
(1) 概述
打开文件或文件夹、保存文件或文件夹。
(2) 常用方法
① setFileSelectionMode(int mode)
设置JFileChooser,以允许用户只选择文件、只选择目录,或者可选择文件和目录
mode参数
1.1 FILES_AND_DIRECTORIES 只是显示文件和目录
1.2 FILES_ONLY 指示仅显示文件
1.3 DIRECTORIES_ONLY 指示仅显示目录
② showDialog(Component parent,String approveButtonText)
弹出具有自定义approve按钮的自定义文件选择器对话框
③ showOpenDialog(Component parent)
弹出一个"Open File"文件选择器对话框
④ showSaveDialog(Component parent)
弹出一个"Save File"文件选择器对话框
⑤ setMultiSelectionEnabled(boolean b)
设置文件选择器,以允许选择多个文件
⑥ getSelectFiles()
如果将文件选择器设置为允许选择多个文件,则返回选中文件的列表(File[])
⑦ getSelectFile()
返回选中的文件/** * 文件选择器的点击事件 */ jba.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //实例化JFileChooser; JFileChooser jfc = new JFileChooser(); //文件选择器默认选中只能是文件,需求中:选中文件夹 jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); jfc.showDialog(null, "请选择目录");//控制展示 File selectedFile = jfc.getSelectedFile(); if(null!=selectedFile) { //将选中的目录设置到对应的输入框中 jtfa.setText(selectedFile.getPath()); } } });
二、字节流&缓冲流
(1) IO流是字节流的老祖宗
InputStream 字节输入流 负责读取
OutputStream 字节输出流 负责写入(2)字节流:一次可以读取一个字节 或者写入一个字节 (写入字节数组以及读取字节数组)
FileInputStream 文件字节输入流FileOutputStream 文件字节输出流
read();读取一个字节
write(int); 一次写入一个字节
close() 关闭流资源
read(byte[]) 读取一个字节数组
write(byte[]) 一次写入一个字节数组
new String(byte) 将字节数组转成String
getBytes() 将字符串转成字节数组
// 1.构建一个File对象指定磁盘下指定读取的文件路径 File file = new File("D:\\埃米.txt"); // 2.构建FileInputStream对象以此将file对象传递到 // 该构造函数内后可以直接通过流的方式进行读取文件中的内容到java程序中进行显示 FileInputStream fis = new FileInputStream(file);//指针 功能:一次读取一个字节 int n = fis.read(); while(n!=-1) { System.out.print((char)n); n = fis.read(); } int n = 0;//定义一个变量存储每次读取的字节内容 while(-1!=(n = fis.read())) { System.out.print((char)n); } // 一次读取一个字节数组 // 创建字节数组,将来通过一次性读取一个字节数组的内容后方便存储 byte[] bys = new byte[1024]; int n = 0; while(-1!=(n = fis.read(bys))) { System.out.println(new String(bys).trim()); System.out.println(new String(bys, 0, n)); } // (2)Java程序运行后,将指定的内容通过FileOutputSteam对象写入到磁盘指定的文件内 // FileOutputSteam(file) 构造函数 输出流 负责写入数据 File file = new File("D:\\哆咪.txt"); // 新建FileOutputStream() FileOutputStream fos = new FileOutputStream(file); // 写入数据write fos.write(97); System.out.println("写入成功"); // 一次性写入一个字节数组 String str = "mynameisxinxin"; // getBytes()将字符串转换成字节数组 fos.write(str.getBytes()); System.out.println("写入成功"); // 关闭所有流的资源 fos.close();
解决文件写入重复操作后覆盖的问题:
package com.lixiangning.test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; public class Test02 { public static void main(String[] args) throws Exception{ //解决方案:先读取 后拼接 最后一起写入即可 File file = new File("D:\\哆咪.txt"); // 输入流 读取 FileInputStream fis = new FileInputStream(file); // 一次读取一个字节数组 String content = ""; byte[] bys = new byte[1024]; int len = 0; while(-1!=(len = fis.read(bys))) { System.out.println(new String(bys,0,len)); content+=new String(bys,0,len); } System.out.println(content); // 输出流 写入 FileOutputStream fos = new FileOutputStream(file); String result = content+"\nabcdefg"; fos.write(result.getBytes()); System.out.println("写入成功"); // 关闭所有流资源 fos.close(); fis.close(); } }
(3)字节缓冲流
BufferedInputStream 缓冲字节输入流
BufferedOutputSteam 缓冲字节输出流
File file = new File("D:\\鑫鑫.txt"); FileInputStream fis = new FileInputStream(file); BufferedInputStream bis = new BufferedInputStream(fis); int read = bis.read(); System.out.println((char)read); int len = 0; while(-1!=(len = bis.read())) { System.out.print((char)len); } File file = new File("D:\\鑫鑫2.txt"); FileOutputStream fos = new FileOutputStream(file); BufferedOutputStream bos = new BufferedOutputStream(fos); bos.write(new String("hello").getBytes()); bos.close(); fos.close();
三、完整案例:
文件选择器(包含递归的实现)
package com.lixiangning.work; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Vector; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.table.DefaultTableModel; public class FileDemo extends JFrame { // 上 private JPanel jpa = new JPanel(); private JLabel jla = new JLabel("路径"); private JTextField jtfa = new JTextField(15); private JButton jba = new JButton("请选择文件"); private JButton jbb = new JButton("搜索"); // 中 private DefaultTableModel dtm = new DefaultTableModel(); private JTable jta = new JTable(dtm); private JScrollPane jsp = new JScrollPane(jta); // 下 private JPanel jpb = new JPanel(); private JButton jbc = new JButton("删除所有txt文件"); private JButton jbd = new JButton("删除所有小于5KB的文件"); private JButton jbe = new JButton("删除最近一个月内的文件"); public FileDemo() { this.setTitle("文件管理器"); this.setSize(700, 400); this.setDefaultCloseOperation(3); this.setLocationRelativeTo(null); // 上 jtfa.setEditable(false); jtfa.setText("D:\\Zking_course");//默认设置输入框中的值 给定一个路径 jpa.add(jla); jpa.add(jtfa); jpa.add(jba); jpa.add(jbb); // 中 dtm.addColumn("文件路径"); dtm.addColumn("文件名称"); dtm.addColumn("文件扩展名"); dtm.addColumn("文件大小(KB)"); dtm.addColumn("最后修改时间"); tableClearData(); //默认要显示输入框中的路径下的所有文件信息 String path = jtfa.getText(); File file = new File(path); findFileAll(file); // 下 jpb.add(jbc); jpb.add(jbd); jpb.add(jbe); // 上 this.getContentPane().add(jpa, "North"); // 中 this.getContentPane().add(jsp, "Center"); // 下 this.getContentPane().add(jpb, "South"); /** * 文件选择器的点击事件 */ jba.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //实例化JFileChooser; JFileChooser jfc = new JFileChooser(); //文件选择器默认选中只能是文件,需求中:选中文件夹 jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); jfc.showDialog(null, "请选择目录");//控制展示 File selectedFile = jfc.getSelectedFile(); if(null!=selectedFile) { //将选中的目录设置到对应的输入框中 jtfa.setText(selectedFile.getPath()); } } }); /** *搜索文件目录的点击事件 */ jbb.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //清除 tableClearData(); //获取之前选中的路径在jtfa中 String filePath = jtfa.getText(); File file = new File(filePath); findFileAll(file); } }); /** * 删除所有txt文件的点击事件 */ jbc.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //获取之前选中的路径在jtfa中 String filePath = jtfa.getText(); File file = new File(filePath); delTxtAll(file); tableClearData(); findFileAll(file); } }); /** * 删除所有小于5KB文件的点击事件 */ jbd.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //获取之前选中的路径在jtfa中 String filePath = jtfa.getText(); File file = new File(filePath); del5KBAll(file); tableClearData(); findFileAll(file); } }); this.setVisible(true); } /** * 方法功能:封装清除上一次表格中显示的所有行 */ public void tableClearData() { int rowsCount = jta.getRowCount(); for (int i = 0; i < rowsCount; i++) { dtm.removeRow(0); } } /** * 方法功能:显示某目录下的所有文件 * @param File file 文件对象 */ public void findFileAll(File file) { //判断是文件还是文件夹 if(file.isFile()) {//文件 //文件路径 String filePath = file.getPath(); //文件名 String fileName = file.getName(); //文件扩展名 String zh = ""; int index = fileName.lastIndexOf("."); if(index!=-1) {//说明这个文件名有"." zh = fileName.substring(index); }else {//说明这个文件名没有"." zh = "无后缀名"; } // System.out.println("文件的后缀有: "+zh); //文件大小(Byte) long len = file.length(); double fileLength = len/1024.0; //文件的最后修改时间 long lastModified = file.lastModified(); Date date = new Date(lastModified); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String mydate = sdf.format(date); //新建Vector Vector<Object> vc = new Vector<Object>(); vc.add(filePath); vc.add(fileName); vc.add(zh); vc.add(fileLength); vc.add(mydate); dtm.addRow(vc); }else if(file.isDirectory()) {//是文件夹 //通过listFile方法得到该文件夹下的所有文件信息(文件夹+文件) File[] listFiles = file.listFiles(); //系统文件判断排除 if(listFiles == null) { return; } //遍历 for (File file2 : listFiles) { //调用方法本身重新验证每个file2就是是文件还是文件夹 findFileAll(file2); } } } /** * 方法功能:删除所有txt文件 * @param args */ public void delTxtAll(File file) { if(file.isFile()) {//文件 String fileName = file.getName();//获取文件名 int index = fileName.lastIndexOf("."); if(-1!=index) {//筛选无后缀名的文件 String hz = fileName.substring(index); if(hz.equals(".txt")) { file.delete(); } } }else if(file.isDirectory()) { File[] listFiles = file.listFiles(); for (File file2 : listFiles) { delTxtAll(file2); } } } /** * 方法功能:删除所有小于5KB的文件 * @param file */ public void del5KBAll(File file) { if(file.isFile()) {//文件 long len = file.length(); double fileLength = len/1024.0; if(fileLength < 5) { file.delete(); } }else if(file.isDirectory()) { File[] listFiles = file.listFiles(); for (File file2 : listFiles) { delTxtAll(file2); } } } public static void main(String[] args) { new FileDemo(); } }