File类中的常用方法&IO流中的字节流

本文详细介绍了Java中File类的基本使用,包括文件和目录的路径表示、常见方法及属性获取。深入探讨了绝对路径与相对路径的概念,并通过实例展示了如何创建、读取和遍历目录。此外,文章还讲解了递归方法的应用、过滤器的实现,以及IO流的分类和使用技巧,如字节流和字符流的区别,输入输出流的操作,装饰者模式的理解,以及文件拷贝的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.File类:文件和目录路径名的抽象表示

2.绝对路径:带盘符的路径.

相对路径:相对其他文件或目录的一个路径叫相对路径.

如果当前文件或目录相对其他盘符的的文件或目录来说,此时相对路径==绝对路径.

如果当前文件或目录相对当前所有在的盘符的文件或目录来说,此时相对路径!=绝对路径.

根路径:相当当前项目的路径.

3.file类常用方法:

   public static void main(String[] args) {
		//获得文件对象
		File f1=new File("aa\\a.txt");
		System.out.println("文件名:"+f1.getName());
		System.out.println("绝对路径:"+f1.getAbsolutePath());
		System.out.println("相对路径:"+f1.getPath());
		System.out.println("是否可读:"+f1.canRead());
		System.out.println("是否可写:"+f1.canWrite());
		System.out.println("是否隐藏:"+f1.isHidden());
		System.out.println("文件的长度:"+f1.length());
		//得到文件最后一次修改时间
		Long time1=f1.lastModified();
		//创建格式化对象
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		//用格式化对象将时间进行格式化成指定格式的字符串
		String time2=sdf.format(new Date(time1));
		
		System.out.println("最后一次修改时间:"+time2);
    }
	public static void main(String[] args) throws IOException {
		//获得文件对象
		File f1=new File("cc\\bb\\b.txt");
		
		//获得当前文件对象父目录
		File parentFile=f1.getParentFile();
		//判断父目录是否存在
		if (parentFile.exists()) {//父目录存在
			System.out.println("父目录存在");
		} else {//父目录不存在
			//创建一级目录
			//parentFile.mkdir();
			//创建多级目录
			parentFile.mkdirs();
			System.out.println("父目录创建成功");
			
		}
		
		//判断当前文件是否存在
		if (f1.exists()) {//文件存在
			System.out.println("文件存在");
		} else {//文件不存在
			//创建文件
			f1.createNewFile();
			System.out.println("文件创建成功");
		}
	}
	public static void main(String[] args) throws IOException {
		//获得目录对象
		File f1=new File("cc");
		
		//判断当前目录是否存在
		if (f1.exists()) {//当前目录存在
			//获得当前目录所有子文件或子目录的字符串形式
			String[] childFiles=f1.list();
			//遍历子文件或子目录
			for (String child : childFiles) {
				//判断子文件或子目录是否以.txt结尾
				if (child.endsWith(".txt")) {
					System.out.println(child);
				}
			}
			
		} else {
			System.out.println("当前目录不存在");
		}
	}

4.递归:方法自身调用自身.

4.1:可以将原问题拆分成若干子问题,子问题的解决方法与原问题的解决方法一样.

4.2:原问题的解决依赖于所有子问题的解决.

4.3:递归一定要有出口.

eg:/**
 * 2.获得指定目录下所有以.txt结尾的文件(子文件,孙子文件,子子孙孙)
 */
public class FileTest4 {

	public static void main(String[] args) throws IOException {
		//获得目录对象
		File f1=new File("cc");
		if (f1.exists()) {
			//调用递归方法
			digun(f1);
		} else {
			System.out.println("目录不存在");
		}
	}
	
	/**
	 * 判断当前目录的子文件是否以.txt结尾
	 * @param f
	 */
	public static void digun(File f) {
		//获得当前目录的子文件或子目录
		File[] files=f.listFiles();
		//遍历所有子文件和子目录
		for (File f2 : files) {
			if (f2.isDirectory()) {//当前遍历的是子目录
				digun(f2);//调用自身
			}else{//当前遍历的是子文件
				if (f2.getName().endsWith(".txt")) {
					System.out.println(f2.getName());
				}
			}
		}
	}
}

5.过滤器:将需要数据留下来,不需要数据过滤掉.

/**
 * 自定义文件过滤器类
 */
public class MyFilter implements FilenameFilter{
	/**
	 * 过滤方法
	 * @param dir 要过滤文件对象
	 * @param name要过滤文件名
	 */
	@Override
	public boolean accept(File dir, String name) {
		if (name.endsWith(".txt")) {
			return true;
		} else {
			return false;
		}
	}
}
public static void main(String[] args) throws IOException {
		//获得目录对象
		File f1=new File("cc");
		
		//判断当前目录是否存在
		if (f1.exists()) {//存在
			//创建一个过滤器对象
			FilenameFilter mf=new MyFilter();
			//用过滤器获得当前目录下满足条件以.txt结尾子文件
			String[] files=f1.list(mf);
			//遍历输出
			for (String f2 : files) {
				System.out.println(f2);
			}
		} else {
			System.out.println("目录不存在");
		}
}

1.IO流:将数据从一个地方传输另一个地方.

2.流的分类:

2.1:按输出方向分:以程序为参数物.

输入流:将文件中数据读取到程序中.

注意:如果文件不存在,输入流会抛异常(报错).

输出流:将程序中数据写入到文件中.

注意:如果文件不存在,先创建文件,再向文件中写入数据.

2.2:按单元分:bit(位),byte,kb,mb,g,t,p

字节流:以字节为单元传输的流.

作用:用来传输部分文本文件,图片,视频,二进制文件.

字符流:以字符为单元传输的流.

作用:用来传输文本文件.

2.3:按功能分:

节点流:原始流.

处理流:封装了原始流.

3.装饰者模式:将原有类的对象进行封装,使其功能更强大.

4.基本字节流(原始字节流)

4.1:字节输入流:InputStream->FileInputStream

4.1.1:一个字节一个字节的读取

eg:public static void main(String[] args) throws IOException{
		//声明一个流对象
		FileInputStream fis=null;
		try {
			//1.创建流对象
			fis=new FileInputStream("bb\\b.txt"); 
			/*2.用流来读取文件中内容,一个字节一个字节的读取,*/
			//返回的是读取的内容,先读取一次
			int content=fis.read();
			//接着读
			while (content!=-1) {
				//将读取的字节内容转换为字符输出
				System.out.print((char)content);
				//接着读
				content=fis.read();
			}
			System.out.println("读取完毕!");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//3.关流
			if (fis!=null) {
				fis.close();
			}
		}
	}

4.1.2:按字节数组的读取

	eg:public static void main(String[] args) throws IOException {
		//声明流对象
		FileInputStream fis=null;
		
		try {
			//1.创建流对象
			fis=new FileInputStream("bb\\b.txt");
			/*2.用流对象读取内容*/
			//准备一个数组
			byte[] b=new byte[5];
			//先读取一次,返回的是读取的长度,读取的内容存在数组中.
			int len=fis.read(b);
			//接着读
			while (len!=-1) {
				System.out.println("读取的长度:"+len);
				//先将读取的内容转换为String类型再输出
				String s1=new String(b, 0, len);
				System.out.println(s1);
				//接着读
				len=fis.read(b);
			}
			System.out.println("读取完毕");
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			//3.关闭对象
			if (fis!=null) {
				fis.close();
			}
		}
	}

4.2:字节输出流:OutputStream->FileOutputStream

	eg:public static void main(String[] args) throws IOException {
		//声明流对象
		FileOutputStream fos=null;
		try {
			//1.创建流对象,第二个参数是否向文件末尾追加内容
			fos=new FileOutputStream("bb\\c.txt",true);
			/*2.用流对象向文件中写入内容*/
			fos.write("Hello Java".getBytes());
			fos.write("Hello Stream".getBytes());
			fos.write("我是千锋人".getBytes());
			System.out.println("写入完毕");
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			//3.关流
			if (fos!=null) {
				fos.close();
			}
		}
	}

4.3:文件的拷贝

	eg:public static void main(String[] args) throws IOException {
		//声明流对象
		FileInputStream fis=null;
		FileOutputStream fos=null;
		try {
			//1.创建输入流和输出流对象
            fis=new FileInputStream("C:\\Users\\sx\\Desktop\\image\\4.jpg");
            fos=new FileOutputStream("bb\\a.jpg");
			/*用流边读取边写入*/
			//准备一个数组
			byte[] b=new byte[1024];
			//先读取一次,返回读取的长度,读取的内容存到数组中
			int len=fis.read(b);
			//判断,接着读
			while (len!=-1) {
				//将读取的内容写入到文件中
				fos.write(b, 0, len);
				//接着读
				len=fis.read(b);
			}
			System.out.println("图片拷贝成功");
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			//3.关流
			if (fis!=null) {
				fis.close();
			}
			if (fos!=null) {
				fos.close();
			}
		}
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值