JavaSE学习笔记(十五.IO流)

文件

什么是文件:

文件对我们并不陌生,是保存数据的地方,比如大家经常使用的word文档,txt文件,excel文件...都是文件。它既可以保存一张图片,也可以保存视频,声音。

文件流:

文件在程序中是以流的形式操作的

流:数据在数据源(文件)和程序(内存)之间经历的路程

输入流:数据从数据源(文件)到程序(内存)的路程

输出流:数据从程序(内存)到数据源(文件)的路程

常用文件操作

创建文件相关构造器和方法:

相关方法:

① new File(String pathname) //根据路径构建一个File对象

② new File(File parent, String child) //根据父目录文件 + 子路径构建

③new File(String parent, String child) //根据父目录 + 子路径构建

createNewFile //创建新文件

System.out.println("文件名字" + file.getName());
System.out.println("文件绝对路径" + file.getAbsoluteFile());
System.out.println("文件父级目录" + file.getParent());
System.out.println("文件大小(字节)" + file.length());
System.out.println("文件是否存在" + file.exists());
System.out.println("是不是一个文件" + file.isFile());
System.out.println("是不是一个目录" + file.isDirectory());

目录的操作和文件的删除

mkdir创建一级目录,mkdirs创建多级目录,delete删除空目录或文件

public class Directory_ {
    public static void main(String[] args) {

    }
    //判断D盘下d:\\news1.txt是否存在,存在就删除
    @Test
    public void m1(){

        String filePath = "e:\\news2.txt";
        File file = new File("e:\\news2.txt");
        if(file.exists()){
            if (file.delete()){
                System.out.println(file.getName() + "删除成功");
            }else {
                System.out.println(file.getName() + "删除失败");
            }
        }else {
            System.out.println("该文件不存在");
        }
    }

    // 判断 D:\\demo02 是否存在,存在就删除,否则创建一个
    //在Java编程中目录也可以当成一种特殊的文件
    @Test
    public void m2(){

        String filePath = "e:\\demo\\a\\b\\c";
        File file = new File(filePath);
        if(file.exists()){
            System.out.println("has demo");
        }else {
            file.mkdirs();
        }
    }
}

IO流原理及其分类

Java IO流原理

1.I/O 是 input/output 的缩写,I/O 技术是非常实用的技术,用于处理数据传输.如读写/文件,网络通讯等

2.Java程序中,对于数据的输入和输出我们是按 “流” 的方式进行

3.java.io包下提供了各种 “ 流” 的类和接口,用以获取不同种类的数据,并通过方法输入和输出数据

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

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

流的分类

按操作数据单位不同分为:字节流(8 bit)二进制,字符流(按字符)文本文件

按照数据流向不同分为:输入流,输出流

按流的角色不同分为:节点流,处理流/包装流

IO流体系图 - 常用类

IO流体系图

文件vs流

流是传输工具

InputStream字节输入流:

InputStream抽象类是所有类字节输入流的超类

InputStream 常用的子类

1.FileInputStream:文件输入流

2.BufferedInputStream:缓冲字节输入流

3.ObjectInputStream:对象字节输入流

FileInputStream介绍

FileOutputStream介绍

public class FileOutputStream_ {
    public static void main(String[] args) {

    }
    @Test
    public void writeFile() throws IOException {

        //创建一个FileOutputStream对象

        FileOutputStream fileOutputStream = null;
        String filePath = "e:\\a.txt";

        try {
            //new FileOutputStream(filePath)创建方式,当写入内容时,会覆盖原来内容
            //new FileOutputStream(filePath, true)创建方式,当写入内容时,追加到文件末尾
            fileOutputStream = new FileOutputStream(filePath, true);
            //写入一个字节
//            fileOutputStream.write('H');
            //写入字符串
            String str = "Hello Word";
            //str.getBytes()将字符串改为字节类型数组
//            fileOutputStream.write(str.getBytes());
            fileOutputStream.write(str.getBytes(), 0, str.length());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            fileOutputStream.close();
        }

    }
}

文件拷贝

package OutputStream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileCopy {
    public static void main(String[] args) throws IOException {
        //完成文件拷贝,将文件将e:\\hello.txt 拷贝到 c盘
        //思路分析
        //1.创建文件输入流,将文件读入到程序
        //2.创建文件输出流,将读取到的文件数据,写入指定文件夹
        String srcFilePath = "e:\\hello.txt";
        String destFilePath = "e:\\hello132465.txt";
        FileInputStream fileInputStream = null;
        FileOutputStream fileOutputStream = null;

        try {
            fileInputStream = new FileInputStream(srcFilePath);
            fileOutputStream = new FileOutputStream(destFilePath);
            //创建字节数组提高读取效率
            byte[] buf = new byte[104];
            int readLen = 0;
            while ((readLen = fileInputStream.read(buf)) != -1){
                //读取后就写入文件
                fileOutputStream.write(buf, 0 ,readLen);
            }
            //拷贝成功

        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            if(fileInputStream != null) {
                fileInputStream.close();
            }
            if (fileOutputStream != null){
                fileOutputStream.close();
            }
        }

    }
}

FileReader 和 FileWriter介绍

都是字符流,即按照字符操作IO

FileReader相关方法:

1.new FileReader(File/String)

2.read:每次读取单个字符,返回该字符,如果到文件末尾,返回 -1

3.read(char[]):批量读取多个字符到数组,返回读取到的字符数,如果到文件末尾,返回 -1

相关API:

new String(char[]):将char[]转换成String

new String(char[], off, Len):将char[]的指定部分转化成String

FileWriter常用方法

1.new FileWriter(File/String):覆盖模式,相当于流的指针在首端

2.new FileWriter(File/String, true):追加模式,相当于流的指针在尾端

3.write(int):写入单个字符

4.write(char[]):写入指定数组

5.write(char[], off, Len):写入指定数组的指定部分

6.write(string):写入指定字符串

7.write(string, off, Len):写入指定字符串的指定部分

相关API:

String类:toCharArray:将String转换成char[]

注意

FileWriter使用后,必须要关闭(close)或刷新(flush),否则无法写入到指定文件

节点流和处理流

基本介绍

1.节点流可以从一个特定数据源(存放数据的地方)读取数据,如FileReader,FileWriter

2.处理流(也叫包装流)是"连接"在已存在的流(节点流或处理流)之上,为程序提供更为强大的读写功能,也更加灵活。如BuffereredReader,Buffered Writer

注:BufferReader 类中,有属性Reader,即可以封装一个节点流,该节点流是任意的,只要是Reader子类

节点流和处理流的区别和联系

1.节点流是底层流/低级流,直接和数据源相接

2.处理流(包装流)包装节点流,既可以消除不同节点流的实现差异,也可以提供方便的方法来完成输入和输出

3.处理流(包装流)对节点流进行包装,使用了修饰器模式,不会直接与数据源相连

处理流的功能主要体现在以下两个方面:

1.性能的提高:主要以增加缓冲的方式来提高输入和输出的效率

2.操作的便捷:处理流可能提供了一系列便捷的方式来一次输入输出大批量的数据,使用更加灵活方便

处理流BufferedReader 和 BufferedWriter

1.BufferedReader 和 BufferedWriter 属于字符流,是按照字符来读取数据的

2.关闭时,只需关闭外层流即可(关闭包装流,底层自动关闭被包装的节点流)

BufferedInputStearm 和 BufferedOutputStream

1.BufferedInputStearm:

BufferedInputStream 是字节流,在创建BufferedInputStream时,会创建一个内部缓冲数组

2.BufferedOutputStream:

BufferedOutputStream是字节流,实现缓冲的输入流,可以将多个字节写入底层输入流中,而不必对每次字节写入调用底层系统

对象流-ObjectInputStream 和 ObjectOutputStream

序列化和反序列化:

1.序列化就是在保存数据时,保存数据的值和数据类型

2.反序列化就是在恢复数据时,恢复数据的值和数据类型

3.需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现下列两个接口之一:

①Serializable //是一个标机接口(没有方法)

②Externalizable //该接口有方法需要实现,所以一般使用Serializable接口

基本介绍

1.功能:提供了对基本类型或者对象类型的序列化和反序列化的方法

2.ObjectInputStream提供是序列化功能, ObjectOutputStream提供反序列化功能

注意事项和细节说明

1.读写顺序要一直

2.要求序列化或反序列化对象,需要实现 Serializable

3.序列化的类建议添加SerialVersionUID,为了提高版本兼容性

4.序列化对象时,默认将里面所有属性都进行序列化,但除了static 或 transient 修饰的成员

5.序列化对象时,要求里面属性的类型也需要实现序列化接口

6.序列化具备可继承性,也就是如果某类已经实现了序列化,则它所有子类也已经默认实现了序列化

标准输入和标准输出

介绍:

System.in——是InputStream类型——默认设备:键盘

System.out——是PrintStream类型——默认设备:显示器

转换流-InputStreamReader 和 OutputStreamWriter

介绍:

1.InputStreamReader:Reader的子类,可以将InputStream(字节流)包装成Reader(字符流)

2.OutputStreamWriter:Writer的子类,可以将OutputStream(字节流)包装成Writer(字符流)

3.当处理纯文本数据时,如果使用字符流效率更高,并且可以有效解决中文问题,所以建议将字节流转换为字符流

4.可以在使用时指定编码格式(比如 utf-8, gbk, gb2312, ISO8859 - 1 等)

打印流- PrintStream 和 PrintWriter

打印流没有输入流,只有输出流

Properties类

基本介绍

1.专门用于读写配置文件的集合类

配置文件的格式:

键 = 值

键 = 值

2.注意:键值对不需要有空格,值不需要用引号括起来。默认类型String

3.Properties的常见方法

load:加载配置文件的键值对到Properties对象

list:将数据显示到指定设备

getProperty(key):根据键获取值

setProperty(key, value):设置键值对到Properties对象

store:将Properties中的键值对存储到配置文件,在idea中保存信息到配置文件,如果含有中文,则会存储中文对应的unicode码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Benaso

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

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

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

打赏作者

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

抵扣说明:

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

余额充值