IO流技术:文件夹的创建、遍历、统计 | 编码解码实验

本文详细介绍了Java中IO操作的基本方法,包括目录的创建、列表显示、递归遍历、文件大小统计及字符编码解码等核心功能。通过具体代码示例,读者可以深入理解mkdir(), mkdirs(), list(), listFiles()和listRoots()等API的使用场景和技巧。
API说明
mkdir() 、 mkdirs()创建目录,如果父目录链不存在一同创建
list()下级名称
listFiles()下级File
listRoots()根路径

一、创建目录

  • mkdir() 确保上级目录存在
  • mkdirs() 上级目录可以不存在
代码
public class DirDemo1 {
   public static void main(String[] args) {
   	File dir = new File("E:/Java/IO_Study01/dir/test");
   	//创建目录
   	boolean flag = dir.mkdirs(); 
   	System.out.println(flag);
   }
}
结果

在这里插入图片描述
由于我之前创建过,所以返回值为 false

二、列出下一级

  • list() 列出下级名称
  • listFiles() 列出下级File对象
  • listRoots() 列出所有盘符
代码
public class DirDemo2 {
   public static void main(String[] args) {
   	File dir = new File("E:/Java/IO_Study01");
   	//下级名称
   	String[] subNames = dir.list();
   	for(String s:subNames){
   		System.out.println(s);
   	}
   	//下级对象
   	File[] subFiles = dir.listFiles();
   	for(File s:subFiles){
   		System.out.println(s.getAbsolutePath());
   	}
   	//列出盘符
   	File[] roots = dir.listRoots();
   	for(File r:roots){
   		System.out.println(r.getAbsolutePath());
   	}
   }
}
结果

在这里插入图片描述

三、使用递归

  • 方法自己调用自己
  • 打印子孙级目录和文件的名称
代码
public class DirDemo4 {
   public static void main(String[] args) {
   	File src = new File("E:/Java/IO_Study01/src");
   	printName(src,0);
   }
   //打印子孙级目录和文件的名称
   public static void printName(File src,int deep){
   	System.out.println("第"+deep+"层"+src.getName());
   	if(null==src||!src.exists())return;
   	else if(src.isDirectory()){    //判断是目录继续打印
   		for(File s:src.listFiles()) printName(s,deep+1);
   	}
   }
}
结果

在这里插入图片描述

四、统计文件夹的大小

方法一

代码
public class DirDemo5 {
	public static void main(String[] args) {
		File src = new File("E:/Java/IO_Study01");
		count(src);
		System.out.println(len);
	}
	private static long len=0;
	//统计文件夹的大小
	public static void count(File src){
		//获取大小
		if(null!=src && src.exists()){
			if(src.isFile()){
				len+=src.length();
			}else{ //子孙级
				for(File s:src.listFiles()){
					count(s);
				}
			}
		}
	}
}
结果

在这里插入图片描述
在这里插入图片描述

方法二

使用面向对象,统计文件夹的大小

代码
public class DirCount {
	//大小
	private static long len;
	//文件夹路径
	String path;
	//文件个数
	private static int fileSize;
	//文件夹个数
	private static int dirSize;
	//源
	private File src;
	//构造器
	public DirCount(String path){
		this.path=path;
		this.src=new File(path);
		count(this.src);
	}
	//主方法
	public static void main(String[] args) {
		DirCount dir = new DirCount("E:/Java/IO_Study01");
		System.out.println("大小(bytes):"+dir.getlen());
		System.out.println("包含文件个数:"+dir.getFileSize());
		System.out.println("包含文件夹个数(含自身):"+dir.getDirSize());
	}
	//统计大小
	private static void count(File src){
		//获取大小
		if(null!=src && src.exists()){
			if(src.isFile()){
				len+=src.length();
				fileSize++;
			}else{ //子孙级
				dirSize++;
				for(File s:src.listFiles()){
					count(s);
				}
			}
		}
	}
	public int getFileSize() {
		return fileSize;
	}
	public int getDirSize() {
		return dirSize;
	}
	public long getlen(){
		return len;
	}
}
结果

在这里插入图片描述
在这里插入图片描述

五、统计文件夹的大小

在这里插入图片描述

  • 字符集:Java字符使用16位的双字节存储。但是在实际文件存储的数据有各种字符集,需要正确操作,否则就有乱码的发生。
  • 编码:encode,将字符转为字节
  • 解码:decode,将字节转为字符

1、编码

代码

public class ContentEncode {
	public static void main(String[] args) throws Exception {
		String msg = "周百青a";
		//编码:转为字节数组
		//默认GBK:一个汉字占两个字节,一个字母占一个字节
		byte[] datas = msg.getBytes();
		System.out.println(datas.length);
		//编码:转为其他字符集
		//UTF-16LE:一个汉字占两个字节,一个字母占两个字节
		datas = msg.getBytes("UTF-16LE");
		System.out.println(datas.length);
		//UTF-8:一个汉字占三个字节,一个字母占一个字节
		datas = msg.getBytes("UTF-8");
		System.out.println(datas.length);
	}
}

结果

在这里插入图片描述

2、解码

代码

public class ContentDecode {
	public static void main(String[] args) throws Exception {
		String msg = "周百青a";
		//编码:转为字节数组
		byte[] datas = msg.getBytes();
		//解码:转成字符串
		//String(byte[] bytes, int offset,
		//int length, String charsetName) 
		msg = new String(datas,0,datas.length,"gbk");
		System.out.println(msg);
		//乱码:
		//1、字节数不够
		msg = new String(datas,0,datas.length-2,"gbk");
		System.out.println(msg);
		//2、字符集不统一
		msg = new String(datas,0,datas.length,"utf8");
		System.out.println(msg);
	}
}

结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值