目录
- File类
- IO流原理及流的分类
- FileReader读入数据的操作
- FileWriter写出数据的操作
- FileInputStream和FileOnputStream复制文件操作
- BufferedInputStream和BufferedOutputStream复制文件操作
- BufferedReader和BufferedWriter复制文本文件操作
- 获取文本上字符出现的次数
- 转换流InputStreamReader和OutputStreamWriter
- 标准输入输出流
- 打印流PrintStream和PrintWriter
- 对象流ObjectInputStream和ObjectOutputStream
- 多线程搜索文件的关键字
File类
java.io.File 类能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。如果需要访问文件内容,则需要使用输入流/输出流。
想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。
File类的常用构造器
若硬盘中有一个真实存在的文件或目录,创建File对象时,各个属性会显式赋值。当硬盘中没有真实的文件或目录对应时,那么创建File对象时,除了指定的目录和路径之外,其他的属性都是取成员变量的默认值。
//以pathname为路径创建File对象,可以是绝对路径或相对路径
public File(String pathname)
//以parent为父路径,child为子路径创建File对象
public File(String parent, String child)
//关于一个父File对象,child为子路径创建File对象
public File(File parent, String child)
//以URI对象创建File对象
public File(URI uri)
路径中的每级目录之间用一个路径分割符隔开。在Windows下默认使用 “ \ ”,在UNIX和Linux下默认使用 “ / ”。Java提供一个常量File.separator,根据操作系统动态提供分隔符。
File file1 = new File("D:\\Java\\File");
File file2 = new File("D:"+File.separator+"Java"+File.separator+"File");
File file3 = new File("D:/Java/File");
此时的file1对象是在内存层面的,在硬盘中不一定存在。
File类的常用方法
|——public String getAbsolutePath():获取绝对路径
|——public String getPath():获取路径
|——public String getName():获取名称
|——public String getParent():获取上层文件目录路径,若无返回null
|——public long length():获取文件字节数,不能获取目录的字节数
|——public long lastModified():获取最后一次修改时间(毫秒值)
|——public String[] list():获取指定目录下的所有文件或文件目录的名称数组
|——public File[] listFiles():获取指定目录下的所有文件或文件目录的File数组
|——public boolean renameTo(File dest):文件重命名(源文件在硬盘必须存在,目标文件不能在硬盘存在)
File——|——public boolean isDirectory():判断是否是文件目录
|——public boolean isFile():判断是否是文件
|——public boolean exists():判断是否是存在
|——public boolean canRead():判断是否可读
|——public boolean canWrite():判断是否可写
|——public boolean isHidden():判断是否隐藏
|——public boolean createNewFile():创建文件。若文件存在,则不创建,返回false
|——public boolean mkdir():创建文件目录。若此文件目录存在,则不创建。若其上层目录不存在,也不创建
|——public boolean mkdir():创建文件目录。若此文件目录存在,则不创建。若其上层目录不存在,一并创建
|——public boolean delete():删除文件或文件夹(如果文件夹内有文件则删除失败)
File类的使用
1. 将指定目录下的 .jpg 文件重命名:
File[] files =new File("D:\\Java\\eclipse-workspace\\study").listFiles();
StringBuilder builder = new StringBuilder("图片1.jpg");
int i = 1;
for(File file : files) {
//遍历目录下的文件
if(file.isFile()) {
if(file.getName().endsWith(".jpg")) {
file.renameTo(new File(builder.toString())); //重命名
builder.delete(2, builder.length());
builder.append(++i+".jpg");
}
}
}
2. 遍历指定目录下的所有文件和文件夹,并输出文件数、文件夹数、总大小:
import java.io.File;
public class FileTest {
private static int fileNum = 0; // 文件数
private static int folderNum = 0; // 文件夹数
private static int total = 0; // 总大小
public static void search(File[] folder) {
for (File file : folder) {
if (file.isFile()) {
//文件
fileNum++;
total += file.length();
} else {
//文件夹
folderNum++;
search(file.listFiles()); //深度遍历
}
}
}
public static void main(String[] args) {
search(new File("C:\\Users\\HP\\Desktop").listFiles());
System.out.println("文件数:" + fileNum);
System.out.println("文件夹数:" + folderNum);
System.out.println("总大小:" + total + " kb");
}
}
运行结果:
文件数:1346
文件夹数:142
总大小:1525166593 byte
IO流原理及流的分类
I/O的Input/Output的缩写,在Java程序中,对于数据的输入/输出操作以“流”(stream)的方式进行。
输入Input:读取外部数据(磁盘等存储设备)的数据到程序(内存)。
输出Output:将程序(内存)数据输出到硬盘等存储设备中。
流的分类:
按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)
按数据流的流向不同分为:输入流,输出流
按流的角色的不同分为:节点流,处理流
Java的IO共涉及多个类,实际上都是从上面4个抽象基类派生,由这4个类派生出来的子类名称都是以其父类名作为子类名的后缀,如FileInputStream,BufferedReader,PrintWriter等等。
字节流适用于非文本文件(.jpg、.mp3、.mp4、.avi、.doc、.ppt……);字符型适用于文本文件(.txt、.java、.c……)。不能使用字符流来处理图片等文件。
我们称FileInputStream、FileOutputStream、FileReader、FileWriter等为节点流,可以从或向一个特定的地方(节点)读写数据。而其他的流则为处理流,对一个已存在的流的连接和封装(套上),通过所封装的流的功能调用实现数据读写。
FileReader读入数据的操作
读入的文件必须存在,否则会报FileNotFoundException。
步骤:
1. 提供File对象,指明要操作的文件。
2. 提供FileReader对象,用于数据的读入。
read() 返回读入的一个字符的字节码,如果到达文件末尾则返回-1。
read(char[]) 返回读入字符的个数,字符存在数组里面,如果到达文件末尾则返回-1。
3. 进行读入操作。
4. 流资源关闭。
public static void readFile() {
File file = new File("hello.txt"); //指定要读取的文件
if (file.exists()) {
FileReader reader = null;
try {
reader = new FileReader(file);
/*方式一
int data;
while ((data = reader.read()) != -1) {
System.out.print((char) data);
}*/
//方式二
int number;
char[] ch = new char[10];
while ((number = reader.read(ch)) != -1) {
for(int i = 0;i < number; i++)
System.out.print(ch[i]);
}
} catch (FileNotFoundException e)