Java-IO流

目录

前言

1.File类的使用

1.1 常用构造器

1.2 路径分隔符

1.3 File类的常用方法

1.4 File类的创建和删除功能

2.IO流原理及流的分类

2.1 Java IO原理

2.2 流的分类

2.2.1按照数据流的流向不同进行分类

2.2.2按操作数据单位不同进行分类

2.2.3按照流的角色不同分为

2.3 IO流体系

3.节点流(或文件流)

3.1 字符流读入操作:

3.2 字符流写入操作:

3.3 字节流的输入操作:

3.4 字节流的输出操作:(输入、输出)

视频(mp4)复制Demo:

4.缓冲流

更新总结

图片加密、解密Demo:

练习:统计字符出现的次数

5.转换流(处理流之二)

图解:

补充:字符编码

 ​编辑 

6.标准输入、输出流(处理流之三:了解)

练习1:

练习2:

7.打印流(处理流之四:了解)

8.数据流(处理流之五:了解)

复习:

9.对象流(处理流之六:重要)

9.1对象的序列化

10.随机存取文件流(RandomAccessFile类)

ByteArrayOutputStream流:

​编辑

11.NIO.2 中 Path、Paths、Files类的使用

 11.2核心API

11.3 常用方法


前言

之前的存储数据都是在内存中进行的。例如:使用集合存数据等。

当JVM关掉之后,这些数据就都没有了。我们需要将数据做持久化,就需要将内存中的数据存到硬盘上。(.txt文件)

由于栈在内存层面,把内存中的数据写入到持久化层面,叫做输出。

将持久化层面的数据读到内存中,就可以在程序中对这些数据进行操作了,叫做输入。

1.File类的使用

当从内存中将数据写到 .txt文件 里,或者从.txt文件把数据读到内存中,需要一个端点,这个端点是一个文件,在Java的内存中需要用一个对象来充当,这个对象就是File类型的。

File类型的对象可以表示 一个文件 或 文件目录(文件夹)。

  • java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关。
  • File能新建、删除、重命名文件和目录,但File不能访问文件内容本身。
    • 如果需要访问文件内容本身,则需要使用输入、输出流。
  • 想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。
  • File对象可以作为参数传递给流的构造器。

1.1 常用构造器

  • public File(String pathname):
    • 以pathname为路径创建File对象,可以是绝对路径或者相对路径,如果pathname是绝对路径,则默认的当前路径在系统属性user.dir中存储。
      • 绝对路径:是一个固定的路径,从盘符开始。
      • 相对路径:是相对于某个位置开始。
  • public File(String parent,String child):
    • 以parent为父路径,child为子路径创建File对象。
  • public File(File parent,String child):
    • 根据一个父File对象和子文件路径创建File对象。
/**
 * File类的使用:
 *
 * 1.File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹)
 *
 * 2.File类声明在 java.io 包下。
 *
 */
public class FileTest {
    /**
     * 1.如何创建File类的实例
     *  File(String filePath)
     *  File(String parentPath,String childPath)
     *  File(File parentFile,String childPath)
     *
     * 2.绝对路径:包含盘符在内的文件或文件目录的路径。
     *   相对路径:相较于某个路径下,指明的路径。
     *
     * 3.路径分隔符
     *   Windows:\\
     *   unix:/
     */

    @Test
    public void test1(){
        //1.构造器一
        File file1 = new File("hello.txt"); //相对于module
        File file2 = new File("D:\\IDEAProjects\\Collection_Map\\Generic\\he.txt");

        System.out.println(file1);
        System.out.println(file2);

        //2.构造器二
        File file3 = new File("D:\\IDEAProjects","Collection_Map\\Generic");
        System.out.println(file3);

        //3.构造器三
        File file4 = new File(file3,"hi.txt");
        System.out.println(file4);

        //此时以上三个文件都只是在内存层面的几个对象而已。
        //当我们调用toString 方法的时候,只是将文件路径进行输出。

    }
}

1.2 路径分隔符

  • 路径中的每级目录之间用一个路径分隔符隔开。
  • 路径分隔符和系统有关:
    • Windows和DOS系统默认使用“\”来表示。
    • UNIX和URL使用“/”来表示
  • Java程序迟滞跨平台运行,因此路径分隔符要慎用。
  • 为了解决这个隐患,File类提供了一个常量。
    • public static final String separator。根据操作系统,动态的提供分隔符。
  • 举例:
    • File file1 = new File("d:\\demo\\info.txt");
    • File file2 = new File("d:"+File.separator + "demo" + File.separator + "info.txt");
      • 这个方法更通用,在什么操作系统下都可以识别。
    • File file3 = new File("d:/demo");

1.3 File类的常用方法

以下方法都是文件本身具有的方法,是在硬盘层面的,也就是将内存中的数据写入到硬盘之后的文件所具有的功能。

  • File类的获取功能
    • public String getAbsolutePath():获取绝对路径
    • public String getPath():获取路径
    • public String getName():获取名称
    • public String getParent():获取上层文件目录路径。若无,返回null,
      • 相对路径创建的文件无法获取。
    • public long length():获取文件长度(即:字节数)。不能获取目录的长度。(dest)
    • public long lastModified():获取最后一次的修改时间,毫秒值。(dest)

只能遍历出硬盘中真实存在的。(dest)

    • public String[] list():获取指定目录下的所有文件或者文件目录的名称数组。
    • public File[] listFiles():获取指定目录下的所有文件或者文件目录的File数组。
  • File类的重命名功能
    • public boolean renameTo(File dest):把文件重命名为指定的文件路径。
  • File类的判断功能(dest)
    • public boolean isDirectory():判断是否是文件目录
    • public boolean isFile():判断是否是文件
    • public boolean exists():判断当前对象是否在硬盘中存在
    • public boolean canRead():判断是否可读
    • public boolean canWrite():判断是否可写
    • public boolean isHidden():判断是否隐藏
/**
     * public String getAbsolutePath():获取绝对路径
     * public String getPath():获取路径
     * public String getName():获取名称
     * public String getParent():获取上层文件目录路径。若无,返回null
     * public long length():获取文件长度(即:字节数)。不能获取目录的长度。
     * public long lastModified():获取最后一次的修改时间,毫秒值。
     * 如下两个方法适用于文件目录
     * public String[] list():获取指定目录下的所有文件或者文件目录的名称数组。
     * public File[] listFiles():获取指定目录下的所有文件或者文件目录的File数组。
     *
     * 都是内存层面的调用,涉及不到要求必须硬盘上存在这个文件。
     */
    @Test
    public void test2(){
        File file1 = new File("hello.txt");
        File file2 =  new File("d:\\IO\\h1.txt");

        System.out.println(file1.getAbsolutePath()); //D:\IDEAProjects\Collection_Map\Generic\hello.txt
        System.out.println(file1.getPath()); //hello.txt
        System.out.println(file1.getName()); //hello.txt
        System.out.println(file1.getParent()); //null
        System.out.println(file1.length()); //10
        System.out.println(new Date(file1.lastModified())); //0

        System.out.println();

        System.out.println(file2.getAbsolutePath()); //d:\IO\h1.txt
        System.out.println(file2.getPath()); //d:\IO\h1.txt
        System.out.println(file2.getName()); //h1.txt
        System.out.println(file2.getParent()); //d:\IO
        System.out.println(file2.length()); //0
        System.out.println(new Date(file2.lastModified()));//0

    }

    @Test
    public void test3(){
        File file = new File("D:\\IDEAProjects\\Collection_Map\\Generic");
        String[] list = file.list(); //文件名
        for (String s : list) {
            System.out.println(s);
        }
        File[] files = file.listFiles(); //绝对路径包含文件名
        for (File file1 : files) {
            System.out.println(file1);
        }

    }

    /**
     * public boolean renameTo(File dest):
     *          把文件重命名为指定的文件路径。
     *  要想保证返回true,需要file1在硬盘中是存在的,且file2不能在硬盘中存在。
     */
    @Test
    public void test4(){
        File file1 = new File("hello.txt");
        File file2 = new File("D:\\IO\\hi.txt");

        boolean renameTo = file1.renameTo(file2); //意为将file1的名字改为file2
        //如果想撤销改名操作,调换文职即可:file2.renameTo(file1)
        System.out.println("renameTo = " + renameTo);

    }
    /**
     * public boolean isDirectory():判断是否是文件目录
     * public boolean isFile():判断是否是文件
     * public boolean exists():判断是否存在
     * public boolean canRead():判断是否可读
     * public boolean canWrite():判断是否可写
     * public boolean isHidden():判断是否隐藏
     *
     */
    @Test
    public void test5(){
        //硬盘中存在hello.txt,如果不存在,则所有输出都是默认值false
        File file1 = new File("hello.txt");
        System.out.println(file1.isDirectory()); //false
        System.out.println(file1.isFile()); //true
        System.out.println(file1.exists()); //true
        System.out.println(file1.canRead()); //true
        System.out.println(file1.canWrite()); //true
        System.out.println(file1.isHidden()); //false

    }

1.4 File类的创建和删除功能

与硬盘相关的操作,硬盘层面的。

  • File类的创建功能
    • public boolean createNewFile():创建文件。若文件存在,则不创建,返回false.
    • public boolean mkdir():创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
    • public boolean mkdirs():创建文件目录。如果上层文件目录不存在,一并创建。
  • 注意:如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目路径下。
  • File
    • public boolean delete():删除文件或者文件夹
    • 删除注意事项:
      • Java中的删除不走回收站。
      • 要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录。
 @Test
    public void test7(){
        //文件目录的创建,已知目录D:\IO
        File file1 = new File("D:\\IO\\IO1");
        boolean mkdir = file1.mkdir();
        if(mkdir){
            System.out.println("创建成功1"); //创建成功1
        }
        File file2 = new File("D:\\IO\\IO2\\IO3");
        boolean mkdirs = file2.mkdirs();
        if(mkdirs){
            System.out.println("创建成功2");//创建成功2
        }
    }

初始化目录D:\IO后:

file1创建失败。file2创建成功。
//文件目录的创建,已知目录D:\IO
        File file1 = new File("D:\\IO\\IO1\\IO4");
        boolean mkdir = file1.mkdir();
        if(mkdir){
            System.out.println("创建成功1");
        }
        File file2 = new File("D:\\IO\\IO2\\IO3");
        boolean mkdirs = file2.mkdirs();
        if(mkdirs){
            System.out.println("创建成功2");//创建成功2
        }

注意:在硬盘中存在的文件,所有属性都是有值的;而内存层面的file ,其length,isFile,isread等都是默认值。

/**
 * File类的使用:
 *
 * 1.File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹)
 * 2.File类声明在 java.io 包下。
 * 3.File类中涉及到的关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法,
 *  并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用IO流来完成。
 *  4.后续File类的对象常会作为参数传递到流的构造器中,指明读取或写入的“终点” .用File来表示。
 *  当读取或写入内容,这个File的对象代表文件,而不是文件目录。
 *
 */
        //要想删除成功,要删除的目录下不能有子目录或文件。
//        File file3 = new File("D:\\IO\\IO1");
        boolean delete = file1.delete();
        System.out.println(delete);

说明:

IDEA中:

如果开发中使用JUINT中的单元测试方法测试,相对路径即为当前Module下。

如果是使用main()测试,相对路径即为当前的Project下。

Eclipse中:

不管使用单元测试方法还是使用main()测试,相对路径都是在Project下。

2.IO流原理及流的分类

Google I/O 寓意为“开放中创新” (Innovation in the Open)

Input/Output 二进制1,0

2.1 Java IO原理

  • I/O是Input/Output的缩写,I/O技术是非常使用的技术,用于处理设备之间的数据传输。如:读写文件,网络通讯等。
  • Java程序中,对于数据的输入、输出操作以“流(stream)”的方式进行。
  • java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。

2.2 流的分类

2.2.1按照数据流的流向不同进行分类

输入输出是相对而言的,我们平常都是以程序为参照的,也就是内存。

输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。

输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中。

2.2.2按操作数据单位不同进行分类

分为字节流(8 bit)、字符流(16 bit) char

字节流:存放图片,视频等;

字符流:存放文本。

2.2.3按照流的角色不同分为

分为节点流、处理流。

4个抽象基类:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Chao_nengli

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

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

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

打赏作者

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

抵扣说明:

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

余额充值