文件操作:
文件操作其实就是一个FIle类;我们学习文件操作就是学习File类中的方法;
文件基操:
来个实例:
import java.io.File;
import java.io.IOException;
public class FIleDelCre {
public static void main(String[] args) throws IOException {
File file = new File("e:\\IOFileSource\\xbhog.txt");
if(file.exists()){
file.delete();
}else{
System.out.println(file.createNewFile());
}
}
}
createNewFile
:如果指定的文件不存在且已成功创建,则为True;如果指定的文件已经存在,则为False
知识点(敲黑板):
路径分隔符:解决不同操作系统下的路径符号问题(windows->“\”;Linux->“/”);
File file = new File("e:"+File.separator +"IOFileSource"+File.separator+"xbhog.txt");
注:
/**
* The system-dependent default name-separator character, represented as a
* string for convenience. This string contains a single character, namely
* {@link #separatorChar}.
*/
public static final String separator = "" + separatorChar;
对父路径操作的方法:
import java.io.File;
import java.io.IOException;
public class FIleDelCre {
public static void main(String[] args) throws IOException {
File file = new File("e:"+File.separator +"IOFileSource"+File.separator+"test"+File.separator+"demo"+File.separator+"xbhog.txt");
if(!file.getParentFile().exists()){ //如果该文件的父目录不存在
/*
file.getParentFile().mkdirs(); //进行创建多级父目录
mkdirs底层进行递归调用,实现多级目录创建
file.getParentFile().mkdir(); //进行创建一个父目录
*/
}
if(file.exists()){
file.delete();
}else{
System.out.println(file.createNewFile());
}
}
}
注:mkdirs与mkdir的区别,最好进入源码中查看
文件列表显示:
流程图:
import java.io.File;
public class FilePwd {
public static void main(String[] args) {
File file = new File("D:" + File.separator);
listDir(file);
}
public static void listDir(File file){
if(file.isDirectory()){
File[] Dirs = file.listFiles();
while(Dirs != null){
for (int i = 0; i < Dirs.length; i++) {
listDir(Dirs[i]); //递归调用
}
}
}
System.out.println(file);
}
}
文件批量更名:
情景:
在数据采集的过程中由于操作失误,使得xbhog-log文件夹下的所有文件后缀采用了.java
,为了修正这一错误,要求使得该目录下的所有文件后缀统一替换成.txt
,同时也需要考虑多级目录下的文件更名操作。
import java.io.File;
public class FIleChangeName {
public static void main(String[] args) {
File file = new File("D:" + File.separator + "xbhog-log");
renameDir(file);
}
public static void renameDir(File file){
if(file.isDirectory()){
File[] dirs = file.listFiles();
for (int i = 0; i < dirs.length; i++) {
renameDir(dirs[i]); //递归调用
}
}else {
if (file.isFile()){ //判断是否为文件
String fileName = null; //文件名称
if(file.getName().endsWith(".java")){ //判断是否以.java为结尾
fileName = file.getName().substring(0,file.getName().lastIndexOf("."))+".txt";
File newfile = new File(file.getParentFile(), fileName); //新的文件名称
file.renameTo(newfile); //重命名
}
}
}
}
}
字节流与字符流:
字节流:outputStream
以及inputStream
字符流:Writer
以及Reader
对资源操作的基本步骤:(文件为例)--严格按照下面步骤
- 如果要操作的资源是文件的话,首先需要通过File类对象找到一个要操作的文件路径
- 通过字节流或者字符流的子类为字节流或字符流的对象实例化(向上转型)
- 执行读写操作
- 关闭资源
OutputStream字节输入流
常用的类普通方法:
其常用的构造方法是:
实例:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
public class FIleOutputStearm {
public static void main(String[] args) throws IOException {
File file = new File("xbhog.txt");
if(!file.exists()){
file.createNewFile();
}
OutputStream outputStearm = new FileOutputStream(file);
String str = "欢迎来到xbhog的博客";
outputStearm.write(str.getBytes(StandardCharsets.UTF_8));
outputStearm.close();
}
}
文件内容的追加:
OutputStream stream = new FileOutputStream(file, true);
String addStr = "-----这是追加的内容------";
stream.write(addStr.getBytes());
stream.close();
InputStream字节输入流:
该类的常用方法:
读取文件的固定用法:
- 创建文件输入流---
InputStream input = new FileInputStream(file)
- 设置数据的读取缓存区----
new byte[1024]
- 读取数据,将数据读取到缓存区中并放回读取的字节个数 ----
int len = input.read(data)
- 字节转换为字符流----
new String(data,0,len)
- 关闭资源
读取文件内容实例:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class FileInputStreamTest {
public static void main(String[] args) throws IOException {
File file = new File("xbhog.txt"); // 输出文件路径
if (file.exists()) { // 文件存在
InputStream input = new FileInputStream(file);// 文件输入流
byte data[] = new byte[1024]; // 数据读取缓冲区
// 读取数据,将数据读取到缓冲区之中,同时返回读取的字节个数
int len = input.read(data);
System.out.println("【" + new String(data, 0, len) + "】");// 字节转为字符串
input.close(); // 关闭输入流
}
}
}
读取文件中的全部内容:
byte[] bytes = input.readAllBytes();
System.out.println(new String(bytes));
Writer字符流:
为了简化输出的操作,提供了Writer与Reader字符流;
该类的常用方法:
在进行文件流的写入时,需要引入Writer下的FileWriter子类;
类的项目结构:
FileWriter常用构造方法:
实例:
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class FileWriterDemo {
public static void main(String[] args) throws IOException {
File file = new File("FileWriter.txt"); // 输出文件路径
if(!file.exists()){
file.createNewFile();
}
Writer out = new FileWriter(file) ; // 实例化Writer类对象
out.write("欢迎来到xbhog"); // 输出字符串
out.write("\n");
out.append("Test\n");
out.append("www.cblog.cn/xbhog") ;// 追加输出内容
out.close();// 关闭输出流
}
}
Reader字符输入流:
该类常用的方法:
实例测试:
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class FileReaderDemo {
public static void main(String[] args) throws IOException {
File file = new File("FileWriter.txt");// 输出文件路径
if (file.exists()) {// 文件存在
Reader in = new FileReader(file); // 实例化输入流
char data[] = new char[1024]; // 缓冲区
//“欢迎没有了”
in.skip(2);// 跨过2个字符长度
int len = in.read(data); // 读取数据
System.out.println(new String(data, 0, len));
in.close();// 关闭输入流
}
}
}
转换流:
实现两者的转换操作:
将字节输入流转换成字符输入流
import java.io.*;
public class ConversionOperations {
public static void main(String[] args) throws IOException {
File file = new File("FileWriter1.txt"); // 输出文件路径
OutputStream output = new FileOutputStream(file) ;// 字节流
Writer out = new OutputStreamWriter(output) ; // 字节流转字符流
out.write("测试两者之间的转换"); // 字符流输出
out.close(); // 关闭输出流
output.close(); // 关闭输出流
}
}