• 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类的使用类似,感兴趣的小伙伴可以点击链接或者进入我的博客主页查看

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

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

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

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


     File getAbsoluteFile() | File getParentFile()

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

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

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

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

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

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

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

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

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


    long length()

    获取文件的字节数

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

    File类遍历方法

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

    1. public static void fileMethod(){
    2. File file = new File("D:\\code\\Java\\day18");
    3. File[] files = file.listFiles();
    4. for(File f:files){
    5. System.out.println(f);
    6. }
    7. }

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

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

    1. public static void main(String[] args) {
    2. //直接在此处new对象
    3. fileMethod(new File("D:\\code\\Java\\day18"));
    4. }
    5. //此处传参,便于递归遍历子文件夹再次调用
    6. public static void fileMethod(File dir){
    7. File[] files = dir.listFiles();
    8. for(File f:files){
    9. if(f.isDirectory())
    10. fileMethod(f);
    11. else
    12. System.out.println(f);
    13. }
    14. }

    此处代码修改:

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

    File[] files = dir.listFiles();

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

    System.out.println(dir);


    IO流对象

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

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

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

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

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

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


     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写入数据

    释放资源

    1. public static void main(String[] args) throws IOException {
    2. writeByte();
    3. }
    4. public static void writeByte() throws IOException {
    5. FileOutputStream fileOutputStream = new FileOutputStream("F:\\Text\\1.txt");
    6. fileOutputStream.write(100);
    7. fileOutputStream.close();
    8. }

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

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

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

     追加写入

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

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

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

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

    FileInputStream

    构造方法:FileInputStream(File file)

    构造方法:FileInputStream(String file)

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

    读取字节的方法read 

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

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

     读取单个字节

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

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

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

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

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

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

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

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

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


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

  • 相关阅读:
    C++ primer 5th笔记
    剑指offer-数据结构二
    利用Python进行中文分词——实现中文文本处理的基础工具
    【Linux】文件重定向以及一切皆文件
    centos7安装discuz全过程(含LAMP搭建)
    ov多域名SSL数字证书1200元一年送一月
    sqlflow简介,在线版:使用sqlflow,本地版:在windows上安装sqlflow
    苹果+甲基化=切开不变色
    http和https的区别?
    QML9、输入元素
  • 原文地址:https://blog.csdn.net/neadsc/article/details/132822616