文件操作和IO
一、Java中操作文件
Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述。注意,有 File 对象,并不代表真实存在该文件。
1.1File常见属性
1.2File常见构造方法
示例:
import java.io.File;
public class FileDemo1 {
public static void main(String[] args) {
File pFile = new File("d:\\");
//构造方法1
File file = new File(pFile, "a.txt");
System.out.println(file.getPath());
//构造方法2【重点-常用】
File file2 = new File("d:\\b.txt");
System.out.println("文件2路径:" + file2.getPath());
//构造方法3
File file3 = new File("d:\\", "c.txt");
System.out.println(file3.getPath());
}
}
2.3常用方法
2.3.1观察get系列的特点和差异
import java.io.File;
import java.io.IOException;
public class FileDemo2 {
public static void main(String[] args) throws IOException {
File file = new File("../a.txt");
System.out.println("文件名称:" + file.getName());
System.out.println("文件目录(getPath):" + file.getPath());
System.out.println("文件绝对路径:" + file.getAbsolutePath());
System.out.println("文件标准路径:" + file.getCanonicalPath());
}
}
1.绝对路径时,三者⼀致。
2.相对路径时:
getPath() 是相对路径本身。
getAbsolutePath() 是项目目录 + 相对路径本身。
getCanonicalPath() 可以解析相对路径,得到争取的路径。
2.3.2文件判断与创建
import java.io.File;
import java.io.IOException;
public class FileDemo3 {
public static void main(String[] args) throws IOException {
File file = new File("z.txt");
System.out.println("文件是否存在:" + file.exists());
System.out.println("是否为文件夹:" + file.isDirectory());
System.out.println("是否为文件:" + file.isFile());
System.out.println();
boolean result = file.createNewFile(); //创建文件
System.out.println("文件创建:" + result);
System.out.println("文件是否存在:" + file.exists());
System.out.println("是否为文件夹:" + file.isDirectory());
System.out.println("是否为文件:" + file.isFile());
System.out.println();
File file2 = new File("c.txt");
if(!file2.exists()) { //文件不存在,创建文件
System.out.println("创建文件:" + file2.createNewFile());
}
System.out.println("是否为文件夹:" + file2.isDirectory());
System.out.println("是否为文件:" + file2.isFile());
}
}
如果文件或文件夹不存在,使用 isDirectory 和 isFile 判断都为 false.
2.3.3文件存在删除/不存在创建
import java.io.File;
import java.io.IOException;
public class FileDemo4 {
public static void main(String[] args) throws IOException {
//先得到一个file对象
File file = new File("a.txt");
//判断file对象是否存在
if(file.exists()) {
//如果存在则删除文件
boolean result = file.delete();
System.out.println("文件删除:" + result);
} else {
//如果不存在则创建文件
boolean result = file.createNewFile();
System.out.println("新建文件:" + result);
}
}
}
二、文件内容的读写(数据流)
2.1InputStream输入流
InputStream输入流是用来读取数据的
2.1.1 InputStream常用方法
InputStream 只是⼀个抽象类,要使用还需要具体的实现类。关于 InputStream 的实现类有很多,基本可以认为不同的输⼊设备都可以对应⼀个 InputStream 类,我们现在只关心从文件中读取,所以使用 FileInputStream。
2.1.2 FileInputStream
构造方法
读取文件中的内容:
方式1:每次只能读取一个字符
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class InputStreamDemo1 {
public static void main(String[] args) {
//1.创建流对象 try-catch
InputStream inputStream = null;
try {
inputStream = new FileInputStream("c.txt");
//2.读写操作
while(true) {
int c = inputStream.read();
//如果流返回的是-1,说明数据已经读取完了
if(c == -1) break;
Thread.sleep(200);
System.out.printf("%c", c);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException exception) {
exception.printStackTrace();
} finally {
//3.关闭流
if(inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
改进版:在JDK1.7之后可以使用try-catch-resource
import java.io.FileInputStream;
import java.io.InputStream;
public class InputStreamDemo2 {
public static void main(String[] args) {
//1.创建流对象 try-catch-resource(诞生于JDK1.7)
try(InputStream inputStream = new FileInputStream("c.txt")) {
//2.读写操作
while(true) {
int c = inputStream.read();
//如果流返回的是-1,说明数据已经读取完了
if(c == -1) break;
Thread.sleep(200);
System.out.printf("%c", c);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
方式2:可以将字符一次性全部读取出来
import java.io.FileInputStream;
import java.io.InputStream;
/**
* 一次性读取
*/
public class InputStreamDemo3 {
public static void main(java.lang.String[] args) {
try(InputStream inputStream = new FileInputStream("c.txt")) {
byte[] bytes = new byte[1024];
while(true) { //如果数据超过了byte容量,会读取多次
int c = inputStream.read(bytes);
if(c == -1) break;
Thread.sleep(200);
System.out.println(new String(bytes, "utf-8"));
}
} catch (Exception e) {
}
}
}
2.1.3使用scanner进行数据读取
import java.io.FileInputStream;
import java.util.Scanner;
public class InputStreamDemo4 {
public static void main(String[] args) {
try(FileInputStream inputStream = new FileInputStream("c.txt")) {
try(Scanner scanner = new Scanner(inputStream, "utf8")) {
while(scanner.hasNext()) {
System.out.println(scanner.nextLine());
}
}
} catch (Exception e) {
}
}
}
2.2OutputStream:输出流
OutputStream输出流,是进行数据写入的
2.2.1OutputStream常用方法
OutputStream 同样只是⼀个抽象类,要使⽤还需要具体的实现类。我们现在还是只关心写入文件中,所以使用FileOutputStream。
2.2.2 FileOutputStream
示例一:每次写入一个数据
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
* 写入,每次写入一个字符
*/
public class OutputStreamDemo1 {
public static void main(String[] args) throws IOException {
File file = new File("mytest.txt");
if(!file.exists()) {
//新建文件
System.out.println("新建文件:" + file.createNewFile());
}
//文件写入操作
try(OutputStream outputStream = new FileOutputStream(file)) {
outputStream.write('H');
outputStream.write('e');
outputStream.write('l');
outputStream.write('l');
outputStream.write('o');
outputStream.flush();
}
}
}
示例二:每次按批量进行数据写入
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class OutputStreamDemo2 {
public static void main(String[] args) throws IOException {
File file = new File("mytest.txt");
if(!file.exists()) {
file.createNewFile();
}
//写入操作
try(OutputStream outputStream = new FileOutputStream(file)) {
byte[] bytes = new byte[]{
'H', 'i'
};
outputStream.write(bytes);
outputStream.flush();
}
}
}
示例二另一个版本:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
public class OutputStreamDemo3 {
public static void main(String[] args) throws IOException {
File file = new File("mytest.txt");
if(!file.exists()) {
file.createNewFile();
}
//写入操作
try(OutputStream outputStream = new FileOutputStream(file)) {
String msg = "hello, world";
outputStream.write(msg.getBytes(StandardCharsets.UTF_8));
outputStream.flush();
}
}
}
2.2.3使用PrintWriter进行写入
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
public class OutputStreamDemo4 {
public static void main(String[] args) throws IOException {
File file = new File("mytest.txt");
if(!file.exists()) file.createNewFile();
try(PrintWriter printWriter = new PrintWriter(file)) {
printWriter.println("这是第一行数据");
printWriter.println("这是第二行数据");
printWriter.printf("我叫:%s,今年:%d,至今未婚", "张三", 22);
printWriter.flush();
}
}
}
以上数据写入方式,都会进行数据的覆盖
2.2.4 使用FileWriter追加数据
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class OutputStreamDemo4 {
public static void main(String[] args) throws IOException {
File file = new File("mytest.txt");
if(!file.exists()) file.createNewFile();
//数据追加
try(FileWriter fileWriter = new FileWriter(file, true)) {
fileWriter.append("我是追加的数据II\n");
fileWriter.flush();
}
}
}