File与IO流基类
在变量、数组、对象和集合中存储的数据是暂时存在的,一旦程序结束它们就会丢失.
为了能够永久地保存这些数据,需要将其保存到磁盘文件中。Java 的 I/O流技术可以将数据保存到文本文件和二进制文件中,以达到永久保存数据的要求。
接着,java.io.File 类是专门对文件进行操作的类.其中,File 类不能访问文件内容本身,如果需要访问文件内容本身,也需要使用IO流.
一、File类
1.1file提供了三种构造方法
File(File parent, String child) //从父类的抽象路径名和子路径名字符串,创建新的File实例。 File(String pathname) //路径名创建,可以是绝对路径,也可以是相对路径 File(String parent, String child) //从父类路径名字符串和子路径名字符串创建新的File实例。
1.2file常见方法
1.判断文件或者目录是否存在
2.判断是否为目录,或者是文件
3.创建空文件;返回false表示 创建失败: 文件已存在.
4.创建文件夹
这二者的区别是:mkdir()表示如果上级目录存在, 只创建本级目录;mkdirs() 表示如果上级目录不存在,创建所有的上级目录, 再创建本级目录.
5.得到文件下的直接子目录和文件
二、IO流基类
IO流分成三大类:
1.按照流的方向主要分为输入流和输出流两大类。 2.数据流按照数据单位的不同分为字节流和字符流。 3.按照功能可以划分为节点流和处理流。
IO流基类介绍
分类 | 字节输出流 | 字节输入流 | 字符输出流 | 字符输入流 |
---|---|---|---|---|
抽象基类 | OutputStream | InputStream | Writer | Reader |
访问文件 | FileOutputStream | FileInputStream | FileWriter | FileReader |
访问数组 | ByteArrayOutputStream | ByteArrayInputStream | CharArrayWriter | CharArrayReader |
访问管道 | PipedOutputStream | PipedInputStream | PipedWriter | PipedReader |
访问字符串 | StringWriter | StringReader | ||
缓冲流 | BufferedOutputStream | BufferedInputStream | BufferedWriter | BufferedReader |
转换流 | OutputStreamWriter | InputStreamReader | ||
对象流 | ObjectOutputStream | ObjectInputStream | ||
抽象基类 | FilterOutputStream | FilterInputStream | FilterWriter | FilterReader |
打印流 | PrintStream | PrintWriter | ||
推回输入流 | PushbackInputStream | PushbackReader | ||
特殊流 | DataOutputStream | DataInputStream |
其中,所有的输入流类都是 InputStream 抽象类(字节输入流)和 Reader 抽象类(字符输入流)的子类.同理,所有输出流类都是 OutputStream 抽象类(字节输出流)和 Writer 抽象类(字符输出流)的子类.
(1)InputStream字节输入流
名称 | 作用 |
---|---|
int read() | 从输入流读入一个 8 字节的数据,将它转换成一个 0~ 255 的整数,返回一个整数,如果遇到输入流的结尾返回 -1 |
int read(byte[] b) | 从输入流读取若干字节的数据保存到参数 b 指定的字节数组中,返回的字节数表示读取的字节数,如果遇到输入流的结尾返回 -1 |
int read(byte[] b,int off,int len) | 从输入流读取若干字节的数据保存到参数 b 指定的字节数组中,其中 off 是指在数组中开始保存数据位置的起始下标,len 是指读取字节的位数。返回的是实际读取的字节数,如果遇到输入流的结尾则返回 -1 |
void close() | 关闭数据流,当完成对数据流的操作之后需要关闭数据流 |
名称 | 作用 |
---|---|
int write(b) | 将指定字节的数据写入到输出流 |
int write (byte[] b) | 将指定字节数组的内容写入输出流 |
int write (byte[] b,int off,int len) | 将指定字节数组从 off 位置开始的 len 字节的内容写入输出流 |
close() | 关闭数据流,当完成对数据流的操作之后需要关闭数据流 |
flush() | 刷新输出流,强行将缓冲区的内容写入输出流 |
(3)Reader类字符输入流
方法名及返回值类型 | 说明 |
---|---|
int read() | 从输入流中读取一个字符,并把它转换为 0~65535 的整数。如果返回 -1, 则表示 已经到了输入流的末尾。 |
int read(char[] c) | 从输入流中读取若干个字符,并把它们保存到参数 c指定的字符数组中.该方 法返回读取的字符数,如果返回 -1,则表示已经到了输入流的末尾 |
int read(char[] c,int off,int len) | 从输入流中读取若干个字符,并把它们保存到参数 c 指定的字符数组中。其中, off 指定在字符数组中开始保存数据的起始下标,len 指定读取的字符数。该方法返 回实际读取的字符数,如果返回 -1,则表示已经到了输入流的末尾 |
(4)Writer字符输出流
方法名及返回值类型 | 说明 |
---|---|
void write(int c) | 向输出流中写入一个字符 |
void write(char[] cbuf) | 把参数 cbuf 指定的字符数组中的所有字符写到输出流中 |
void write(char[] cbuf,int off,int len) | 把参数 cbuf 指定的字符数组中的若干字符写到输出流中。其中,off 指定 字符数组中的起始下标,len 表示元素个数 |
void write(String str) | 向输出流中写入一个字符串 |
void write(String str, int off,int len) | 向输出流中写入一个字符串中的部分字符。其中,off 指定字符串中的起 始偏移量,len 表示字符个数 |
append(char c) | 将参数 c 指定的字符添加到输出流中 |
三、例子
public static void copyFileByStream(File source, File target) { // 判断源文件是否存在,如果不存在,就退出程序 if (!source.exists()) { System.out.println("源文件不存在,程序退出"); System.exit(0); } // target.getParentFile()表示用来获取目标对象的父目录对象 // 如果目标文件路径不存在,就创建 if (!target.getParentFile().exists()) { target.getParentFile().mkdirs(); } InputStream is = null; OutputStream os = null; try { // 准备输入流 is = new FileInputStream(source); // 准备输出流 os = new FileOutputStream(target); // 准备一个数组,用来存放读写的数据 byte[] b = new byte[1024]; int len = 0; // read(b)实现读取操作,数据存入b数组,返回读取长度给len,当所有内容都读取完毕,len=-1 while ((len = is.read(b)) != -1) { // 实现写的操作 os.write(b, 0, len); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (is != null) { is.close(); } if (os != null) { os.close(); } } catch (IOException e) { e.printStackTrace(); } } }
public static void main(String[] args) { File source = new File("D:\\java\\Java高级\\myfile\\a.txt"); File target = new File("D:\\java\\Java高级\\myfile\\b.txt"); copyFileByStream(source, target); }