1.文件操作
1.1File类的作用
//java.io..File类是对存储在磁盘上的文件的信息的一个抽象表示。
//主要用于文件的创建、查找和删除。
1.2File类的使用
构造方法
public File(String pathname);//通过将给定的字符串路径名转换为抽象路径名来创建File实例
String path = "D:\\io\\test.txt";
File file = new File(path);
public File(String parent, String child);//通过给定的字符父级串路径和字符串子级路径来创建File实例
File file1 = new File("D:\\io","test.txt");
public File(File parent, String child);//通过父级抽象路径名和字符串子路径创建File实例。
File file2 = new File("D:\\io");
File file3 = new File(file2, "test.txt");
常用方法
//绝对路径:带有盘符的路径称之为绝对路径
//相对路径:不带盘符的路径称之为相对路径,相对路径是相对当前工程来定位的。
public String getAbsolutePath();//获取文件的绝对路径 absolute 绝对的
public String getName();//获取文件的名字
public String getPath();//获取文件的路径
public File getParentFile();//获取父级文件
public long length();//获取文件的大小
public long lastModified();//获取文件最后修改时间
文件相关的判断
public boolean canRead();//是否可读
public boolean canWrite();//是否可写
public boolean exists();//是否存在
public boolean isDirectory();//是否是目录
public boolean isFile();//是否是一个正常的文件
public boolean isHidden();//是否隐藏
public boolean canExecute();//是否可执行
public boolean createNewFile() throws IOException;//创建新的文件
public boolean delete();//删除文件
public boolean mkdir();//创建目录,一级
public boolean mkdirs();//创建目录,多级
public boolean renameTo(File dest);//文件重命名,重命名后,原来的文件就不存在了
文件列表相关
public File[] listFiles();//列出文件夹下所有文件
public File[] listFiles(FileFilter filter);//列出文件夹下所有满足条件的文件
1.3递归删除文件夹
删除文件夹时必须保证文件夹为空,否则将删除失败
思考:如何删除一个文件夹?
public static void deleteFolder(File folder){
if(folder.isDirectory()){//如果是文件夹就进去看,不是直接删除
File[] files = folder.listFiles();//列出文件夹下的所有文件
if (files!=null){
for (File file : files) {
if (file.isDirectory()){
deleteFolder(file);
}else {
file.delete();
}
}
}
folder.delete();
}else {
folder.delete();
}
}
2.i/0流
//io=input outout 输入输出,参照是内存
//将内容写入内存称为输入,将内存里的数据读出来称为输出。
//IO流分为字节流和字符流。字节流每次读取的基本单位是字节,一个字节8比特;
//字符流每次读取的单位是字符,一个字符串2个字节16比特。
2.1字节流
//字节流的顶层父类是 InputStream 和 OutpuStream,只要是字节流,就是这两个类的子类
//采用的字节流是文件输入输出字节流
FileInputStream , FileOutpuStream
//
OutputStream 常用方法
public abstract void write(int b) throws IOException; //写一个字节
public void write(byte b[]) throws IOException; //将给定的字节数组内容全部写入文件中
//将给定的字节数组中指定的偏移量和长度之间的内容写入文件中
public void write(byte b[], int off, int len) throws IOException;
public void flush() throws IOException;//强制将通道中数据全部写出
public void close() throws IOException;//关闭通道
InputStream 常用方法
public abstract int read() throws IOException; //读取一个字节
public int read(byte b[]) throws IOException; //读取多个字节存储至给定的字节数组中
//读取多个字节按照给定的偏移量及长度存储在给定的字节数组中
public int read(byte b[], int off, int len) throws IOException;
public void close() throws IOException;//关闭流,也就是关闭磁盘和内存之间的通道
public int available() throws IOException;//获取通道中数据的长度
字节流应用场景
Byte streams should only be used for the most primitive I/O.
字节流仅仅适用于读取原始数据(基本数据类型)
3. 字符流
//所有字符流类均来自Reader和Writer。 与字节流一样,也有专门用于文件I / O的字符流类:FileReader和FileWriter。
FileWriter 构造方法
public FileWriter(String fileName) throws IOException;//根据提供的文件路径构建一条文件输出通道
//根据提供的文件路径构建一条文件输出通道,并根据append的值决定是将内容追加到末尾还是直接覆盖
public FileWriter(String fileName, boolean append) throws IOException;
public FileWriter(File file) throws IOException;//根据提供的文件信息构建一条文件输出通道
//根据提供的文件信息构建一条文件输出通道,并根据append的值决定是将内容追加到末尾还是直接覆盖
public FileWriter(File file, boolean append) throws IOException;
FileReader 构造方法
public FileReader(String fileName) throws FileNotFoundException;//根据提供的文件路径构建一条文件输入通道
public FileReader(File file) throws FileNotFoundException;//根据提供的文件信息构建一条文件输入通道
综合练习
使用字符流实现磁盘文件拷贝功能
package com.qf.io._char;
import java.io.*;
public class Example3 {
public static void main(String[] args) {
String sourceFile = "F:\\AA\\io.txt";
String destFile = "F:\\file\\a.txt";
copyFile(sourceFile, destFile);
}
public static void copyFile(String sourceFile, String destFile){
File file = new File(destFile);
File parent = file.getParentFile();
if(!parent.exists()) parent.mkdirs();
try (Reader reader = new FileReader(sourceFile);
Writer writer = new FileWriter(file)){
char[] buffer = new char[4096];
while (true){
int len = reader.read(buffer);
if(len == -1) break;
writer.write(buffer, 0, len);
}
writer.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
字节流与字符流的区别?
1.单位不同:字节流的单位是字节,字符流的单位是字符,一个字符两个字节16个比特。
2.处理对象不同:字节流处理所有对象的类型,字符流一般只处理字符类型数据。
3.缓冲区不同:字节流在操作时本身不会用到缓冲区,是对文件本身进行处理。而字符流在操作时使用到缓冲区.
4.缓冲流
//到目前为止,我们看到的大多数示例都使用无缓冲的I / O。 这意味着每个读取或写入请求均由基础操作系统直接处理。 由于每个这样的请求通常会触发磁盘访问,网络活动或某些其他相对昂贵的操作,因此这可能会使程序的效率大大降低。
//为了减少这种开销,Java平台实现了缓冲的I / O流。 缓冲的输入流从称为缓冲区的存储区中读取数据; 仅当缓冲区为空时才调用本机输入API。 同样,缓冲的输出流将数据写入缓冲区,并且仅在缓冲区已满时才调用本机输出API。
//有四种用于包装非缓冲流的缓冲流类:BufferedInputStream和BufferedOutputStream创建缓冲的字节流,而BufferedReader和BufferedWriter创建缓冲的字符流。