File类与IO流

目录

File类的实例化与常用方法

IO流的概述与流的分类

 文件流

缓冲流---处理流

转换流---处理流

各种字符集的讲解

对象流---处理流

对象的序列化机制


File类的实例化与常用方法

File类位于Java.io包下

File类的一个对象对应操作系统下的一个文件或文件目录

File类中有新建,删除,获取名称,重命名等方法,没有涉及到文件的读写操作

实现读写操作要用到IO流

File类的对象是io流的顶点,File类作为参数传递到io流当中

2.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对象

2.2 方法
获取文件和目录基本信息
    * public String getName() :获取名称
    * public String getPath() :获取路径
    * `public String getAbsolutePath()`:获取绝对路径
    * public File getAbsoluteFile():获取绝对路径表示的文件
    * `public String getParent()`:获取上层文件目录路径。若无,返回null
    * public long length() :获取文件长度(即:字节数)。不能获取目录的长度。
    * public long lastModified() :获取最后一次的修改时间,毫秒值
列出目录的下一级
     * public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
     * public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。
File类的重命名功能
    - public boolean renameTo(File dest):把文件重命名为指定的文件路径。
判断功能的方法
    - `public boolean exists()` :此File表示的文件或目录是否实际存在。
    - `public boolean isDirectory()` :此File表示的是否为目录。
    - `public boolean isFile()` :此File表示的是否为文件。
    - public boolean canRead() :判断是否可读
    - public boolean canWrite() :判断是否可写
    - public boolean isHidden() :判断是否隐藏
创建、删除功能
    - `public boolean createNewFile()` :创建文件。若文件存在,则不创建,返回false。
    - `public boolean mkdir()` :创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
    - `public boolean mkdirs()` :创建文件目录。如果上层文件目录不存在,一并创建。
    - `public boolean delete()` :删除文件或者文件夹
      删除注意事项:① Java中的删除不走回收站。② 要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录。
绝对路径:以windows操作系统为例,包括盘符在内的文件或文件目录的完整路径。

相对路径:相对于某一个文件目录来讲的相对的位置。
        在IDEA中,如果使用单元测试方法:相对于当前的module来讲
                 如果使用main()方法:相对于当前的project来讲

IO流的概述与流的分类

流向不同分为:输入流,输出流

处理单位不同分为:字节流,字符流

流的角色不同分为:节点流,处理流

抽象基类节点流(文件流)
InputStreamFileInputStream
OutputStreamFileOutputStream
ReaderFileReader
WriterFileWriter

 文件流

FileInputStream/FileOutputStream

创建读取或写出的File类对象

创建输入或输出流

读入或写出

关闭流

    /*
     * 需求:复制一份playgirl.jpg文件,命名为playgirl_copy.jpg
     *
     * 复制失败!因为字符流不适合用来处理非文本文件。
     * */
    @Test
    public void test6() {
        FileReader fr = null;
        FileWriter fw = null;

        try {
            //1. 创建File类的对象
            File srcFile = new File("playgirl.jpg");
            File destFile = new File("playgirl_copy.jpg");

            //2. 创建输入流、输出流
            fr = new FileReader(srcFile);
            fw = new FileWriter(destFile);

            //3. 数据的读入和写出的过程
            char[] cbuffer = new char[5];
            int len;//记录每次读入到cbuffer中的字符的个数
            while ((len = fr.read(cbuffer)) != -1) {
                //write(char[] cbuffer,int fromIndex,int len)
                fw.write(cbuffer, 0, len); //正确的
//                fw.write(cbuffer); //错误的
            }

            System.out.println("复制成功");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4. 关闭流资源
            try {
                if (fw != null)
                    fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (fr != null)
                    fr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }

缓冲流---处理流

bufferedInputStream

bufferedOutputStream

bufferedReader

bufferedWriter

用于提高文件的读写效率

4个缓冲流                   使用的方法
处理非文本文件的字节流:
BufferedInputStream        read(byte[] buffer)
BufferedOutputStream       write(byte[] buffer,0,len) 、flush()

处理文本文件的字符流:
BufferedReader            read(char[] cBuffer) / String readLine()
BufferedWriter            write(char[] cBuffer,0,len) / write(String )  、flush()

    /*
    * 使用BufferedReader和BufferedWriter实现文本文件的复制
    *
    * 注意:开发中,还是需要使用try-catch-finally来处理流的异常。
    * */
    @Test
    public void test2() throws IOException {
        //1.造文件、造流
        File file1 = new File("dbcp_utf-8.txt");
        File file2 = new File("dbcp_utf-8_copy1.txt");

        BufferedReader br = new BufferedReader(new FileReader(file1));
        BufferedWriter bw = new BufferedWriter(new FileWriter(file2));

        //2.文件的读写操作
        String data ;
        while((data = br.readLine()) != null){
            bw.write(data);
            bw.newLine(); //表示换行操作
            bw.flush();//刷新的方法。每当调用此方法时,就会主动的将内存中的数据写出到磁盘文件中。
        }
        System.out.println("复制成功");

        //3.关闭资源
        bw.close();
        br.close();
    }

转换流---处理流

InputStreamReader:将一个输入型的字节流转换为输入型的字符流。
OutputStreamWriter:将一个输出型的字符流转换为输出型的字节流。


    /*
    * 需求:将gbk格式的文件转换为utf-8格式的文件存储。
    * */
    @Test
    public void test4() throws IOException {
        //1. 造文件
        File file1 = new File("dbcp_gbk.txt");
        File file2 = new File("dbcp_gbk_to_utf8.txt");

        //2. 造流
        FileInputStream fis = new FileInputStream(file1);
        //参数2对应的是解码集,必须与dbcp_gbk.txt的编码集一致。
        InputStreamReader isr = new InputStreamReader(fis,"GBK");


        FileOutputStream fos = new FileOutputStream(file2);
        //参数2指明内存中的字符存储到文件中的字节过程中使用的编码集。
        OutputStreamWriter osw = new OutputStreamWriter(fos,"utf8");

        //3. 读写过程
        char[] cBuffer = new char[1024];
        int len;
        while((len = isr.read(cBuffer)) != -1){
            osw.write(cBuffer,0,len);
        }

        System.out.println("操作完成");

        //4. 关闭资源
        osw.close();
        isr.close();


    }

各种字符集的讲解

Unicode是编码字符集(字符集)

UTF-8,UTF-16是字符集编码(编码规则)

标准支持的所有字符以及他们对应的码点的集合叫做字符集

字符到储存在计算机的内容的映射叫做编码

字符-----码点(!=储存在计算机的内容)

字符集=字符+码点

编码=字符+储存在计算机的内容

对象流---处理流

对象流及其作用
 API:
ObjectInputSteam
ObjectOutputStream

 作用:
可以读写基本数据类型的变量、引用数据类型的变量。


对象的序列化机制

对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上, 或通过网络将这种二进制流传输到另一个网络节点。//

当其它程序获取了这种二进制流,就可以恢复成原来的Java对象。 如下两个过程使用的流: 序列化过程:使用ObjectOutputStream流实现。将内存中的Java对象保存在文件中或通过网络传输出去 反序列化过程:使用ObjectInputSteam流实现。将文件中的数据或网络传输过来的数据还原为内存中的Java对象

自定义类要想实现序列化机制,需要满足:

① 自定义类需要实现接口:Serializable......标识接口,没有任何抽象方法

② 要求自定义类声明一个全局常量: static final long serialVersionUID = 42234234L; 用来唯一的标识当前的类。

③ 要求自定义类的各个属性也必须是可序列化的。 > 对于基本数据类型的属性:默认就是可以序列化的 > 对于引用数据类型的属性:要求实现Serializable接口

注意点:

① 如果不声明全局常量serialVersionUID,系统会自动声明生成一个针对于当前类的serialVersionUID。 如果修改此类的话,会导致serialVersionUID变化,进而导致反序列化时,出现InvalidClassException异常。

② 类中的属性如果声明为transient或static,则不会实现序列化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不爱吃于先生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值