Java教程

回顾总结16

本文主要是介绍回顾总结16,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

IO流

  1. I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理数据传输,如读/写文件,网络通讯等
  2. Java程序中,对于数据的输入/输出操作以"流(Stream)"的方式进行
  3. java.io包下提供了各种"流"类和接口,用以获取不同种类的数据,并通过方法输入或输出数据

文件

文件是保存数据的地方

文字、声音、视频本质上没有差别

在程序中,数据被封装到文件当中,文件以流的形式进行传输

  • 流:数据在数据源(文件)和程序(内存)之间经历的路径
  • 输入流:数据从数据源(文件)到程序(内存)的路径
  • 输出流:数据从程序(内存)到数据源(文件)的路径

文件是存放在磁盘当中的。文件与程序的交互相当于磁盘和内存的交互

特点

  1. 先进先出:最先写入输入流的数据最先被输入流读取到
  2. 顺序存取:可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据
  3. 只读或者只写:每个流只能是输入或输出流的一种,不能同时具备两个功能,输入流只能进行读操作,输出流只能进行写操作,在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流

流的分类

(抽象基类) 字节流 字符流
输入流 InputStream Reader
输出流 OutputStream Writer
  • Java的IO流共涉及40多个类,实际上非常规则,都是从如上4个抽象基类派生的

  • 由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀

操作数据单位

  • 字节流(8bit)(二进制文件)

    • InputStream
    • OutputStream
  • 字符流(按字符,根据文件编码)(文本文件)、
    (字节流+编码 = 字符流)

    • Reader

    • Writer

数据流的流向

  • 输入流
  • 输出流

流的角色

  • 节点流:可以从一个特定的数据源读写数据。(较为底层,跟数据源直接接触)

    对文件、对数组、对管道、对字符串等数据源直接操作的流,如File操作的一系列流,FileInputStream、FileReader以及对应的输出流

  • 处理流/包装流:是"连接"在已存在的流(节点流、处理流)之上,为程序提供更为强大的读写功能。更加灵活

    通过对以上节点流进行包装处理过的流。BufferedReader、BufferedWriter可以装入任意一个对应的流作为属性

节点流和处理流

节点流:是底层流,直接跟数据源相接

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

处理流

处理流的包装,使用了修饰器设计模式,不会直接与数据源相连。

优点

  • 性能的提高:主要以增加缓冲的方式来提高输入输出的效率
  • 操作的便捷:处理流可能提供了一系列便捷的方法来一次输入输出大批量的数据,使用更加灵活方便

序列化和反序列化

序列化:就是在保存数据的时候,保存数据的值数据类型

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

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

  1. Serializable:这是一个标记接口,空接口
  2. Externalizable

details

  1. 读写顺序要一致
  2. 要求实现序列化或反序列化对象,需要实现Serializable接口
  3. 序列化的类中建议添加SerialVersionUID,为了提高版本的兼容性
  4. 序列化对象时,默认将里面所有属性都进行了序列化,但除了static或transient修饰的成员
  5. 序列化对象时,要求里面属性的类型也需要实现序列化接口
  6. 序列化具备可继承性,也就是如果某类已经实现了序列化,则它的所有子类也已经默认实现了序列化

字节流和字符流

不要用字符流去读取二进制文件,会造成文件损坏

二进制文件有声音、视频、doc、pdf等等,基本单位是单个字节,使用字节流去读取

字符流也是二进制文件的一种,每个字符包含多个二进制

读取文件

字节流

  • FileInputStream的无参read方法,一次只读一个字节
    public void readFile1() throws IOException {
        String pathName = "e:\\study.txt";
        int readData;
        FileInputStream fileInputStream = new FileInputStream(file);
        while((readData = fileInputStream.read()) != -1){//返回的是int类型,读取字符的数据,根据ASCII码转换
            System.out.print((char)(readData) + " ");//read无参方法每次读取一个字节,将其转化成char字符就可输出
        }
        fileInputStream.close();   
}
  • FileInputStream的参数为byte[]的read方法,一次读取byte[]个字节
//和无参read方法的差别是,多声明一个byte[],并且输出方法不一样
    public void readFile2() throws IOException {
        String pathName = "e:\\study.txt";
        byte[] bytes = new byte[8];
        int len = 0;
        FileInputStream fileInputStream = new FileInputStream(file);
        while((len =fileInputStream.read(bytes)) != -1){//返回的是数组读取字节的个数,真正的数据在数组中
            System.out.print(new String(bytes,0,len)+" ");//read带数组参数的方法,每次读取数组大小个字节,需要将其转化成String截取输出。
        }
        fileInputStream.close();
}
  • FileOutputStream的参数为byte[]的write方法,一次写入byte[]个字节
    public static void main(String[] args) throws IOException {
        String pathName = "e:\\yy\\tt.txt";
        String str = "hello,world.welcome to java";
        //FileOutputStream fileOutputStream = new FileOutputStream(pathName,true);//此方法是追加在文件末尾写入
        FileOutputStream fileOutputStream = new FileOutputStream(pathName);//此方法是覆盖的方式写入
        //fileOutputStream.write(str.charAt(0));读写一个字节
        fileOutputStream.write(str.getBytes());//读写一整个字符串
        //fileOutputStream.write(str.getBytes(),0,12);读写字符串的[0,12)个字符串
        fileOutputStream.close();
    }

字符流

FileReader

FileWrite:使用完后一定要记得close或者flush,不然数据写不进去。

标准输入输出流

标准输入流

System类的public final static InputStream in

System.in的编译类型是:InputStream

运行类型是:BufferedInputStream

表示标准输入的是:键盘

标准输出流

System类的public final static PrintStream out

System.out的编译类型是:PrintStream

运行类型是:PrintStream

表示标准输出的是:显示器

打印流

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

PrintStream

字节打印流

PrintStream out = System.out;

out.print("hello,java")

out.close

这个print的底层就是write方法

  • 默认打印位置是System.out是显示器,我们可以修改它的打印输出位置,通过System.setOut(new PrintStream(路径名))或者,直接在System.out的位置修改成(路径名)

PrintWriter

字符打印流

PrintWriter printWriter = new PrintWriter(System.out);

printWriter.print("hello,java");

printWriter.close;

  • 修改打印输出位置,System.out改成(路径名),或者调用System.setOut方法穿进去一个PrintStream

转换流

字节流 + 编码格式 = 字符流

InputStreamReader

Reader的子类,可以将InputStream字节流转换(包装)成Reader字符流

OutputStreamWriter

Writer的子类,可以将OutputStream字节流转换(包装)成Writer字符流

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

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

总结

  1. 最底层是的字节流,传输二进制文件的流(以字节为单位读写)

  2. 为了能更好的更有效率的读写中文,我们把字节流按照一定编码规则(默认为utf-8)进行读写,称作字符流(以字符为单位读写)

  3. 这两个流属于底层流,称为节点流

  4. 再往上一层,有处理流(包装流)(以节点流为单位读写,本质上是操作节点流进行读写)

  5. 为了把已经有编码格式的字符流重新设置新的编码格式。我们需要把字符流中的字节流给取出来,然后使用InputStreamReader或者OutputStreamWriter,将该字节流加上编码格式转换成对应的新的字符流

  6. 如果有需要的话,就用处理流(包装流)将该字符流进行包装。使用处理流来读写数据。

Properties类

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

    配置文件的格式:键=值

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

常用方法

  1. load:加载配置文件的键值对到Properties对象
  2. list:将数据显示到指定设备(流对象)
  3. getProperty(key):根据键获取值
  4. setProperty(key,value):设置键值对到Properties对象
  5. store:将Properties类中的键值对存储到配置文件,在idea中,保存信息到配置文件,如果含有中文,会存储为unicode码

如何读取mysql.properties文件

//创建一个Properties类对象
Properties properties = new Properties();
//加载指定配置文件。把想要的配置文件的内容加载到该类实例中
properties.load(new FileReader("src\\mysql.properties"));
//把properties类实例的内容显示在控制台
properties.list(System.out);

总结

Properties类是用来和后缀为.properties的配置文件交互(读写)的

首先,我们Propertties类是会保存一份数据的。我们所有对Properties类的操作,数据都会保存在这个类中。

只有两条操作是跟后缀为.properties的配置文件交互的。

  1. load:它会将配置文件的数据传到Properties类中,然后进行操作。
  2. store:它会将Properties类中的数据,返回到配置文件当中。

没必要纠结参数的输入输出。以程序为主体,load就是读取(InputStream或者Reader),从外来文件到程序。store就是写入(OutputStream或者Writer),从程序写入到文件。

这篇关于回顾总结16的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!