Java基础入门·对存储文件File的相关操作

前言

File类获取的方法

getName() | getPath()

 File getAbsoluteFile() | File getParentFile()

long length()

File类遍历方法

 IO流对象的分类

1.按照操作的文件类型分类

2.按照数据的流向分类

IO流对象的分类归纳

 OutputStream

字节输出流写入文件的步骤

 追加写入

FileInputStream


前言

我们之前进行Java基础入门学习时,都或多或少得遇到与get有关的方法,看它的名字就知道,带有此字样的方法,一般都是进行“获取”的操作

而今天我们就从File类获取开始,一步步学习

IO对象  字节输出流  字节输入流  字节缓冲流  转换流  打印流


File类获取的方法

File getAbsoluteFile()                 获取绝对路径,返回值是File类型

File getParentFile()                    获取父路径,返回值是File类型

String getName()                       获取名字,File构造方法中的路径名字

String getPath()                         获取File构造方法中的路径,完整的路径转成String返回

long length()                              获取文件的字节数

getName() | getPath()

 这里边 getName()和getPath()比较简单,代码格式与上一篇Java基础入门·File类的使用类似,感兴趣的小伙伴可以点击链接或者进入我的博客主页查看

public static void fileMethod1(){
        File file = new File("D:\\code\\Java");
        String name = file.getName();
        System.out.println("name = " + name);
        String path = file.getPath();
        System.out.println("path = " + path);
    }

 这里的返回值是路径的最后一个字符串,即“Java”,后面是文件,就返回文件名,是文件夹,就返回文件夹名

 getPath则是直接把构造参数D:\\code\\Java转成字符串(没有太大意义)

我们使用file.toString效果也是一样的


 File getAbsoluteFile() | File getParentFile()

File getAbsoluteFile()是获取绝对路径,我们一开始使用的就是绝对路径,所以输出结果没有发生任何变化

public static void fileMethod2(){
        File file = new File("D:\\code\\Java.exe");
        File absoluteFile = file.getAbsoluteFile();
        System.out.println("absoluteFile = " + absoluteFile);

    }

但当我们直接写一个文件名时,会默认在此目录下寻找该文件,若指定前面的父路径,,则结果可能又会不一样

File file = new File("Java.exe");

File file = new File("day8.8/Java.exe");
第一句的输出结果
第二句的输出结果

 getParentFile()用于获取父路径,返回的是一个file对象,所以我们仍可以对其进行多次 getParentFile()的操作

public static void fileMethod2(){
        File file = new File("D:\\code\\Java\\day18\\Java.exe");
        File absoluteFile = file.getAbsoluteFile();
        System.out.println("absoluteFile = " + absoluteFile);
        File parentFile = file.getParentFile();
        System.out.println("parentFile = " + parentFile);
    }

Java基础入门·对存储文件File的相关操作_第1张图片

多次操作后,可见返回的是文件的父路径的父路径的父路径······

但一定不能超过盘符找父路径,否则会返回null

File parentFile = file.getParentFile().getParentFile().getParentFile();

Java基础入门·对存储文件File的相关操作_第2张图片


long length()

获取文件的字节数

long length = file.length();
System.out.println("length = " + length);

File类遍历方法

listFiles()遍历目录,把该路径下的文件全部存入File数组里,我们对其进行遍历,就可以看到它把所以子路径都进行了存储

public static void fileMethod(){
        File file = new File("D:\\code\\Java\\day18");
        File[] files = file.listFiles();

        for(File f:files){
            System.out.println(f);
        }
    }

Java基础入门·对存储文件File的相关操作_第3张图片

 我们知道,文件夹里还有可能会有其他文件夹,当我们需要用到里面的文件路径时,还可以进行更深入的递归遍历,把目录下的所有文件的全路径都存储起来

实现这个方法也很容易,首先把方法改为传参,以便传入子文件夹才能进行下一步遍历,for循环里加一个文件夹判断,然后递归即可

public static void main(String[] args) {
        //直接在此处new对象
        fileMethod(new File("D:\\code\\Java\\day18"));
    }

    //此处传参,便于递归遍历子文件夹再次调用
    public static void fileMethod(File dir){
        File[] files = dir.listFiles();
        for(File f:files){
            if(f.isDirectory())
                fileMethod(f);
            else
            System.out.println(f);
        }
    }

此处代码修改:

当代码运行后,我们可以看到控制台输出全部都是文件的路径,那如果要输出文件夹的路径,该怎么实现,我们只需要在遍历开始前,输出一遍就好 ,在这句代码前

File[] files = dir.listFiles();

加一句输出语句,大功告成

System.out.println(dir);

Java基础入门·对存储文件File的相关操作_第4张图片


IO流对象

IO:Input Output IO的作用是将数据从一个设备中流入到另一个设备

数据文件,从磁盘中流向内存中,从磁盘中流向移动存储设备,从一台计算机流向另一台计算机

一切都是字节:任何数据文件都是字节组成,字节是计算机中最小存储单元(例如音乐、游戏、电影)

我们入门先了解什么输入输出

从Java程序里把数据存进文件中为:  输出

从文件中读取数据加载内存中为:      输入

Java基础入门·对存储文件File的相关操作_第5张图片


 IO流对象的分类

1.按照操作的文件类型分类

文本类型文件     ——选择流对象字符流

什么是文本文件:使用文本工具:记事本,notepad++等等,打开文件后人类可以直接阅读的文件

非文本类型文件  ——选择流对象字节流

word文件是非文本文件

2.按照数据的流向分类

输入流:Java程序从其他地方读取数据

输出流:Java程序中的数据,写入到其他地方


IO流对象的分类归纳

四大抽象类 

字节输出流:OutputStream 抽象类(最高父类)

字节输入流:InputStream 抽象类(最高父类)

字符输出流:Writer 抽象类 (最高父类)

字符输入流:Reader抽象类 (最高父类)


 OutputStream

Java.io.OutputStream是所有字节输出流的超类:可以写入任何类型的文件

写入字节的方法write

void write(int b)                                                写入单个字节

void write(byte[] b)                                           写入字节数组

void write(byte[] b,int off,int len)                       写入数组的一部分,开始索引,写入的个数

FileOutputStream

构造方法:FileOutputStream(File file)

构造方法:FileOutputStream(String file)

创建字节输出流对象,绑定参数就是要写入的数据目的

IO流对象使用完毕后要释放资源


字节输出流写入文件的步骤

创建字节输出流对象,构造方法中,绑定文件路径,写入目的

调用流对象的方法write写入数据

释放资源

public static void main(String[] args) throws IOException {
        writeByte();
    }

    public static void writeByte() throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream("F:\\Text\\1.txt");
        fileOutputStream.write(100);
        fileOutputStream.close();
    }

绑定的文件路径为1.txt,如果没有该文件,则自己创建,有,则覆盖里面的数据

下面的代码是写入字符串数组

public static void writeArray() throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream("F:\\Text\\1.txt");
        byte[] bytes = {97,98,99,100};
        fileOutputStream.write(bytes);
        fileOutputStream.write("good,well,nice".getBytes());
        fileOutputStream.close();
    }

 追加写入

 敲代码时可能已经想到了,存储文件数据,不能永远覆盖重来,每一次都是新的数据,旧数据丢失就没意义了,那想续接在后面怎么办:FileOutputStream第二个参数写true

 还有换行写入:Windows换行符号  \r  \n 

public static void writeAppend() throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream("F:\\Text\\1.txt",true);
        fileOutputStream.write("\r\n".getBytes());
        fileOutputStream.write("99,100,101".getBytes());
        fileOutputStream.close();
    }

Java.io.InputStream是所有字节输入流的超类:可以读取任何类型的文件

FileInputStream

构造方法:FileInputStream(File file)

构造方法:FileInputStream(String file)

创建字节输入流对象,绑定数据源文件

读取字节的方法read 

void read(int b)                                                读取单个字节

void read(byte[] b)                                           读取字节数组

 读取单个字节

public static void ReadByte() throws IOException {
        FileInputStream fileInputStream = new FileInputStream("F:\\Text\\1.txt");
        int r = fileInputStream.read();
        System.out.println("r = " + r);
    }

read方法可以多次调用,每多调用一次就往后多读一个字节,读取到末尾时返回-1

这里出现了重复的代码,所以我们可以使用循环来遍历文件中所有字节

public static void ReadByte() throws IOException {
        FileInputStream fileInputStream = new FileInputStream("F:\\Text\\1.txt");
        int r = 0;
        while ((r = fileInputStream.read())!=-1){
            System.out.print((char)r);
        }

    }

Java基础入门·对存储文件File的相关操作_第6张图片

读取字节数组,可以一次读取多个字节,但也和上面一样,每多一次调用,就会往后读取直到末尾返回-1

public static void ReadArray() throws IOException {
        FileInputStream fileInputStream = new FileInputStream("F:\\Text\\1.txt");
        byte[] bytes = new byte[5];
        //定义变量保存read方法的返回值
        int r = 0;
        r = fileInputStream.read(bytes);
        System.out.println("r = " + r);
        //数组转字符串
        System.out.println(new String(bytes));
    }

 增加了循环,修改String参数后的代码,读取多少个r,就转换r个,保证后面不出现上一次循环遗留的字符

public static void ReadArray() throws IOException {
        FileInputStream fileInputStream = new FileInputStream("F:\\Text\\1.txt");
        byte[] bytes = new byte[2];
        //定义变量保存read方法的返回值
        int r = 0;
        while ((r = fileInputStream.read(bytes))!=-1){
            //此处增加String开始索引、转换的个数r
            System.out.print(new String(bytes,0,r));
        }
    }

tips:数组大小一般推荐设置1024的整数倍  byte[] bytes = new byte[1024];


今天的Java文章分享就到此结束了, 喜欢的小伙伴记得一键三连,点赞收藏评论,如果想了解更多内容,可以用未来百万富豪的手指,点点小小的关注!你们的支持就是我最大的动力!

你可能感兴趣的:(java,开发语言)