文件操作(Java)

文件

广义上的文件

泛指计算机中的很多软硬件。——>在操作系统中,把很多的硬件设备和软件资源抽象成了文件,并按照文件的方式来统一管理。

狭义上的文件

指的是硬盘上的文件和目录(文件夹

由于文件在磁盘上,内容可能会很大,甚至会超过内存的上限,所以对于文件的操作基本上都是一边读一边处理,处理好了一部分,再去处理下一部分。


文件路径

文件在硬盘上,每个文件在硬盘上都有一个具体的“路径”。

绝对路径

以C:/D:开头的路径。

例如:D:\IDEA\Java\ArrayList 1\src

相对路径

当前所在的目录为基准,以.或者..开头(.有时可以省略),指到指定的路径。

当前所在目录称为工作目录,每一个程序运行时都有一个工作目录。

例如:../../src

如果工作目录不同,定位到同一个文件,相对路径的写法是不同的。

例如:

工作目录

相对路径

D:/

./tmp/111

D:/tmp

./111

D:/tmp/222

../111

D:/tmp/222/bbb

../../111

其中,.. 表示当前目录的上级目录,也就是说 ../../111 第一个 ../ 表示bbb的上级目录——>222,第二个 ../ 表示222的上级目录——>tmp。


文件分类

文件的类型有很多,但是整体可以归纳到两类中。

1.文本文件

文本文件存的是文本,字符串

字符串是由字符构成的,每个字符都是通过一个数字来表示的,这个文本文件里存的数据约定是合法的字符,都是在指定字符编码的码表之间的数据。

2.二进制文件

二进制文件存的是二进制数据,不一定是字符串。

没有任何限制,可以存储任何想要存储的数据。

操作文件

在Java中操作文件分为两类:针对文件系统的操作(文件的创建,删除,重命名等);针对文件内容的操作(文件的读写)

在Java中,通过Java.io.File类来对一个文件进行抽象的描述。
也就是说: 有File对象并不表示真实存在这个文件。

File

File属性
File的构造方法

File(String parent,String child)中的parent表示当前文件所在的目录,child表示文件自身的文件名。

以上构造方法的路径名用相对路径或绝对路径都可以。

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

public class IOpractice {
    public static void main(String[] args) throws IOException {
        File file=new File("..\\111.txt");
        File file1=new File(file,".\\aaa.txt");
        File file2=new File(".\\222.txt",".\\bbb.txt");
    }
}

并不要求这个文件真实存在。

Filed方法

修饰符以及返回值的类型

方法名

方法说明

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()

返回Fi了对象代表的目录下的所有文件名

File[]

listFiles()

返回Fi了对象代表的目录下单所有的文件,以File对象表示

boolean

mkdir()

创建File对象代表的目录

boolean

mkdies()

创建File对象代表的目录,如果必要,会创建中间目录

boolean

renameTo(File deat)

进行文件改名,也可以视为我们平时的剪切,粘贴操作

boolean

canRead()

判断用户是否对文件有可读权限

boolean

canWrite()

判断用户是否对文件有可写权限

deleteOnExit()不会立即删除这个文件,会在程序退出后自动删除。——>“临时文件”

临时文件相当于保存了当前实时编辑的内容(尤其是还没有保存的内容)

目前,创建的该文件不存在

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

public class IOpractice {
    public static void main(String[] args) throws IOException {
        File file=new File(".\\111.txt");
        System.out.println(file.getParent());
        System.out.println(file.getName());
        System.out.println(file.getPath());
        System.out.println(file.getAbsolutePath());
        System.out.println(file.getCanonicalPath());
        System.out.println(file.exists());
        System.out.println(file.isDirectory());
        System.out.println(file.isFile());
    }
}
import java.io.File;
import java.io.IOException;

public class IOpractice {
    public static void main(String[] args) throws IOException {
        File file=new File(".\\111.txt");
        System.out.println(file.createNewFile());
    }
}
import java.io.File;
import java.io.IOException;

public class IOpractice {
    public static void main(String[] args) throws IOException {
        File file=new File(".\\111.txt");
        System.out.println(file.createNewFile());
        System.out.println(file.delete());
    }
}
mikdir()的时候,如果中间目录不存在,则无法创建成功;mikdirs(I)则可以解决这个问题。

文件内容的读写

InputStream

InputStream的方法

如果想要打开一个文件去读,首先要保证这个文件是存在的。

修饰符或返回值类型

方法名

方法说明

int

read()

读取一个字节的数据,返回-1代表已经完全读完了(读取到底每个字节就是对应的ASCII码)

int

read(byte[] b)

最多读取b.length字节的数据到b中,返回实际读到的数量返回-1代表已经读完了

int

read(byte[] b,int off,int len)

最多读取len-off字节的数据到b中,放在从off开始,返回实际读到的数量-1表达已经读完了

void

close()

关闭字节流

InputStream是一个抽象类要使用的话还需要具体的实现类

Java中一般将输入信息作为参数,输出信息作为返回值,也有少数情况是使用参数来返回内容的。如read(byte[] b).

前提条件

import java.io.*;

public class IOpractice {
    public static void main(String[] args) throws IOException {
        InputStream inputStream=new FileInputStream("111.txt");
        while(true){
            int b=inputStream.read();
            if(b==-1){
                break;
            }
            System.out.printf("%c",b);
        }

    }
}

FileInputStream

FileInputStream的构造方法

方法名

方法说明

FileInputStream(File file)

利用File构造文件输入流

FileInputStream(String name)

利用文件路径构造文件输入流

import java.io.*;

public class IOpractice {
    public static void main(String[] args) throws IOException {
        try(InputStream is=new FileInputStream("111.txt")) {
            byte[] buffer=new byte[1024];
            int len;
            while(true){
                len=is.read(buffer);
                if(len==-1){
                    break;
                }
                for(int i=0;i<len;i++){
                    System.out.printf("%c",buffer[i]);
                }
            }
        }
    }
}

buffer存在的意义就算为了提高IO操作的效率,单次的IO操作是要访问硬盘/IO设备,单次的IO时间是一定的,单次操作是比较消耗时间的,如果能够缩短IO的次数,就可以提高程序整体的效率了。所以使用byte[1024]——>一次读1024个字节。

数组长度是1024,read会尽可能的读取1024个字节,填写到数组中。但实际上,文件剩余长度是有限的,如果剩余长度超过1024,此时1024个字节都会填满,返回的就是1024;但如果剩余长度不足1024,read方法就会返回房前实际读取到的长度.(读完返回-1)

Scanner

利用InputStream进行读取较为麻烦且困难,故使用Scanner类来完成该工作。

Scanner的构造方法

构造方法

方法说明

Scanner(InputStream is,String charset)

使用charset字符集进行is的扫描读取

例子:

import java.io.*;

public class IOpractice {
    public static void main(String[] args) throws IOException {
        try(InputStream is=new FileInputStream("111.txt")) {
            try(Scanner scanner=new Scanner(is)){
                while(scanner.hasNext()){
                    String s=scanner.next();
                    System.out.println(s);
                }
            }
        }
    }
}

OutputStream

OutputStream的方法

修饰符及返回值类型

方法名

方法说明

void

write(int b)

写入要给字节的数据

void

write(byte[] b)

将b这个字符数据中的数据全部写入os中

int

write(byte[] b,int off, int len)

将b这个字符数组中从off开始的数据写入os中,一共写len个

void

close()

关闭字节流

void

flush()

刷新

对于OutputStream来说,默认情况下打开一个文件会先将文件原有的内容清除掉,如果不行清空,流对象提供了一个“追加对象”,可以实现不清空文件,将新的内容写入到原内容的后面。

OutputStream也只是一个抽象类要使用它还需要具体的实现类

进程:在内核中使用PCB这样的数据结构表示进程。

一个线程对应一个PCB。一个进程可以对应一个/多个PCB。

PCB中有一个非常重要的属性——>文件描述符表(相当于一个数组)其中记录了该进程打开了哪些文件(即使一个进程中有多个线程多个·PCB,这些PCB共用一个文件描述符表,如上图所示)

每次打开文件操作就会在文件描述符表中申请一个位置,把这个信息放入,每次关闭文件也就会把文件描述符表对应的表项给释放掉。

如果没有close操作,虽然Java会有GC但是GC操作不一定及时。

close一般来说是要执行的,但是如果一个程序这里的文件对象要自始至终的使用,也可以不关闭。随着进程的结束,PCB销毁,这个文件描述符表偶也就跟着会销毁,对应的资源操作系统会回收。

import java.io.*;

public class IOpractice {
    public static void main(String[] args) throws IOException {
        try(OutputStream is=new FileOutputStream("111.txt")) {
            is.write('h');
            is.write('e');
            is.write('l');
            is.write('l');
            is.write('o');
            is.write(',');
            is.write('w');
            is.write('o');
            is.write('r');
            is.write('l');
            is.write('d');
            is.flush();
        }
    }
}

关于input和output的方向问题

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sunlightʊə

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值