目录
一.文件的操作
1.构造方法
2.常用方法
3.文件的绝对路径和相对路径
1.绝对路径
2.相对路径
4.注意事项
5.File类的方法使用例子(递归遍历指定目录下的所有文件)
二. 输入流
1.InputStream(输入流)
(1)常用方法
2.FileInputStream(文件输入流(具体实现类))
(1)构造方法
3.通过输入流来读取文件内容
(1)使用流的注意事项
(2)通过输入流读取文件中的内容
(3)使用Scanner类来读取文件中的内容
三.输出流
1.OutputStream中的方法(抽象类)
2.FileOutputStream类
(1)常用方法
(2)使用FileOutputStream输出流向文件中写内容
(3)使用PrintWrite向文件中写内容
(4)结合输入输出流读写文件
四.输入输出流的总结
一.文件的操作
1.构造方法
构造方法 | 说明 |
File(File parent, String child) | 根据父目录 + 孩子文件路径,创建一个新的 File 实例 |
File(String pathname) | 根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者相对路径 |
File(String parent, String child) | 根据父目录 + 孩子文件路径,创建一个新的 File 实例,父目录用路径表示 |
2.常用方法
返回值类型及方法名 | 方法说明 |
boolean exists() | 判断 File 对象描述的文件是否真实存在 |
String getName() | 返回 FIle 对象的纯文件名称 |
boolean isFile() | 判断 File 对象代表的文件是否是一个普通文件 |
String[] list() | 返回 File 对象代表的目录下的所有文件名 |
File[] listFiles() | 返回 File 对象代表的目录下的所有文件,以 File 对象 |
boolean mkdir() | 创建 File 对象代表的目录 |
boolean mkdirs() | 创建 File 对象代表的目录,如果必要,会创建中间目录 |
boolean isDirectory() | 判断 File 对象代表的文件是否是一个目录 |
boolean delete() | 根据 File 对象,删除该文件。成功删除后返回 true |
boolean createNewFile() | 根据 File 对象,自动创建一个空文件。成功创建后返回 true |
3.文件的绝对路径和相对路径
1.绝对路径
从根目录到当前文件的位置的全部路径就是绝对路径
2.相对路径
在当前目录下的文件的路径就是相对路径,这里只不过省略了前面的根目录
其中..指的是当前io目录的上一层目录。
4.注意事项
创建File对象的时候,如果当前路径的文件不存在,则不会报错。
对于mkdirs()来说,如果有一级目录不存在,那么之后会创建该目录,而下面的子目录也可以成功创建。
5.File类的方法使用例子(递归遍历指定目录下的所有文件)
package io;import java.io.File;public class FileMethod {public static void main(String[] args) {//如果使用,需要修改文件路径(这里的路径是我电脑的绝对路径)File file = new File("E:\\1java练习\\javaweb");printAllFile(file);}public static void printAllFile(File file) {//遍历当前目录下的所有文件(包含目录)for (File f:file.listFiles()) {if(f.isDirectory()) {//如果当前文件是目录,就递归printAllFile(f);}else {//直接打印该文件名System.out.println(f);}}}
}
输出结果
二. 输入流
1.InputStream(输入流)
InputStream是一个抽象类,如果想要使用,还需要使用具体的实现类配合才能使用
(1)常用方法
返回值与方法名 | 方法说明 |
int read() | 读取一个字节的数据,返回 -1 代表已经完全读完了 |
int read(byte[] b) | 最多读取 b.length 字节的数据到 b 中,返回实际读到的数量;-1 代表以及读完了 |
int read(byte[] b, int off, int len) | 最多读取 b.length 字节的数据到 b 中,返回实际读到的数量;-1 代表以及读完了最多读取 len - off 字节的数据到 b 中,放在从 off 开始,返回实际读到的数量;-1 代表以及读完了 |
void close() | 关闭字节流 |
2.FileInputStream(文件输入流(具体实现类))
(1)构造方法
构造方法 | 说明 |
FileInputStream(File file) | 利用 File 构造文件输入流 |
FileInputStream(String name) | 利用文件路径构造文件输入流 |
3.通过输入流来读取文件内容
(1)使用流的注意事项
在使用流结束的时候需要将流进行关闭,在jdk1.8之前是通过try finally 语句块进行关闭,在jdk1.8之后我们直接可以在try中将流创建好,之后会自动进行流的关闭。
(2)通过输入流读取文件中的内容
package io;import java.io.*;public class FileMethod {public static void main(String[] args) {File file = new File("E:\\1java练习\\javaweb\\io\\t.txt");printContent(file);}public static void printContent(File file) {
// 在try中创建流,之后会自动关闭,不用手动进行关闭try(InputStream inputStream = new FileInputStream(file)) {byte[] buf = new byte[1024];//构建一个缓冲区,将内容读取到该数组中int len;while ((len=inputStream.read(buf))!=-1) {//将读取到的字节数组转化为字符串内容String str = new String(buf,0, len);System.out.println(str);}}catch (IOException e) {e.printStackTrace();}}}
(3)使用Scanner类来读取文件中的内容
package io;import java.io.*;
import java.util.Scanner;public class FileMethod {public static void main(String[] args) {File file = new File("E:\\1java练习\\javaweb\\io\\t.txt");printContentSc(file);}public static void printContentSc(File file) {try {try(FileInputStream fileInputStream = new FileInputStream(file)) {//根据scanner进行读取,并设置读取的格式Scanner scanner = new Scanner(fileInputStream, "UTF-8");while (scanner.hasNext()) {//按行进行读取String str = scanner.nextLine();System.out.println(str);}}} catch (IOException e) {e.printStackTrace();}}}
三.输出流
1.OutputStream中的方法(抽象类)
返回值和方法名 | 方法说明 |
void write(int b) | 写入要给字节的数据 |
void write(byte[] b) | 将 b 这个字符数组中的数据全部写入 os 中 |
int write(byte[] b, int off, int len) | 将 b 这个字符数组中从 off 开始的数据写入 os 中,一共写 len 个 |
void close() | 关闭字节流 |
void flush() | 我们知道 I/O 的速度是很慢的,所以,大多的 OutputStream 为了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写入设备中,这个区域一般称为缓冲区。但造成一个结果,就是我们写的数据,很可能会遗留一部分在缓冲区中。需要在最后或者合适的位置,调用 flush(刷新)操作,将数据刷到设备中 |
2.FileOutputStream类
(1)常用方法
(2)使用FileOutputStream输出流向文件中写内容
package io;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class OutputStreamDemo {public static void main(String[] args) throws IOException {File file = new File("E:\\1java练习\\javaweb\\io\\t2.txt");//文件不存在就创建文件if(!file.exists()) {file.createNewFile();}fileWrite(file);}public static void fileWrite (File file) {try(FileOutputStream fileOutputStream = new FileOutputStream(file)) {String str = "haoi哈Ohio撒旦和";//将字符串转化为字节数组,并设置编码格式byte[] buf = str.getBytes("UTF-8");fileOutputStream.write(buf);//将缓冲区的内容刷新到t2.txt中fileOutputStream.flush();}catch (IOException e) {e.printStackTrace();}}
}
(3)使用PrintWrite向文件中写内容
package io;import java.io.*;public class OutputStreamDemo {public static void main(String[] args) throws IOException {File file = new File("E:\\1java练习\\javaweb\\io\\t2.txt");//文件不存在就创建文件if(!file.exists()) {file.createNewFile();}filePrintWrite(file);}public static void filePrintWrite(File file) {try(PrintWriter printWriter = new PrintWriter(new FileOutputStream(file))) {printWriter.println("Idaho诋哈的话覅");//写一个行,带换行printWriter.print("afdhasid");//写一行,没有换行//将内容从缓冲区中刷新到文件中printWriter.flush();} catch (FileNotFoundException e) {e.printStackTrace();}}}
(4)结合输入输出流读写文件
读取一个文件中的内容,然后将读取到的内容写到另一个文件中即可。
这里的BufferedInputStream与BufferedOutputStream是带有缓冲区的输入输出流,效率比较高。
在使用BufferedInputStream与BufferedOutputStream时,需要将FileInputStream和FileOutputStream包裹起来;因为不能直接使用缓冲输入输出流。
package io;import java.io.*;public class copyContent {public static void main(String[] args) {copyContent();}public static void copyContent(){//这里我使用的是当前项目下的相对路径下的文件,如果文件不存在,则会直接出现异常try(BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("../javaweb/io/t.txt"));BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("../javaweb/io/t2.txt"))) {//将t.txt中读取到的内容写入到t2.txt中byte[] buf = new byte[1024];//保存从t.txt中读取的内容int len;//读取的长度while((len=bufferedInputStream.read(buf)) != -1) {bufferedOutputStream.write(buf, 0,len);//从0开始到读取len个字节bufferedOutputStream.flush();//刷新缓冲区}} catch (IOException e) {e.printStackTrace();}}
}
四.输入输出流的总结
- 对于Reader和Writer来说主要是处理文本类型的输入输出流的。
- 而InputStream和OutputStream主要是处理二进制类型文件的输入输出(主要是指图片和视频)。
- 其中这两种输入输出流都有带有缓冲区的输入输出流类。