分类:
- 按流向:输入流、输出流
- 按数据单位:字节流(byte)、字符流(char)
- 按功能:节点流(低级,直接面向数据源)、功能流(高级,针对节点流的封装)
File类
描述:用于描述一个计算机文件/文件夹的信息,并提供相关文件的操作
常用的构造方法:
- File(String c):根据文件/文件夹的路径创建File对象
- File(String parent,String child):根据父目录的路径+子文件的路径创建File对象
- File(File parent,String child):根据父目录的File对象+子文件的路径创建File对象
常用方法:

例:
获取目录下所有的文件名 ```java String path = “D:\study”; File file = new File(path);
//如果不存在,就结束 if (!file.exists()) { return;//方法结束 } //如果存在,就输出名字 if (file.isFile()) { System.out.println(file.getName()); return; } print(file); }
public static void print(File file) { //获得目录的子文件,子目录的数组 File[] files = file.listFiles(); if (files == null) { return; } for (File f : files) { //要么是文件 if (f.isFile()) { System.out.println(f.getName()); } else { //要么是目录 print(f);//传递一个目录下去 } } }
2. 递归获取某路径下的所有文件,文件夹,并输出```javapublic static void main(String[] args) {//路径 这里写一个路径进去String path="D:\study";//调用方法getFiles(path);}public static void getFiles(String path) {File file = new File(path);// 如果这个路径是文件夹if (file.isDirectory()) {// 获取路径下的所有文件File[] files = file.listFiles();for (int i = 0; i < files.length; i++) {// 如果还是文件夹 递归获取里面的文件 文件夹if (files[i].isDirectory()) {System.out.println("目录:" + files[i].getPath());getFiles(files[i].getPath());} else {System.out.println("文件:" + files[i].getPath());}}} else {System.out.println("文件:" + file.getPath());}}
字节流
- 描述:以字节单位进行传输
FileOutputStream:字节输出流/写入流
常用构造方法:
- new FileOutputStream(String path):通过路径创建会覆盖原内容的输出流对象,目录不存在时无法创建。
- new FileOutputStream(String path,true):不会覆盖原内容,在原内容后追加
- new FileOutputStream(String path):通过File对象会覆盖原内容的输出流对象,目录不存在时无法创建。
- new FileOutputStream(File file,true):不会覆盖原内容,在原内容后追加
常用方法:
- void write(int) :写出ASCII码为参数的字符
- void write(byte[]): 将一个字节数组写出
- void write(byte[],int start,int len):写出字节数组从start开始到len的内容
例:
字节流写入public static void main(String[] args) throws IOException{String path="D\\read.txt";String songs="🍕";//创建流FileOutputStream fos=new FileOutputStream(path);byte[] datas=songs.getBytes();//将字符串变为字节数组fos.write(datas);//写入fos.close;//关闭流}
FileInputStream:字节输入流/读取流
- 描述:创建一个输入流对象时,就建立的文件到程序之间的管道。从流中取出一些数据后,数据就不存在于流中
- 构造方法:
- new FileInputStream(String path):通过文件物理路径创建输入流
- new FileInputStream(File file):通过File对象创建输入流
常用方法
- int read() :读取一个字节,返回这个字节的ASCII码值
- int read(byte[]) :读取最多为参数数组长度的字节数,返回真正的字节数
例:
文件读取
public static void main(String[] args) throws IOException {File file = new File("D:\\read.txt");FileInputStream fis = new FileInputStream(file);//一次读一个字节,从头读到尾//for (int i = 0; i < file.length(); i++) {// //每次读取一个字节,返回其ASCII值// int c = fis.read();// System.out.println((char) c);//}//创建字符缓冲区,每次最多读取缓冲区长度的字节数byte[] bytes = new byte[1024];int l = 0;while ((l = fis.read(bytes)) != -1) {System.out.println(new String(bytes, 0, l));}//关闭流fis.close();}
文件复制
public static void main(String[] args) throws IOException {String target = "D:\\1.jpg";String to = "D:\\11.jpg";FileInputStream fis = new FileInputStream(target);//创建读取对象FileOutputStream fos = new FileOutputStream(to);//创建写入对象//操作流(思路:边读,边写)byte[] datas = new byte[1024];int length = -1;//保存每次读取了多少字节while ((length = fis.read(datas)) != -1) {fos.write(datas, 0, length);//将实际读取到的数据写入目标文件中}//关闭流fis.close();fos.close();}
字符流
- 描述:适用于操作文本文件
FileReader:字符输入流
构造方法:
- new FileReader(String path):根据路径创建字符输出流
- new FileReader(File file):根据File对象创建字符输出流
常用方法
- int read():每次读取一个字符,返回其ASCII码值
- int read(char[]):每次最多读取缓冲区数据长度的字符,返回真正读取的字符数
例:读取文本
String path = "D:\\read.txt";//创建流FileReader fr = new FileReader(path);//操作流char[] datas = new char[1024];int l=0;while ((l=fr.read(datas)) != -1) {//将字符数组,转换为字符串System.out.println(new String(datas,0,l));}//关闭流fr.close();
FileWriter:字符输出流
构造方法
- new FileWrite(String path):根据路径创建字符输出流
- new FileWrite(String path,true):不会覆盖原内容,在原内容后追加
- new FileWrite(File file):根据File对象创建字符输出流
- new FileWrite(File file,true)不会覆盖原内容,在原内容后追加
常用方法
- void write(String):将一个字符串的所有字符写入到文件中
- void write(String,int start,int length):将一个字符串从start到length的内容输出
- void write(char[]):将一个字符数组的所有字符写到文件中
- void write(char[],int start,int length):将一个字符数组的从start位 开始后面length长度的字符写到文件中
- void write(int):将ASCI码对应的字符写到文件中
例:字符写入
public static void main(String[] args) throws IOException {String path = "D:\\read.txt";String str = "我是个大傻逼";char[] cs = str.toCharArray();FileWriter fw = new FileWriter(path);fw.write(str);//字符流写出 必须要刷新或关闭写出流对象,否则不能呢正常写出fw.flush();fw.close();}
字节缓冲流
Buf**feredInputStream**:缓冲输入流,是一个装饰流
描述:一次性从硬盘中取出最大长度的数据,流中数据被取完后再从硬盘取,从而减少与硬盘的交互
构造方法
- new BufferdInputStream(InputStream is)
- new BufferdInputStream(InputStream is,int size):自定义缓冲数组长度
例:和字节流一样用法
public static void main(String[] args) throws FileNotFoundException {String path="D:\\read.txt";FileInputStream fis=new FileInputStream(path) ;java.io.BufferedInputStream bis=new java.io.BufferedInputStream(fis) ;}
BufferedOutputStream: 缓冲输出流,装饰流
描述:使用方式和FileOutputStream一致,但BufferedOutputStream在大小达到8kb时才会一次性写入文件中,从而减少与硬盘的交互。如果要手动写入,需要调用flush方法;关闭流时,系统会自动调用flush方法。
- 构造方法
- new BufferedOutputStream(OutputStream os)
- new BufferedOutputStream(OutputStream os,int size):自定义缓冲数组长度
- 构造方法
