java文件操作与IO流

文件操作

1.构造方法:

File(String pathname):根据一个路径得到File对象
File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
File(File parent, String child):根据一个父File对象和一个子文件/目录得到File对象
  1. 创建功能:
public boolean createNewFile():创建文件 如果存在这样的文件,就不创建了
public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了
public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来
  1. 删除功能:public boolean delete()
    注意:
    A:如果你创建文件或者文件夹忘了写盘符路径,那么,默认在项目路径下。
    B:Java中的删除不走回收站。
    C:要删除一个文件夹,请注意该文件夹内不能包含文件或者文件夹
  2. 重命名功能:public boolean renameTo(File dest)
    如果路径名相同,就是改名。
    如果路径名不同,就是改名并剪切。
  3. 判断功能:
* public boolean isDirectory():判断是否是目录
* public boolean isFile():判断是否是文件
* public boolean exists():判断是否存在
* public boolean canRead():判断是否可读
* public boolean canWrite():判断是否可写
* public boolean isHidden():判断是否隐藏
  1. 获取功能:
* public String getAbsolutePath():获取绝对路径
* public String getPath():获取相对路径
* public String getName():获取名称
* public long length():获取长度。字节数
* public long lastModified():获取最后一次的修改时间,毫秒值
* public String[] list():获取指定目录下的所有文件或者文件夹的名称数组
* public File[] listFiles():获取指定目录下的所有文件或者文件夹的File数组
接口:文件名称过滤器
* public String[] list(FilenameFilter filter)
* public File[] listFiles(FilenameFilter filter)

IO流

在这里插入图片描述
在这里插入图片描述
1. FileOutputStream fos = new FileOutputStream(“fos.txt”);
创建字节输出流对象了做了几件事情:A:调用系统功能去创建文件B:创建fos对象C:把fos对象指向这个文件

* public void write(int b):写一个字节
* public void write(byte[] b):写一个字节数组
* public void write(byte[] b,int off,int len):写一个字节数组的一部分
  1. FileInputStream:读取数据的方式:
    A:int read():一次读取一个字节
    B:int read(byte[] b):一次读取一个字节数组
    读取代码:
int by = 0;
// 读取,赋值,判断
while ((by = fis.read()) != -1) {
	System.out.print((char) by);
}
------------------------------------------
byte[] bys = new byte[1024];
int len = 0;
while ((len = bis.read(bys)) != -1) {
	System.out.print(new String(bys, 0, len));
}
------------------------------------------
byte[] bys = new byte[1024];
int len = 0;
while ((len = fis.read(bys)) != -1) {
	fos.write(bys, 0, len);
}
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
				"bos.txt"));

为什么不传递一个具体的文件或者文件路径,而是传递一个OutputStream对象呢?
原因很简单,字节缓冲区流仅仅提供缓冲区,为高效而设计的。但是呢,真正的读写操作还得靠基本的流对象实现。
例题:

public class CopyMp4Demo {
	// 高效字节流一次读写一个字节数组:
	public static void method4(String srcString, String destString)
			throws IOException {
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
				srcString));
		BufferedOutputStream bos = new BufferedOutputStream(
				new FileOutputStream(destString));

		byte[] bys = new byte[1024];
		int len = 0;
		while ((len = bis.read(bys)) != -1) {
			bos.write(bys, 0, len);
		}

		bos.close();
		bis.close();
	}

	// 高效字节流一次读写一个字节:
	public static void method3(String srcString, String destString)
			throws IOException {
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
				srcString));
		BufferedOutputStream bos = new BufferedOutputStream(
				new FileOutputStream(destString));

		int by = 0;
		while ((by = bis.read()) != -1) {
			bos.write(by);

		}

		bos.close();
		bis.close();
	}

	// 基本字节流一次读写一个字节数组
	public static void method2(String srcString, String destString)
			throws IOException {
		FileInputStream fis = new FileInputStream(srcString);
		FileOutputStream fos = new FileOutputStream(destString);

		byte[] bys = new byte[1024];
		int len = 0;
		while ((len = fis.read(bys)) != -1) {
			fos.write(bys, 0, len);
		}

		fos.close();
		fis.close();
	}

	// 基本字节流一次读写一个字节
	public static void method1(String srcString, String destString)
			throws IOException {
		FileInputStream fis = new FileInputStream(srcString);
		FileOutputStream fos = new FileOutputStream(destString);

		int by = 0;
		while ((by = fis.read()) != -1) {
			fos.write(by);
		}

		fos.close();
		fis.close();
	}
}
  1. InputStreamReader(InputStream is):用默认的编码读取数据
    InputStreamReader(InputStream is,String charsetName):用指定的编码读取数据
    InputStreamReader的方法:
int read():一次读取一个字符
int read(char[] chs):一次读取一个字符数组
  1. OutputStreamWriter(OutputStream out):根据默认编码把字节流的数据转换为字符流
    OutputStreamWriter(OutputStream out,String charsetName):根据指定编码把字节流数据转换为字符流
    把字节流转换为字符流。字符流 = 字节流 +编码表。
    OutputStreamWriter的方法:
public void write(int c):写一个字符
public void write(char[] cbuf):写一个字符数组
public void write(char[] cbuf,int off,int len):写一个字符数组的一部分
public void write(String str):写一个字符串
public void write(String str,int off,int len):写一个字符串的一部分

转换流的名称有点长,所以,Java就提供了其子类供我们使用。
6. OutputStreamWriter = FileOutputStream + 编码表(GBK)
FileWriter = FileOutputStream + 编码表(GBK)
7. InputStreamReader = FileInputStream + 编码表(GBK)
FileReader = FileInputStream + 编码表(GBK)
8. 字符缓冲流的特殊方法:
BufferedWriter:
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。
public void newLine():根据系统来决定换行符

BufferedReader:
	从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 
	可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
	public String readLine():一次读取一行数据
	包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
	 
例如:
public class CopyFileDemo {
	// 字符缓冲流一次读写一个字符串
	private static void method5(String srcString, String destString)
			throws IOException {
		BufferedReader br = new BufferedReader(new FileReader(srcString));
		BufferedWriter bw = new BufferedWriter(new FileWriter(destString));

		String line = null;
		while ((line = br.readLine()) != null) {
			bw.write(line);
			bw.newLine();
			bw.flush();
		}

		bw.close();
		br.close();
	}

	// 字符缓冲流一次读写一个字符数组
	private static void method4(String srcString, String destString)
			throws IOException {
		BufferedReader br = new BufferedReader(new FileReader(srcString));
		BufferedWriter bw = new BufferedWriter(new FileWriter(destString));

		char[] chs = new char[1024];
		int len = 0;
		while ((len = br.read(chs)) != -1) {
			bw.write(chs, 0, len);
		}

		bw.close();
		br.close();
	}

	// 字符缓冲流一次读写一个字符
	private static void method3(String srcString, String destString)
			throws IOException {
		BufferedReader br = new BufferedReader(new FileReader(srcString));
		BufferedWriter bw = new BufferedWriter(new FileWriter(destString));

		int ch = 0;
		while ((ch = br.read()) != -1) {
			bw.write(ch);
		}

		bw.close();
		br.close();
	}

	// 基本字符流一次读写一个字符数组
	private static void method2(String srcString, String destString)
			throws IOException {
		FileReader fr = new FileReader(srcString);
		FileWriter fw = new FileWriter(destString);

		char[] chs = new char[1024];
		int len = 0;
		while ((len = fr.read(chs)) != -1) {
			fw.write(chs, 0, len);
		}

		fw.close();
		fr.close();
	}

	// 基本字符流一次读写一个字符
	private static void method1(String srcString, String destString)
			throws IOException {
		FileReader fr = new FileReader(srcString);
		FileWriter fw = new FileWriter(destString);

		int ch = 0;
		while ((ch = fr.read()) != -1) {
			fw.write(ch);
		}

		fw.close();
		fr.close();
	}
}

复制文件夹

 /**
 * 编写Java程序:实现文件夹的复制。
 *
 * @param srcFile
 * @param destFile
 */
public static void copyFolder(File srcFile, File destFile) {
    // 判断该File是文件夹还是文件
    if (srcFile.isDirectory()) {
        // 文件夹
        File newFolder = new File(destFile, srcFile.getName());
        newFolder.mkdir();

        // 获取该File对象下的所有文件或者文件夹File对象
        File[] fileArray = srcFile.listFiles();
        for (File file : fileArray) {
            copyFolder(file, newFolder);
        }
    } else {
        // 文件
        File newFile = new File(destFile, srcFile.getName());
        copyFile(srcFile, newFile);
    }
}
/**
 * copy文件
 *
 * @param srcFile
 * @param destFile
 */
public static void copyFile(File srcFile, File destFile) {
    if (srcFile.isFile()) {
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            bis = new BufferedInputStream(new FileInputStream(srcFile));
            bos = new BufferedOutputStream(new FileOutputStream(destFile));
            byte[] bys = new byte[1024 * 10];
            int len = -1;
            while ((len = bis.read(bys)) != -1) {
                bos.write(bys, 0, len);
                bos.flush();
            }
        } catch (FileNotFoundException e) {
            System.out.println("文件异常~");
        } catch (IOException e) {
            System.out.println("copy过程出现异常~");
        } finally {
            try {
                bos.close();
                bis.close();
            } catch (IOException e) {
                System.out.println("释放资源出现异常~");
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值