黑马程序员——IO流-File类

------- android培训java培训、期待与您交流! ----------

 

File

1.      File类封装了一个路径,可以文件夹路径, 文件路径或是一个不存在的路径

2.      IO流通过File类可以操作文件夹

 

构造方法

1.      File(File parent, String child)

这个构造方法可以构造一个有已有的File路径和child拼接成的新路径

例如: File file = new File(“d:”); File file1 = new File(file, “myforder”),拼接成的新路径是d:\myforder

2.      File(String parent, Stringchild)

这个构造方法可以构造由字符串parentchild构建的新路径

3.      File(String pathname)

这个构造方法构造一个指定的字符串表示的路径

 

常用方法

1.      创建文件夹

1)      pubic boolean mkdir()

创建一个对象指定路径的文件夹,一次只能创建一个子目录

例如: File file = new File(“c:”); File file1 = new File(file, “a”);这个是可以的

            File file= new File(“c:”); File file1 = new File(file, “a/b”);这个就不可以

下面的方法能创建多层路径

2)      public boolean mkdirs()

创建一个对象指定目录的文件夹,可以创建多层目录

2.      创建文件

public boolean createFile()

创建一个对象指定路径的文件, 前提是这个路径必须是有效的路径

3.      是否存在

public boolean isExists()

判断当前对象指定的路径是否存在

4.      是否为文件

public boolean isFile()

判断当前对象指定的路径是否为文件

5.      是否为文件夹

public boolean isDirectory()

判断当前对象指定的路径是否为文件夹

6.      是否是绝对路径

public boolean isAbsolute

判断当前对象指定的是否为绝对路径值

绝对路径就是加上盘符的一整个文件路径

7.      获得绝对路径

1)      public File getAbsoluteFile()

获得当前对象指定路径的绝对路径,返回File

2)      public String getAbsolutePath()

返回当前对象指定路径的绝对路径的字符串形式

8.      获取父级路径

1)      public File getParentFile()

返回当前对象的指定文件的上一级路径,返回File, 没有上一级目录返回null

2)      public String getParent()

返回上一级路径的字符串形式, 没有返回null

9.      获取文件名

public StringgetName()

返回当前对象指定路径的文件或者文件夹的名字

10.  public File[] listFile()

获得当前指定路径下的所有子文件,返回一个File[]

可以通过迭代得到每一个子文件

11.  public boolean renameTo(Filefile)

对当前对象指定路径的路径和文件名重新定义,就像是windows系统下的剪切

12.  public boolean delete()

这个方法删除当前指定路径的空文件夹或者文件

13.  获得硬盘大小

1)      public long getTotalSpace()

获得当前盘符总共的大小, 单位是字节

2)      public long getFreeSpace()

获得当前盘符空闲的字节大小

3)      pubic long getUsedSpace()

获得当前盘符下的可用空间的字节大小

14.  文件修改时间

1)      public long lastModified()

获取当前对象指定路径表示的文件最后修改的时间,返回一共经过的毫秒值

2)      public long setModified()

设置当前对象指定路径表示的文件最后修改的时间

 

递归

1.      递归就是函数自己调用自己,在处理一些问题时, 可以会重复某些步骤,这时就可以用递归解决.

                   例如:获取文件夹中所有子文件, 删除文件夹,统计文件夹大小, 拷贝文件夹

2.      递归时注意事项

1)      递归要有退出条件.

2)      递归效率不高,比较消耗内存.

3)      如果需要修改默认内存大小,使用-Xss参数

 

BigInteger, BigDecimal

这两各类用于保存超出long范围的整数和超出double范围的浮点数

这两个类提供了加减乘除和取模运算,在运算时不能直接用运算符操作

例如: 9223372036854775807L + 1BigIteger中算加法是

BigInteger sum = BigInteger(“9223372036854775807”).add(“1”);

         BigInteger类提供运算的方法是

         publicBigInteger add(BigInteger i)                  加法

         publicBigInteger substract(BigInteger i)                 减法

         publicBigInteger multiply(BigInteger i)          乘法

         publicBigInteger divide(BigInteger i)              除法

         publicBigInteger mod(BigInteger i)                 取模

         关于BigDecimal中的方法与BigInteger基本一致

 

File类代码示例

这段代码中分别定义了文件以及文件夹大小统计,删除文件及文件夹, 拷贝文件和文件夹的方法

package cn.itcast.io.file.exercise;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class MyOperator {

	/**
	 * @param args
	 * @throws IOException
	 * @throws FileNotFoundException
	 */
	public static void main(String[] args) throws FileNotFoundException,
			IOException {

		File src = new File("e:/学习软件");
		File dest = new File("d:");
		myCopy(src, dest);
		System.out.println("拷贝成功");
		// File del = new File("d:/a.txt");
		// myDelete(del);
		// File file = new File("d:/Java语言程序设计-基础篇(原书第8版).pdf");
		// System.out.println(mySizeCount(file));
	}

	// 统计文件或者文件夹大小的方法
	private static long mySizeCount(File file) {
		// 变量用来统计总文件大小
		long sum = 0;

		// 如果当前是一个文件, 直接返回长度, 如果是文件夹, 迭代统计
		if (file.isFile()) {
			sum += file.length();
		} else {
			// 得到传入File对象的子目录的File数组
			File[] files = file.listFiles();
			// 如果当前目录不为空, 迭代统计文件大小
			if (files != null) {
				for (File subFile : files) {
					// 如果迭代器指向文件, 那么将文件大小累计
					if (subFile.isFile())
						sum += subFile.length();
					// 如果迭代器指向文件夹, 那么将递归得到每个文件的大小累计
					if (subFile.isDirectory())
						sum += mySizeCount(subFile);
				}
			}
		}
		// 返回累计结果
		return sum;
	}

	// 删除文件或者文件夹的方法
	private static void myDelete(File file) {
		// 如果当前file对象时一个文件, 直接删除
		if (file.isFile()) {
			file.delete();
		} else {
			// 如果当前file是一个文件夹, 那么迭代删除
			File[] files = file.listFiles();
			if (files != null) { // 可能有些文件夹下有内容, 但是不能被操作
				for (File subFile : files) {
					// 如果是文件, 那么删除
					if (subFile.isFile())
						subFile.delete();
					// 如果是文件夹, 那么迭代
					if (subFile.isDirectory())
						myDelete(subFile);
				}
			}
			// 删除空文件夹
			file.delete();
			System.out.println("删除成功");
		}
	}

	// 拷贝文件或者文件夹的方法
	private static void myCopy(File src, File dest)
			throws FileNotFoundException, IOException {
		// 如果要copy的是一个文件, 那么直接copy
		if (src.isFile()) {
			try (
			// 创建两个流对象用于读取和写入
			BufferedInputStream bis = new BufferedInputStream(
					new FileInputStream(src));
					BufferedOutputStream bos = new BufferedOutputStream(
							new FileOutputStream(new File(dest, src.getName())));

			) {
				int x;
				while ((x = bis.read()) != -1) {
					bos.write(x);
				}
			}
		} else { // 如果是文件夹, 那么就要遍历拷贝
			// 在目标目录创建一个跟源文件一样的目录
			File newDest = new File(dest, src.getName());
			newDest.mkdir();
			// 得到源文件目录的全部子文件
			File[] files = src.listFiles();
			// 如果源文件目录的文件可以操作, 那么迭代操作
			if (files != null) {
				for (File subFile : files) {
					// 如果当前子文件是数据文件, 那么拷贝
					if (subFile.isFile()) {
						try (
						// 创建两个流对象用于读取和写入
						BufferedInputStream bis = new BufferedInputStream(
								new FileInputStream(subFile));
								BufferedOutputStream bos = new BufferedOutputStream(
										new FileOutputStream(new File(newDest,
												subFile.getName())));) {
							int x;
							while ((x = bis.read()) != -1)
								bos.write(x);
						}
					}
					// 如果是目录, 那么递归拷贝
					if (subFile.isDirectory()) {
						myCopy(subFile, newDest);
					}
				}
			}
		}
	}
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值