高级API快速入门之文件选择器及字节流&缓冲流【02】

一、文件选择器(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();
	}
}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ning_ning_03

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值