文章目录
文件操作——IO
(一)java中操作文件
1.File对象
构造File对象:
构造的过程中,可以使用绝对路径或者相对路径进行初始化,这个路径指向的文件可以是真实存在的,也可以是不存在的。
File类中的常见属性:
修饰符及类型 | 属性 | 说明 |
---|---|---|
static String | pathSeparator | 依赖于系统的路径分隔符,String 类型的表示 |
static char | pathSeparator | 依赖于系统的路径分隔符,char 类型的表示 |
2.File类方法
File类的构造方法:
签名 | 说明 |
---|---|
File(File parent, Stringchild) | 根据父目录+孩子文件路径,创建一个新的File实例 |
File(String pathname) | 根据文件路径创建一个新的File实例,路径可以是绝对路径或相对路径。 |
File(String parent, Stringchild) | 根据父目录 + 孩子文件路径,创建一个新的 File 实例,父目录用路径表示。 |
比如我需要再java中表示D盘下的test.txt文件可以这样写:
public static void main(String[] args) throws IOException {
File file = new File("D:/test.txt");
}
这样无论这个文件是否存在File类都可以表示。
File类的方法:
返回值类型 | 方法签名 | 说明 |
---|---|---|
String | getParent() | 返回 File 对象的父目录文件路径 |
String | getName() | 返回 FIle 对象的纯文件名称 |
String | getAbsolutePath() | 返回 File 对象的绝对路径 |
String | getPath() | 返回 File 对象的文件路径 |
String | getCanonicalPath() | 返回 File 对象的修饰过的绝对路径 |
boolean | exists() | 判断 File 对象描述的文件是否真实存在 |
boolean | isDirectory() | 判断 File 对象所描述的文件是否是一个目录 |
boolean | isFile() | 判断 File 对象所描述的文件是否我是一个普通文件 |
boolean | delete() | 根据 File 对象, 删除该文件 |
boolean | createNewFile() | 根据 File 对象, 自动创建一个空文件 |
void | deleteOnExist() | 根据 File 对象, 删除该文件, 删除动作会在 JVM 运行结束时进行 |
String[] | list() | 返回 File 对象所代表目录下的所有文件名 |
File[] | listFiles() | 返回 File 对象所代表的目录下所有的文件, 以 File 对象表示 |
boolean | mkdir() | 创建 File 对象所代表的目录 |
boolean | mkdirs() | 创建 File 对象所代表的多级目录 |
boolean | renameTo(File dest) | 进行文件的重命名 |
boolean | canRead() | 判断该用户是否对文件有可读权限 |
boolean | canWrite() | 判断该用户是否对文件有可写权限 |
3.代码实例
实例1:get方法系列的特点和差异
public class IODemo1 {
public static void main(String[] args) throws IOException {
File file = new File("./test.txt");
System.out.println(file.getName());
System.out.println(file.getParent());
System.out.println(file.getPath());
System.out.println(file.getAbsolutePath());
System.out.println(file.getCanonicalPath());
}
}
这里不要求文件test.txt存在
实例2:普通文件的创建
public class IODemo2 {
public static void main(String[] args) throws IOException {
File file = new File("./test.txt");
file.createNewFile();
System.out.println(file.exists());
System.out.println(file.isFile());
System.out.println(file.isDirectory());
}
}
实例3:普通文件的删除
public class IODemo3 {
public static void main(String[] args) {
File file = new File("./test.txt");
System.out.println(file.exists());
file.delete();
System.out.println(file.exists());
}
}
这里可以看到两个日志一个是删除前查看文件是否存在,结果为true一个删除后查看文件是否存在结果为false。
实例4:目录创建
public class IoDemo4 {
public static void main(String[] args) {
File dir = new File("./test/aaa/b");
System.out.println(dir.isDirectory());
dir.mkdirs();
System.out.println(dir.isDirectory());
}
}
实例5:文件重命名
public class IODemo5 {
public static void main(String[] args) {
File file = new File("./test");
File dest = new File("./testBBB");
System.out.println(file.isDirectory());
System.out.println(dest.isDirectory());
file.renameTo(dest);
System.out.println(file.isDirectory());
System.out.println(dest.isDirectory());
}
}
可以看到第一目录test被修改为乐testBBB,并且日志结果返回来修改前后相应的目录是否存在。
(二)文件内容的读写 —— 数据流
1.FileInputStream (读取文件)
方法 | 说明 |
---|---|
read() | 读取一个字节的数据返回-1证明读取完毕 |
read(byte[] b) | 最多读取b.length字节数据到b中,返回实际读到的数量,-1代表读完 |
close() | 关闭字节流 |
例如读取“d:/test.txt”文件:
public static void main(String[] args) throws IOException {
InputStream inputStream = new FileInputStream("d:/test.txt");
while (true){
byte[] buffer = new byte[1024];
int len = inputStream.read(buffer);
System.out.println("len:" + len);
if(len == -1){
break;
}
for (int i = 0; i < len; i++) {
System.out.printf("%x\n",buffer[i]);
}
}
inputStream.close();
}
结果为读取字节的ASCII值
InputStream inputStream = new FileInputStream("d:/test.txt");
byte[] buffer = new byte[1024];
int len = inputStream.read(buffer);
实际上完成读取的操作仅仅只有这三行代码
2.FileOutputStream (字符写入)
方法 | 说明 |
---|---|
write(int b) | 写入数据 |
write(byte[] b) | 将b这个字符数组中的数据全部写入os中 |
close() | 关闭字节流 |
例如要对“d:/test.txt”文件写入:
写入前文件内容:
public static void main(String[] args) throws IOException {
try(OutputStream outputStream = new FileOutputStream("d:/test.txt")) {
outputStream.write(97);
outputStream.write(98);
outputStream.write(99);
outputStream.write(100);
outputStream.flush();
}
}
写入后文档内容:
写入和写出最后都不能忘记调用close()方法进行关闭,因为程序在创建出流对象的时候会在进程PCB的文件描述符表中申请一个空间,里面记录着文件打开的信息,关闭文件会释放着个空间,如果不手动去释放着块空间,在长时间程序运行对很多文件进行操作的情况下,文件描述符表很快就会被占满,之后这个进程将不能再打开文件,以至于抛出异常,所以在文件使用完毕后要记得使用close()方法进行关闭释放空间。
然后在FileOutputStream的代码实例中我们并没有使用close()方法,这是因为我们将打开文件的操作放入了try()中,这样虽然没有写close()方法,当时在try()执行结束的时候会自动执行close()方法。