欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java文件操作及输入输出流

程序员文章站 2022-03-13 15:35:48
...

文件管理

file类

File类是一个与平台无关的   文件   或   目录   

1 常用方法

1.1 构造方法

  • File(String path):如果path是实际存在的路径,则该File对象表示的是目录;如果path是文件名,则该File对象表示的是文件。
  • File(String path, String name):path是路径名,name是文件名。
  • File(File dir, String name):dir是路径对象,name是文件名。

1.2 获得文件名

  • String getName( ):获得文件的名称,不包括路径。
  • String getPath( ):获得文件的路径。
  • String getAbsolutePath( ):获得文件的绝对路径。
  • String getParent( ):获得文件的上一级目录名。

1.3 文件属性测试

  • boolean exists( ):测试当前File对象所表示的文件是否存在。
  • boolean canWrite( ):测试当前文件是否可写。
  • boolean canRead( ):测试当前文件是否可读。
  • boolean isFile( ):测试当前文件是否是文件。
  • boolean isDirectory( ):测试当前文件是否是目录。

1.4 文件操作

  • long lastModified( ):获得文件最近一次修改的时间。
  • long length( ):获得文件的长度,以字节为单位。
  • boolean delete( ):删除当前文件。成功返回 true,否则返回false。
  • boolean renameTo(File dest):将重新命名当前File对象所表示的文件。成功返回 true,否则返回false

1.5 目录操作

  • boolean mkdir( ):创建当前File对象指定的目录。
  • String[] list():返回当前目录下的文件和目录,返回值是字符串数组。
  • String[] list(FilenameFilter filter):返回当前目录下满足指定过滤器的文件和目录,参数是实现FilenameFilter接口对象,返回值是字符串数组。
  • File[] listFiles():返回当前目录下的文件和目录,返回值是File数组。
  • File[] listFiles(FilenameFilter filter):返回当前目录下满足指定过滤器的文件和目录,参数是实现FilenameFilter接口对象,返回值是File数组。
  • File[] listFiles(FileFilter filter):返回当前目录下满足指定过滤器的文件和目录,参数是实现FileFilter接口对象,返回值是File数组。

对目录操作有两个过滤器接口:FilenameFilter和FileFilter。它们都只有一个抽象方法accept

FilenameFilter接口中的accept方法如下:

  • boolean accept(File dir, String name):测试指定dir目录中是否包含文件名为name的文件。

FileFilter接口中的accept方法如下:

  • boolean accept(File pathname):测试指定路径名是否应该包含在某个路径名列表中。
**注意 路径中会用到路径分隔符,路径分隔符在不同平台上是有区别的,UNIX、Linux和macOS
中使用正斜杠“/”,而Windows下使用反斜杠“\”。Java是支持两种写法,但是反斜杠“\”属于特殊字符,前面需要加转义符。例如C:\Users\a.java在程序代码中应该使用C:\\Users\\a.java表示,或表示为C:/Users/a.java也可以。**

I/O流

1 字节输入流

  • FileInputStream                  文件输入流
  • ByteArrayInputStream        面字节组的输入流
  • PipedInputStream              管道输入流,用于两个线程之间的数据传递
  • FilterInputStream               过滤输入流,它是一个装饰器拓展输入流
  • BufferedInputStream          缓冲区输入流,是FilterInputStream子类
  • DataInputStream                面向基本数据类型的输入流,是FilterInputStream子类

2 字节输出流

  • FileOutputStream                  文件输出流
  • ByteArrayOutputStream        面字节组的输出流
  • PipedOutputStream              管道输出流,用于两个线程之间的数据传递
  • FilterOutputStream               过滤输出流,它是一个装饰器拓展输出流
  • BufferedOutputStream          缓冲区输出流,是FilterOutputStream子类
  • DataOutputStream                面向基本数据类型的输出流,是FilterOutputStream子类

3 字符输入流

  • FileReader                  文件输入流
  • CharArrayReader        面字节组的输入流
  • PipedReader              管道输入流,用于两个线程之间的数据传递
  • FilterReader               过滤输入流,它是一个装饰器拓展输入流
  • BufferedReader          缓冲区输入流,是FileReader的子类
  • InputStreamReader    将字节流转换为字符流,是FileReader的父类

3 字符输出流

  • FileWriter                  文件输出流
  • CharArrayWriter        面字节组的输出流
  • PipedWriter              管道输出流,用于两个线程之间的数据传递
  • FilterWriter               过滤输入流,它是一个装饰器拓展输出流
  • BufferedWriter          缓冲区输出流,是FileWriter的子类
  • InputStreamWriter    将字节流转换为字符流,是FileWriter的父类

字节流

掌握字节流的API先要熟悉它的两个抽象类InputStream 和OutputStream,了解它们有哪些主要的方法。

1 InputStream抽象类

InputStream是字节输入流的根类,它定义了很多方法,影响着字节输入流的行为。下面详细介绍一
下。
InputStream主要方法如下:

  • int read():读取一个字节,返回0到255范围内的int字节值。如果已经到达流末尾,而且没有可
    用的字节,则返回值-1。
  • int read(byte b[] ):读取多个字节,数据放到字节数组b中,返回值为实际读取的字节的数量,如
    果已经到达流末尾,而且没有可用的字节,则返回值-1。
  • int read(byte b[ ], int off, int len):最多读取len个字节,数据放到以下标off开始字节数组b中,将
    读取的第一个字节存储在元素b[off]中,下一个存储在b[off+1]中,依次类推。返回值为实际读
    取的字节的数量,如果已经到达流末尾,而且没有可用的字节,则返回值-1。
  • void close():流操作完毕后必须关闭。
上述所有方法都会抛出IOException,使用时要注意

2 OutputStream抽象类

OutputStream是字节输出流的根类,它定义了很多方法,影响着字节输出流的行为。下面详细介绍一
下。

  • OutputStream主要方法如下:
    void write(int b):将b写入到输出流,b是int类型占有32位,写入过程是写入b 的8个低位,b的24
    个高位将被忽略。
  • void write(byte b[ ]):将b.length个字节从指定字节数组b写入到输出流。
  • void write(byte b[ ], int off, int len):把字节数组b中从下标off开始,长度为len的字节写入到输出
    流。
  • void flush():刷空输出流,并输出所有被缓存的字节。由于某些流支持缓存功能,该方法将把缓
    存中所有内容强制输出到流中。
  • void close( ):流操作完毕后必须关闭。
上述所有方法都声明抛出IOException,因此使用时要注意。

案例:文件复制

FileInputStream构造方法主要有:

  • FileInputStream(String name):创建FileInputStream对象,name是文件名。如果文件不存在则抛出FileNotFoundException异常。
  • FileInputStream(File file):通过File对象创建FileInputStream对象。如果文件不存在则抛出
    FileNotFoundException异常。

FileOutputStream构造方法主要有:

  • FileOutputStream(String name):通过指定name文件名创建FileOutputStream对象。如果name文件存在,但如果是一个目录或文件无法打开则抛出FileNotFoundException异常。
  • FileOutputStream(String name, boolean append):通过指定name文件名创建FileOutputStream对象,append参数如果为 true,则将字节写入文件末尾处,而不是写入文件开始处。如果name文件存在,但如果是一个目录或文件无法打开则抛出FileNotFoundException异常。
  • FileOutputStream(File file):通过File对象创建FileOutputStream对象。如果file文件存在,但如果是一个目录或文件无法打开则抛出FileNotFoundException异常。
  • FileOutputStream(File file, boolean append):通过File对象创建FileOutputStream对象,append参数如果为 true,则将字节写入文件末尾处,而不是写入文件开始处。如果file文件存在,但如果是一个目录或文件无法打开则抛出FileNotFoundException异常。

下面介绍如果将./TestDir/build.txt文件内容复制到./TestDir/subDir/build.

第一种方法:使用字节流
public class FileCopy {
	public static void main(String[] args) {
		try (FileInputStream in = new FileInputStream("./TestDir/build.txt");
			FileOutputStream out = new FileOutputStream("./TestDir/subDir/build.txt")) { ①

			// 准备一个缓冲区
			byte[] buffer = new byte[10]; ②
			// 首先读取一次
			int len = in.read(buffer); ③
			while (len != -1) { ④
				String copyStr = new String(buffer); ⑤
				// 打印复制的字符串
				System.out.println(copyStr);
				// 开始写入数据
				out.write(buffer, 0, len); ⑥
				// 再读取一次
				len = in.read(buffer); ⑦
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
		e.printStackTrace();
		}
	}
		
}

使用第一种方法,是每10个byte就写入一次,写入的次数远远多于缓存区设置为1024的时候,消耗的时间超过1024

第二种方法:使用字节缓冲流
public class FileCopy{
	public static void main(String args[]){
		try(FileInputStream in =new FileInputStream("./TestDir/build.txt");
		FileOutputStream out =new FileOutputStream("./TestDir/subDir/build.txt")){

			byte [] buffer = new byte [1024];
			
			int len=in.read(buffer);

			while(len!=-1){
				out.write(buffer,0,len);
				len=in.read(buffer);
			}
		}catch(FileNotFoundException e){
			e.printStackTrace();
		}catch(IOException e){
			e.printStackTrace();
		}