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();
}
上一篇: Java进制概述及进制间的相互转换