File类是一个与平台无关的文件或目录
方法 | 说明 |
---|---|
File(String path) | path可以是实路径也可以是文件名 |
File(String path, String name) | path是路径名,name是文件名 |
File(File dir, String name) | dir是路径对象,name是文件名 |
方法 | 说明 |
---|---|
String getName() | 获得文件的名称,不包括路径 |
String getPath() | 获得文件的路径,包含文件名 |
String getAbsolutePath() | 获得文件的绝对路径 |
String getParent() | 获得文件的上一级目录名,等同于getPath()减去getName() |
File getParentFile() | 获得文件的上一级文件对象,等同于getPath()减去getName() |
getPath()和getAbsolutePath()区别:
方法 | 说明 |
---|---|
boolean exists() | 判断当前File对象所表示的文件是否存在 |
boolean canWrite( ) | 判断当前文件是否可写 |
boolean canRead( ) | 判断当前文件是否可读 |
boolean isFile( ) | 判断当前文件是否是文件 |
boolean isDirectory( ) | 判断当前文件是否是目录 |
方法 | 说明 |
---|---|
long lastModified() | 获得文件最近一次修改的时间 |
long length( ) | 获得文件的长度,以字节为单位 |
boolean delete( ) | 删除当前文件,成功返回 true |
boolean renameTo(File dest) | 将重新命名当前File对象所表示的文件。成功返回 true |
方法 | 说明 |
---|---|
boolean mkdir() | 创建File对象指定的目录,只能是路径 |
boolean mkdirs() | 创建File对象指定的目录,不仅仅是路径 |
String[] list() | 返回当前目录下的文件和目录,返回值是字符串数组 |
String[] list(FilenameFilter filter) | 返回当前目录下满足指定过滤器的文件和目录,参数是实现FilenameFilter接口对象,返回值是字符串数组 |
File[] listFiles() | 返回当前目录下的文件和目录,返回值是File数组 |
File[] listFiles(FilenameFilter filter) | 返回当前目录下满足指定过滤器的文件和目录,参数是实现FilenameFilter接口对象,返回值是File数组 |
File[] listFiles(FileFilter filter) | 返回当前目录下满足指定过滤器的文件和目录,参数是实现FileFilter接口对象,返回值是File数组 |
//得出文件夹下的全部路径,传入一个文件名 private static void print(File file) { if(file.isDirectory()) { File result [] =file.listFiles(); if(result !=null) {//增加文件无法访问的判断 for(int x =0;x<result.length;x++) { print(result[x]); } } } System.out.println(file); }
//如何使用mkdirs File f = new File("C:\\a\\b\\c.txt"); if(!f.exist()){ f.mkdirs();//创建路径 f.createNewFile();//创建文件 } //结果:创建C:\\a\\b\\c.txt //如何使用mkdir() File f = new File("C:\\a\\b"); if(!f.exist()){ f.mkdir();//创建路径 } //结果:创建C:\\a\\b
对目录操作有两个过滤器接口:FilenameFilter和FileFilter。它们都只有一个抽象方法accept
FilenameFilter接口中的accept方法如下:
FileFilter接口中的accept方法如下:
注意 路径中会用到路径分隔符,路径分隔符在不同平台上是有区别的,UNIX、Linux和macOS
中使用正斜杠“/”,而Windows下使用反斜杠“\”。Java是支持两种写法,但是反斜杠“\”属于特殊字符,前面需要加转义符。例如C:\Users\a.java在程序代码中应该使用C:\Users\a.java表示,或表示为C:/Users/a.java也可以。**
8位,文件是图片等类型,用字节流
输入流 | 说明 |
---|---|
FileInputStream | 文件输入流 |
ByteArrayInputStream | 面对字节组的输入流 |
PipedInputStream | 管道输入流,用于两个线程之间的数据传递 |
FilterInputStream | 过滤输入流,它是一个装饰器拓展输入流 |
BufferedInputStream | 缓冲区输入流,是FilterInputStream子类 |
DataInputStream | 面向基本数据类型的输入流,是FilterInputStream子类 |
输入流 | 说明 |
---|---|
FileOutputStream | 文件输出流 |
ByteArrayOutputStream | 面对字节组的输出流 |
PipedOutputStream | 管道输出流,用于两个线程之间的数据传递 |
FilterOutputStream | 过滤输出流,它是一个装饰器拓展输入流 |
BufferedOutputStream | 缓冲区输出流,是FilterInputStream子类 |
DataOutputStream | 面向基本数据类型的输出流,是FilterInputStream子类 |
16位Unicode,纯文本使用字符流
输入流 | 说明 |
---|---|
FileReader | 文件输入流 |
CharArrayReader | 面对字节组的输入流 |
PipedReader | 管道输入流,用于两个线程之间的数据传递 |
FilterReader | 过滤输入流,它是一个装饰器拓展输入流 |
BufferedReader | 缓冲区输入流,是FileReader的子类 |
InputStreamReader | 将字节流转换为字符流,是FileReader的父类 |
输入流 | 说明 |
---|---|
FileWriter | 文件输出流 |
CharArrayWriter | 面对字节组的输出流 |
PipedWriter | 管道输出流,用于两个线程之间的数据传递 |
FilterWriter | 过滤输出流,它是一个装饰器拓展输入流 |
BufferedWriter | 缓冲区输出流,是FileReader的子类 |
InputStreamWriter | 将字节流转换为字符流,是FileReader的父类 |
掌握字节流的API先要熟悉它的两个抽象类InputStream 和OutputStream,了解它们有哪些主要的方法。
InputStream是字节输入流的根类,它定义了很多方法,影响着字节输入流的行为。下面详细介绍一
下。
InputStream主要方法如下:
上述所有方法都会抛出IOException,使用时要注意
OutputStream是字节输出流的根类,它定义了很多方法,影响着字节输出流的行为。下面详细介绍一
下。
上述所有方法都声明抛出IOException,因此使用时要注意。
案例:文件复制
FileInputStream构造方法主要有:
FileOutputStream构造方法主要有:
构造方法 | 说明 |
---|---|
FileInputStream(File file) | 通过文件对象创建一个文件输入流对象 |
FileInputStream(String path) | 通过文件绝对路径创建一个文件输入流对象 |
//使用该方法,可以先进行文件的检查和创建的操作 File f = new File("C:\\A\\B\\C.txt"); InputStream in1 = new FileInputStream(f); InputStream in2 = new FileInputStream("C:\\A\\B\\C.txt");
构造方法 | 说明 |
---|---|
FileInputStream(File file) | 通过文件对象创建一个文件输入流对象 |
FileInputStream(String filePath) | 通过文件绝对路径创建一个文件输入流对象 |
FileOutputStream(String filePath, boolean append) | append为true时,文件可以追加内容,从末尾写入 |
//使用该方法,可以先进行文件的检查和创建的操作 File f = new File("C:\\A\\B\\C.txt"); OutputStream in1 = new FileOutputStream(f); OutputStream in2 = new FileOutputStream("C:\\A\\B\\C.txt");
String pathName = "d:/test.txt"; File f = new File(pathName); InputStream in = new FileInputStream(f); byte[] b = new byte[(int)f.length()]; in.read(b); System.out.println(new String (b,"UTF-8" ));
下面介绍如果将./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(); }