JavaWeb语法七:文件操作---IO

本文详细介绍了Java中的File类,包括相对路径、绝对路径和网络路径的概念,以及File对象的方法如获取路径、判断文件存在等。同时,讲解了字节流(InputStream)和字符流(Reader)的读写操作,包括read()方法的各种用法和OutputStream的写入功能。
摘要由CSDN通过智能技术生成

目录

1.File概述

1.1:File概述的方法

 2:文件内容的读写

2.1:字节流

2.1.1:读--InputStream

2.1.2:写---OutputStream

2.2:字符


前言:

这一篇我们将讲文件操作的相关方法,以及数据流和字符流的相关操作

1.File概述

说到file,我们首先要弄清楚相对路径,绝对路径,网络路径。

  • 相对路径:必须要有一个基准路径。相对路径:就是从基准路径出发,看从那种的路径来看找到对应的文件。

如果基准路径:C:\Software\exercise,那么hello.txt相对路径就是:.\hello.txt

如果基准路径:C:\Software,那么hello.txt 的相对路径就是:.\exercise\hello.txt

  • 绝对路径:是以盘符开头的。

那么hello.txt的绝对路径就是:C:\Software\exercise.\hello.txt。

  • 网络路径:就是通过一个网络路径就可以打开一个网络上的东西。

1.1:File概述的方法

返回值类型方法签名说明
StringgetParent()返回File对象的父目录文件路径
StringgetName()返回File对象的纯文件名称
Stringgetpath()返回File对象的文件路径(相对路径)
StringgetAbsolutedPath()返回File对象的绝对路径(基准路径加相对路径)
StringgetCanonicalPath()返回File对象的绝对路径
booleanexists()判断File对象描述的文件是否真实存在
booleanisDirectory()判断File对象描述的文件是否是一个目录
booleanisFile()判断File对象描述的文件是否是一个普通文件
booleancreateNewFile()根据File对象,自动创建一个空文件,成功后返回true
booleandelete()根据File对象,删除该文件,成功后返回true
voiddeleteOnExit()删除文件,删除动作回到JVM运行结束时才会进行。
String[]list()返回File对象代表的目录下的所有文件名
file[]listFiles()返回File对象代表的目录下的所有文件,以File对象表示
booleanmkdir()创建File对象代表的目录
booleanmkdirs()创建File对象代表的目录
booleanrenameTo(Filedest)对文件重命名
booleancanRead()判断是否有可读权限
booleancanWrite()判断是否有可写权限

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.File对象:

File file=new File("./text.txt"); //这个并不要求改文真实存在

2.getAbsolutedPath() /getCanonicalPath()----返回file对象的文件绝对路径(返回String)

例如:System.out.println(file.getAbsolutePath());

结果显示:D:\编程\代码\gittee\fighting\File_boke \.\text.txt

这里多了一个 .\ 在这个方法getAbsolutePath(),返回的结果是基准路径加上相对路径 

D:\编程\代码\gittee\fighting\File_boke ,这个是当前的代码文件路径(也是text.txt的基准路径)。

./text.txt 这是相对路径。

例如:System.out.println(file.getCanonicalPath());

结果显示:D:\编程\代码\gittee\fighting\File_boke\text.txt。

这个就是正常的绝对路径。


代码演示:

示例一:

 File file=new File("./text.txt");
        //这个并不要求改文件是否真实存在
        System.out.println("文件名:"+file.getName());
        System.out.println("文件的绝对路径"+file.getAbsolutePath());
        System.out.println("文件的绝对路径"+file.getCanonicalPath());
        System.out.println("文件的相对路径:"+file.getPath());
        System.out.println("父目录路径"+file.getParent());

结果显示:

57d3cc3c27bd4cd0893fb70a767f87c9.png


 示例二:

 public static void main(String[] args) throws IOException {
        File file=new File("./hello.txt");
        //创建一个文件
        file.createNewFile();//会抛出IOException
        //判断文件是否真实存在
        System.out.println("文件是否真实存在:"+file.exists());
        System.out.println("改名前的文件名:"+file.getName());
        //判断是否是一个文件
        System.out.println("是否是一个文件:"+file.isFile());
        //判断是否是一个目录
        System.out.println("是否是一个目录:"+file.isDirectory());
        //对文件重命名
      File file1=new File("./word.txt");
        System.out.println(file.renameTo(file1));
        System.out.println("word.txt文件是否存在:"+file1.exists());
        System.out.println("hello.txt文件是否存在:"+file.exists());
        System.out.println("改名后的文件名:"+file.getName());

结果显示:

50ffc6da7d7e40c48e6dd3206eb396cd.png

 文件重命名:为啥改名前和改名后的文件名是一样的勒?

因为这个只是把磁盘上的文件给改动,file对象不变的。


示例三:

 public static void main(String[] args) {
        //创建一个单级目录
        File file=new File("./ddd");
        file.mkdir();
        //判断是否是一个目录
        System.out.println("是否是一个目录:"+file.isDirectory());
        //创建多级目录
        File file1=new File("./aaa/bbb/ccc");
       file1.mkdirs();
       //返回File对象代表的目录下的所有文件名
        System.out.println("返回File1对象代表的目录下的所有文件名");
        String [] arr=file1.list();
        for (String s:arr) {
            System.out.println(s);
        }
        System.out.println("返回File1对象代表的目录下的所有文件名,以File对象表示:");
        File []files=file1.listFiles();
        for (File f:files) {
            System.out.println(f);
        }
    }

结果显示:

b0e719b5c2c9449f938757153dff5552.png


 2:文件内容的读写

2.1:字节流

字节流对象,针对二级制文件,是以字符为单位进行读写。

2.1.1:读--InputStream

1.read()---读取一个字节的数据 ,返回-1就代表已经完全读取完了。

  public static void main(String[] args) throws FileNotFoundException {
        File file=new File("./aaa/bbb/ccc/hello.txt");
        try(FileInputStream inputStream=new FileInputStream(file)) {
            while(true){
                int len=inputStream.read();
                if(len==-1){//如果读取时负一,说明就是读取到文件末尾
                    break;
                }
                System.out.print(len);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

结果显示:

1edf261eabe14e1cb58bfb55d6f5c7bd.png

这里大家产生了一个疑问了吗?一次返回一个字节,不是应该返回一个byte吗?为啥是int类型的勒?

如果返回的是byte,本身就是-128 到127 。当读取到一个-1的时候,你到底是读取到文件末尾了,还是刚好有一个值-1(0xff)。这时候为了表示这个非法状态,就约定了-1来表示,因此就需要一个使用范围大与byte的类型。

针对字符流,也是类似的设定,一次读一个char,因此此处使用int就会更适合一些,可以让字符和字节流统一。


2:read(byte[] b)---最多读取到b.length 字节的数据到b中,-1代表读完

public static void main(String[] args) {
        File file=new File("./aaa/bbb/ccc/hello.txt");
        try (FileInputStream inputStream=new FileInputStream(file)){
            while(true) {
                //一次读取多个字符
                byte[] arr = new byte[1024];
                int len = inputStream.read(arr);
                if(len==-1){//这里的len是你实际读取到的字节长度
                    break;
                }
                for (int i = 0; i <len ; i++) {
                    System.out.print(arr[i]+" ");
                }
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }

结果显示:

d0edfb4c0b0e40a7af0beb531c2e36ba.png


3.read(byte[] b ,int off, int len) ----最多读取len-off字节的数据到b中,放到off开始,返回实际读取的字节数量。-1代表已经读取完。

  public static void main(String[] args) {
        File file=new File("./aaa/bbb/ccc/hello.txt");
        try(FileInputStream inputStream=new FileInputStream(file)) {
            while(true) {
                byte[] arr = new byte[1024];
                int len=inputStream.read(arr,2,5);
                if(len==-1){
                    break;
                }
                for (int i = 0; i <len; i++) {
                    System.out.print(arr[i]+" ");
                }
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }

结果显示:

e901490e6c7d42d79e265334a79dd322.png


2.1.2:写---OutputStream

每次写入到指定的文件中,会清除指定文件的内容。

1.write(int b)---写入要给字节的数据

 public static void main(String[] args) {
       try(OutputStream outputStream=new FileOutputStream("./aaa/bbb/ccc/hello.txt")) {
           outputStream.write(110);
           outputStream.write(111);
           outputStream.write(112);
    outputStream.close();//关闭文件资源
       }catch (IOException e){
           e.printStackTrace();
       }
    }

结果显示:

c144abadb8394c8eb1e1254c9b5ecc69.png

2.write(byte []b)---将b这个字符数组中的数据全部写入指定文件中

  public static void main(String[] args) {
        try(OutputStream outputStream=new FileOutputStream("./aaa/bbb/ccc/hello.txt" )){
            byte [] arr=new byte[]{110,111,112,113,114,115};
            outputStream.write(arr);
            outputStream.close();//关闭文件资源
        }catch(IOException e){
            e.printStackTrace();
        }
    }

结果显示:

e26bd0fd6d7c4545856b9c90ff14a6c5.png


2.2:字符

1:read()--读

 try(Reader reader=new FileReader("./aaa/bbb/ccc/hello.txt")) {
            while(true){
                char [] arr=new char[1024];
                int len=reader.read(arr);
                if(len==-1){
                    break;
                }
                String str=new String(arr,0,len);
                System.out.println(str);
            }
        }catch (IOException e){
            e.printStackTrace();
        }

结果显示:

d1b90b1834154a9da1810f371ca48035.png

2.wirte()---写

public static void main(String[] args) {
        try(Writer writer=new FileWriter("./aaa/bbb/ccc/hello.txt")) {
            writer.write("xyz");
          writer.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }

结果显示:

0ffd2276d886424d8a15679f7d750878.png

3.FileWriter---追加 

  public static void main(String[] args) {
        try (FileWriter url=new FileWriter("./aaa/bbb/ccc/hello.txt",true)){
            url.write("word");
            url.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }

结果显示:

e897454ce94c4ba5aa487f4da66bf151.png


 总结:

以上就是我总结的文件IO的相关知识点,若有错误之处,请各位铁子留言纠错。若感觉不错,请一键三联。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值