Java文件操作

目录

一、File类概述

1.1 使用案例

二、文件内容的读写

2.1 字符流

2.1.1 读取文件

2.1.2 写入文件

2.2 字节流

2.2.1 读取文件

2.2.2 写入文件


对于Java操作文件,具体详情可以参考Java api文档 中的Java.io.File类

一、File类概述

首先先了解一下File类中常见的属性、构造方法和普通方法

属性

修饰符及类型属性说明
static StringpathSeparator依赖于系统的路径分隔符,String 类型的表示
static charpathSeparator依赖于系统的路径分隔符,char 类型的表示

构造方法

签名说明
File(File parent, String
child)
根据父目录 + 孩子文件路径,创建一个新的 File 实例
File(String pathname)根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者
相对路径
File(String parent, String
child)
根据父目录 + 孩子文件路径,创建一个新的 File 实例,父目录用
路径表示

普通方法

修饰符及返回
值类型
方法签名说明
StringgetParent()返回 File 对象的父目录文件路径
StringgetName()返回 FIle 对象的纯文件名称
StringgetPath()返回 File 对象的文件路径
StringgetAbsolutePath()返回 File 对象的绝对路径
StringgetCanonicalPath()返回 File 对象的修饰过的绝对路径
booleanexists()判断 File 对象描述的文件是否真实存在
booleanisDirectory()判断 File 对象代表的文件是否是一个目录
booleanisFile()判断 File 对象代表的文件是否是一个普通文件
booleancreateNewFile()根据 File 对象,自动创建一个空文件。成功创建后返
回 true
booleandelete()根据 File 对象,删除该文件。成功删除后返回 true
voiddeleteOnExit()根据 File 对象,标注文件将被删除,删除动作会到
JVM 运行结束时才会进行
String[]list()返回 File 对象代表的目录下的所有文件名
File[]listFiles()返回 File 对象代表的目录下的所有文件,以 File 对象
表示
booleanmkdir()创建 File 对象代表的目录
booleanmkdirs()创建 File 对象代表的目录,如果必要,会创建中间目
booleanrenameTo(File
dest)
进行文件改名,也可以视为我们平时的剪切、粘贴操
booleancanRead()判断用户是否对文件有可读权限
booleancanWrite()判断用户是否对文件有可写权限

1.1 使用案例

File的基本使用

import java.io.File;
import java.io.IOException;

public class Demo5 {
    public static void main(String[] args) throws IOException {
        File file = new File("../hello.txt");//这里不要求该文件存在
        System.out.println(file.getParentFile());
        System.out.println(file.getName());
        System.out.println(file.getAbsoluteFile());
        System.out.println(file.getCanonicalFile());
    }
}

普通文件的创建、删除

import java.io.File;
import java.io.IOException;

public class Demo6 {
    public static void main(String[] args) throws IOException {
        File file = new File("./test.txt");
        System.out.println(file.exists());
        System.out.println(file.isFile());
        // 创建文件
        file.createNewFile();
        System.out.println(file.exists());
        System.out.println(file.isFile());
        System.out.println(file.getAbsoluteFile());
    }
}

 

当前的目录中是没有这个test.txt文件的,然后运行程序

从这里可以看出创建已经成功了,接下来是删除操作。

import java.io.File;

public class Demo7 {
    public static void main(String[] args) {
        File file = new File("./test.txt");
        file.delete();
    }
}

当这个代码执行的时候,文件就会被删除了。

二、文件内容的读写

2.1 字符流

2.1.1 读取文件

构造方法

签名说明
FileReader(File file)利用 File 构造文件输入流
FileReader(String name)利用文件路径构造文件输入流

文件读取

首先先准备好一个含有内容的文件 

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class Demo9 {
    public static void main(String[] args) throws IOException {
        //这里用try()的写法就不用去关闭字符流了,这个会自动关闭
        try(Reader reader = new FileReader("./test.txt")) {
            // 因为文件不能一下就全部读完,所以采取循环读取的方式
            while (true) {
                // 用来存储读取到的字符
                char[] buf = new char[1024];
                // 将文件中的内容写入字符数组中
                int n = reader.read(buf);
                if (n == -1) {
                    // 读取结束
                    break;
                }
                for (int i = 0; i < n; i++) {
                    System.out.print(buf[i]);
                }
            }
        }
    }
}

 

2.1.2 写入文件

修饰
符及
返回
值类
方法签名说明
voidwrite(int b)写入数据
voidwrite(byte[] b)将 b 这个字符数组中的数据全部写入 os 中
intwrite(byte[] b,  int off, int len)将 b 这个字符数组中从 off 开始的数据写入 os 中,一共写 len 个
voidclose()关闭字节流
voidflush()重要:我们知道 I/O 的速度是很慢的,所以,大多的 OutputStream 为
了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的
一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写
入设备中,这个区域一般称为缓冲区。但造成一个结果,就是我们写的
数据,很可能会遗留一部分在缓冲区中。需要在最后或者合适的位置,
调用 flush(刷新)操作,将数据刷到设备中。
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class Demo10 {
    public static void main(String[] args) throws IOException {
        try (Writer fileWriter = new FileWriter("./test.txt",true)) {
            fileWriter.write("hello world!");
        }
    }
}

运行代码就会看到,结果已经写入了文件中了

2.2 字节流

2.2.1 读取文件

构造方法

签名说明
FileInputStream(File file)利用 File 构造文件输入流
FileInputStream(String name)利用文件路径构造文件输入流

开始读取文件

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class Demo11 {
    public static void main(String[] args) throws IOException {
        try (InputStream in = new FileInputStream("./test.txt")) {
            while (true) {
                byte[] buf = new byte[1024];// 由于这里是字节流读入,所以只能用字节数组接收
                int n = in.read(buf);
                if (n == -1) {
                    break;
                }
                for (int i = 0; i < n; i++) {
                    System.out.printf("%x",buf[i]);// 由于是字节,这里用16进制打印
                }
            }
        }
    }
}

由于有时候需要的是文件本身的内容,而不是字节内容,这里通常使用 String 来解决。

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class Demo11 {
    public static void main(String[] args) throws IOException {
        try (InputStream in = new FileInputStream("./test.txt")) {
            while (true) {
                byte[] buf = new byte[1024];// 由于这里是字节流读入,所以只能用字节数组接收
                int n = in.read(buf);
                if (n == -1) {
                    break;
                }
                // 利用String 字节转字符
                String s = new String(buf,0,n);
                System.out.print(s);
            }
        }
    }
}

利用Scanner 进行字符读取

上述例子中,我们看到了对字符类型直接使用 InputStream 进行读取是非常麻烦且困难的,所以,我们使用一种我们之前比较熟悉的类来完成该工作,就是 Scanner 类。但是Scanner类只能用于字节流的文本内容读取,如果内容是二进制文件则不能用Scanner。

构造方法说明
Scanner(InputStream is, String charset)使用 charset 字符集进行 is 的扫描读取
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;

public class Demo12 {
    public static void main(String[] args) throws IOException {
        try (InputStream in = new FileInputStream("test.txt")) {
            Scanner sc = new Scanner(in);
            // 由于Scanner遇到换行就会停止读取,为了读取全部文本内容就要用到hashNext
            while (sc.hasNextLine()) {
                String s = sc.nextLine();
                System.out.println(s);
            }
        }
    }
}

注意:不论是字节流还是字符流都能用Scanner来接收 ,但是都只限于文本内容

2.2.2 写入文件

这里的写入具体方法参考 2.1.2中的方法,因为写入的方法都是一样的,只是写入的是字节还是字符的区别。

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class Demo14 {
    public static void main(String[] args) throws IOException {
        try (OutputStream os = new FileOutputStream("./test.txt",true)) {
            os.write("hello".getBytes());// 由于是字节输出所以要转换成字节
        }
    }
}

这里的操作并不需要全部记住,只需要了解如何使用即可。用的使用查询api文档

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值