Java文件操作及输入输出流

文件管理

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();
		}
发布了19 篇原创文章 · 获赞 2 · 访问量 2088

猜你喜欢

转载自blog.csdn.net/weixin_43308622/article/details/104206673