文章目录
File常见方法和属性
属性
修饰符及类型 | 属性 | 说明 |
---|---|---|
static String | pathSeparator | 依赖于系统的路径分隔符,String 类型的表示 |
static char | pathSeparator | 依赖于系统的路径分隔符,char类型的表示 |
构造方法
方法 | 说明 |
---|---|
File(File parent, String child) | 根据父目录 + 子文件路径,创建一个新的 File 实例 |
File(String parent, String child) | 根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者 相对路径 |
File(String parent, String child) | 根据父目录 + 子文件路径,创建一个新的 File 实例,父目录用 路径表示 |
方法
返回值 | 方法名 | 说明 |
---|---|---|
String | getParent() | 返回 File 对象的父目录文件路径 |
String | getName() | 返回 FIle 对象的纯文件名称 |
String | getPath() | 返回 File 对象的文件路径 |
String | getAbsolutePath() | 返回 File 对象的绝对路径 |
String | getCanonicalPath() | 返回 File 对象的修饰过的绝对路径 |
boolean | exists() | 判断 File 对象描述的文件是否真实存在 |
boolean | isDirectory() | 判断 File 对象代表的文件是否是一个目录 |
boolean | isFile() | 判断 File 对象代表的文件是否是一个普通文件 |
boolean | createNewFile() | 根据 File 对象,自动创建一个空文件。成功创建后返 回 true |
返回值 | 方法名 | 说明 |
---|---|---|
boolean | delete() | 根据 File 对象,删除该文件。成功删除后返回 true |
void | deleteOnExit() | 根据 File 对象,标注文件将被删除,删除动作会到 JVM 运行结束时才会进行 |
String[] | list() | 返回 File 对象代表的目录下的所有文件名 |
File[] | listFiles() | 返回 File 对象代表的目录下的所有文件,以 File 对象表示 |
boolean | mkdir() | 创建 File 对象代表的目录 |
boolean | mkdirs() | 创建 File 对象代表的目录,如果必要,会创建中间目录 |
boolean | renameTo(File dest) | 进行文件改名,也可以视为我们平时的剪切、粘贴操 作 |
boolean | canRead() | 判断用户是否对文件有可读权限 |
boolean | canWrite() | 判断用户是否对文件有可写权限 |
观察下面的代码:
示例一:
import java.io.File;
import java.io.IOException;
public class Demo1 {
public static void main(String[] args) throws IOException {
File file = new File("./test.txt");
System.out.println(file.getName());//返回file对象的纯文件名
System.out.println(file.getParent());//返回file对象的父目录文件路径
System.out.println(file.getPath());//返回file对象的文件路径
System.out.println(file.getAbsolutePath());//返回file对象的绝对路径
System.out.println(file.getCanonicalPath());//返回file对象的修饰过的绝对路径
}
}
示例二:
import java.io.File;
import java.io.IOException;
public class Demo2 {
public static void main(String[] args) throws IOException {
File file = new File("d:/test.txt");
System.out.println(file.exists());//判断file对象描述的文件是否真实存在
System.out.println(file.isDirectory());//判断file对象是否是一个目录
System.out.println(file.isFile());//判断file对象是否是一个普通文件
//创建一个text文件
boolean newFile = file.createNewFile();
System.out.println("newFile = "+newFile);
System.out.println(file.exists());
System.out.println(file.isDirectory());
System.out.println(file.isFile());
}
}
示例三:
import java.io.File;
public class Demo3 {
public static void main(String[] args) throws InterruptedException {
File file = new File("d:/test.txt");
// boolean delete = file.delete();//删除file文件 成功则返回true
// System.out.println(delete);
//进程结束后删除file
file.deleteOnExit();
Thread.sleep(5000);//5秒后删除创建的test.txt
}
}
示例四:
import java.io.File;
import java.util.Arrays;
public class Demo4 {
public static void main(String[] args) {
File file = new File("d:/");
//返回file对象代表的的目录下所有的文件名 (包括一些隐藏的文件)
String[] fs = file.list();
System.out.println(Arrays.toString(fs));
}
}
示例五:
import java.io.File;
public class Demo5 {
public static void main(String[] args) {
File file = new File("d:/aaa/bbb/ccc");
//创建file对象代表的目录
boolean mkdirs = file.mkdirs();
System.out.println(mkdirs);
}
}
示例六:
import java.io.File;
public class Demo6 {
public static void main(String[] args) {
//源文件
File srcFile = new File("d:/test.txt");
//目标文件
File destFile = new File("d:/test1.txt");
//将源文件名改成目标文件
boolean renameTo = srcFile.renameTo(destFile);
System.out.println(renameTo);
}
}
示例七:
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class Demo7 {
public static void main(String[] args) {
try (Writer writer = new FileWriter("d:/test1.txt",true)){
//直接使用write写入数据
writer.write("计算机操作系统IO");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
InputStream
InputStream 是一个抽象类,要使用还需要具体的实现类。关于 InputStream 的实现类有很多,基本可以认为不同的输入设备都可以对应一个 InputStream 类,我们现在只关心从文件中读取,所以使用 FileInputStream。
方法
返回值 | 方法名 | 说明 |
---|---|---|
int | read() | 读取一个字节的数据,返回 -1 代表已经完全读完了 |
int | read(byte[] b) | 最多读取 b.length 字节的数据到 b 中,返回实际读到的数 量;-1 代表以及读完了 |
int | read(byte[] b, int off, int len) | 最多读取 len - off 字节的数据到 b 中,放在从 off 开始,返 回实际读到的数量;-1 代表以及读完了 |
void | close() | 关闭字节流 |
FileInputStream
构造方法
方法名 | 说明 |
---|---|
FileInputStream(File file) | 利用 File 构造文件输入流 |
FileInputStream(String name) | 利用文件路径构造文件输入流 |
示例八:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class Demo8 {
public static void main(String[] args) {
try (InputStream inputStream = new FileInputStream("d:/test1.txt")) {
byte[] buffer = new byte[1024];
int read = inputStream.read(buffer);
System.out.println(read);
for (int i = 0; i < read; i++) {
System.out.printf("%x\n",buffer[i]);//以十六进制打印文件里的内容
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
示例九:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class Test {
// 需要先在项目目录下准备好一个 test1.txt 的文件 里面填充 "Hello"
public static void main(String[] args) throws IOException {
try (InputStream is = new FileInputStream("d:/test1.txt")) {
while (true) {
int b = is.read();
if (b == -1) {
break;
}
System.out.printf("%c", b);
}
}
}
}
示例十:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class Test {
// 需要先在项目目录下准备好一个 test1.txt 的文件 里面填充 "Hello"
public static void main(String[] args) throws IOException {
try (InputStream is = new FileInputStream("d:/test1.txt")) {
byte[] buf = new byte[1024];
int len;
while (true) {
len = is.read(buf);
if (len == -1) {
break;
}
for (int i = 0; i < len; i++) {
System.out.printf("%c", buf[i]);
}
// 每次使用 3 字节进行utf8解码 得到中文字符利用 String 中的构造方法完成
// for (int i = 0; i < len; i+=3) {
// String s = new String(buf, i, 3, "UTF-8");
//System.out.printf("%s", s);
}
}
}
}
}
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
public class Test {
public static void main(String[] args) throws IOException {
try (InputStream is = new FileInputStream("d:/test1.txt")) {
try (Scanner scanner = new Scanner(is, "UTF-8")) {
while (scanner.hasNext()) {
String s = scanner.next();
System.out.print(s);
}
}
}
}
}
OutputStream
OutputStream 同样只是一个抽象类,要使用还需要具体的实现类。我们现在还是只关心写入文件中,所以使用 FileOutputStream。
返回值 | 方法名 | 说明 |
---|---|---|
void | write(int b) | 写入要给字节的数据 |
void | write(byte[] b) | 将 b 这个字符数组中的数据全部写入 os 中 |
int | write(byte[] b, int off, int len) | 将 b 这个字符数组中从 off 开始的数据写入 os 中,一共写 len 个将 b 这个字符数组中从 off 开始的数据写入 os 中,一共写 len 个 |
void | close() | 关闭字节流 |
void | flush() | I/O 的速度是很慢的,所以,大多的 OutputStream 为 了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的 一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写 入设备中,这个区域一般称为缓冲区。但造成一个结果,就是我们写的数据,很可能会遗留一部分在缓冲区中。需要在最后或者合适的位置, 调用 flush(刷新)操作,将数据刷到设备中。 |
利用 OutputStreamWriter 进行字符写入
示例一:
import java.io.*;
public class Test {
public static void main(String[] args) throws IOException {
try (OutputStream os = new FileOutputStream("d:/test1.txt")) {
os.write('H');
os.write('e');
os.write('l');
os.write('l');
os.write('o');
os.flush();
}
}
}
示例二:
import java.io.*;
public class Test {
public static void main(String[] args) throws IOException {
try (OutputStream os = new FileOutputStream("d:/test1.txt")) {
byte[] b = new byte[]{
(byte) 'H', (byte) 'e', (byte) 'l', (byte) 'l',(byte) 'o'
};
os.write(b);
os.flush();
}
}
}
示例三:
import java.io.*;
public class Test {
public static void main(String[] args) throws IOException {
try (OutputStream os = new FileOutputStream("d:/test1.txt")) {
byte[] b = new byte[]{
(byte) 'G', (byte) 'o', (byte) 'o', (byte) 'd', (byte) 'B',
(byte) 'a', (byte) 'd'
};
os.write(b, 0, 4); //Good
os.flush();
}
}
}
示例四:
import java.io.*;
public class Test {
public static void main(String[] args) throws IOException {
try (OutputStream os = new FileOutputStream("d:/test1.txt")) {
String s = "hello word";
byte[] b = s.getBytes();
os.write(b);
os.flush();
}
}
}
示例五:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
public class Test {
public static void main(String[] args) {
try (OutputStream outputStream = new FileOutputStream("d:/test1.txt",true)) {
//把字节流转为字符流
PrintWriter printWriter = new PrintWriter(outputStream);
printWriter.println("hello");
//把写在缓冲区的数据冲入内存
printWriter.flush();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
总结
按字节读取数据
try (InputStream is = new FileInputStream("d:/test1.txt")) {
byte[] buf = new byte[1024];
int n;
while (true) {
n = is.read(buf);
if (n == -1) {
break;
}
// 处理读取到的数据
}
}
按字节写入数据
try (OutputStream os = new FileOutputStream("d:/test1.txt")) {
byte[] buf = new byte[1024];
while (/* 还有未完成的业务数据 */) {
// 将业务数据填入 buf 中,长度为 n
int n = ...;
os.write(buf, 0, n);
}
// 进行数据刷新操作
os.flush();
}
按字符读取数据
try (InputStream is = new FileInputStream("d:/test1.txt")) {
try (Scanner scanner = new Scanner(is, "UTF-8")) {
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
// 对line进行操作
}
}
}
按字符写入数据
try (OutputStream os = new FileOutputStream("d:/test1.txt")) {
try (OutputStreamWriter osWriter = new OutputStreamWriter(os, "UTF-8")) {
try (PrintWriter writer = new PrintWriter(osWriter)) {
while (/* 还有未完成的业务数据 */) {
writer.println(...);
}
// 进行数据刷新操作
writer.flush();
}
}
}