Java文件操作

一、File类介绍

Java中通过java.io.File 类 抽象的 描述了一个文件(包括目录)注意,有File对象,不代表真是存在该文件。

先来看一看File类中的常见属性、构造方法和常用方法:

1.File类属性

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

2.构造方法

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

3.常用方法

修饰符及返回值类型方法签名说明
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()判断用户是否对文件有可写权限

二、如何读写文件中的数据

文件内容的读写是以“流”的方式进行的。
,就视为通过水龙头往池子里灌水–输出流
,就视为通过水龙头从池子里往外节水–输入流
这里的输入输出是以CPU为中心的, 所以从CPU往磁盘上写数据叫做输出,从文件往CPU读数据叫做输入。

Java对于读写文件分为了两种方式,分别为字节流字符流

读类写类说明
InputStreamOutputStream字节流读写,针对二进制文件,操作基本单位是字节
ReaderWriter字符流读写,针对文本文件,操作基本单位是字符
  • 字节流: 它处理单元为1个字节,操作字节和字节数组,存储的是二进制文件,如果是音频文件、图片、歌曲,就用字节流
  • 字符流: 它处理的单元为2个字节的 Unicode 字符,分别操作字符、字符数组或字符串,字符流是由 Java 虚拟机将字节转化为2个字节的 Unicode 字符为单位的字符而成的,如果是关系到(文本)的,用字符流更好
  • 字节流可用于任何类型的对象,包括二进制对象,
    而字符流只能处理字符或者字符串。
  • 字节流提供了处理任何类型的 IO 操作的功能,但它不能直接处理 Unicode 字符,而字符流就可以。
  • 所有文件都是以字节的形式储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列。
  • 字节流在操作的时候本身不会用到缓冲区的,是与文件本身直接操作的;
    而字符流在操作的时候会使用到缓冲区的。
  • InputStream/OutputStream 和 Reader/Writer 都实现了 Closeable 接口,所以可以不主动通过 close 方法去关闭该资源,而是通过代码可读性更高的 try-with-resource 操作在 try 中的内容结束后,无论是否有异常都关闭该资源。
  • 使用 OutputStream 或 writer 打开文件默认会清空之前的文件内容。

1.通过字节流读写数据

InputStream

InputStream 只是一个抽象类,使用时还需要具体的实现类,InputStream 的实现类有很多种,针对不同的输入设备都可以对应一个实现类,其中针对文件读取的实现类是 **FileInputStream**。

FileInputStream 概述
构造方法

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

常用方法

修饰符及返回值类型方法签名说明
intread()读取一个字节的数据,返回 -1 代表已经完全读完了
intread(byte[] b)最多读取 b.length 字节的数据到 b 中,返回实际读到的数量;-1 代表以及读完了
intread(byte[] b,int off,int len)最多读取 len - off 字节的数据到 b 中,放在从 off 开始,返回实际读到的数量;-1 代表以及读完了
voidclose()关闭字节流

InputStream搭配Scanner进行字符读取

有时对字符类型直接使用InputStream进行读取非常麻烦且困难,所以,我们
使用一种我们之前比较熟悉的类来完成该工作,就是 Scanner 类。

构造方法说明
Scanner(InputStream is, String charset)使用 charset 字符集进行 is 的扫描读取

OutputStream

OutputStream 同样只是一个抽象类,要使用还需要具体的实现类。我们现在还是只关心写入文件中,所以使用 FileOutputStream

FileOutputStream 概述
常用方法

修饰符及返回值类型方法签名说明
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(刷新)操作,将数据刷到设备中

2.通过字符流读写数据

Reader

Reader 是实现字符输入流的一种类型,其本身属于一个抽象类,使用时需要使用具体的实现类。Reader 的实现类很多,针对不同的输入设备都可以对应一个实现类,其中针对文件读取的实现类是 FileReader。Reader 的使用方式InputStream 相仿。

代码示例:

public static void main1(String[] args) throws IOException {        //读操作
        try (Reader reader=new FileReader("./test.txt")){
            while (true){
                int ch=reader.read();    //返回值为int, 读完之后返回-1
                if (ch==-1){
                    break;
                }
                System.out.println(""+(char)ch);
            }
        }
    }

Writer

Writer 是实现字符输出流的一种类型,其本身属于一个抽象类,使用时需要使用具体的实现类。Writer 的实现类很多,针对不同的输出设备都可以对应一个实现类,其中针对文件读取的实现类是 FileWriter。Writer 的使用方式和OutputStream 相仿。

代码示例:

public static void main(String[] args) throws IOException {                //写操作
        try (Writer writer=new FileWriter("./test.txt")){
            writer.write("hello world");
            //手动刷新缓冲区
            writer.flush();
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值