Java基础 -IO流

我是研究僧i 提交于 2020-01-19 19:43:55

IO流

  1. 什么是IO:就是将数据的传输看做是一种数据的流动 按照流动的方向 以内存为基准 分为 输入input 和 输出 output 即流向内存是输入流 流出内存的输出流 Java中I/O操作主要是指使用 java.io 包下的内容,进行输入、输出操作 输入也叫做读取数据 输出也叫做作写出数据

  2. IO的分类:不同的分类标准有不同种的分类

    • 根据数据的流向分为:输入流和输出流
      • 输入流 :把数据从其他设备 上读取到 内存 中的流
      • 输出流 :把数据从 内存 中写出到 其他设备 上的流
    • 根据数据的类型分为:字节流和字符流
      • 字节流 :以字节为单位,读写数据的流
      • 字符流 :以字符为单位,读写数据的流
  3. 字节流

    • java.io.OutputStream 抽象类是表示字节输出流的所有类的超类 将指定的字节信息写出到目的地

      • 定义了字节输出流的基本共性功能方法: (这五种方法都常用)
        • public void close() :关闭此输出流并释放与此流相关联的任何系统资源 当完成流的操作时 必须调用此方法 释放系统资源
        • public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出
        • public void write(byte[] b) :将 b.length字节从指定的字节数组写入此输出流
        • public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输 出到此输出流
        • public abstract void write(int b) :将指定的字节输出流
    • FileOutputStream类java.io.FileOutputStream 子类是文件输出流 用于将数据写出到文件

      • 构造方法:
        • public FileOutputStream(File file) :创建文件输出流以写入由指定的 File对象表示的文件
        • public FileOutputStream(String name) : 创建文件输出流以指定的名称写入文件
      • 注意:当你创建一个流对象时,必须传入一个文件路径 该路径下,如果没有这个文件,会创建该文件 如果有这个文 件,会清空这个文件的数据 要是想要数据进行追加使用以下的构造方法:(就是在参数中传入一个boolean类型的值 true表示的是追加数据 false 表示清空原有数据
        • public FileOutputStream(File file, boolean append) : 创建文件输出流以写入由指定的 File对象表示的 文件
        • public FileOutputStream(String name, boolean append) : 创建文件输出流以指定的名称写入文件
      • 写出中换行 和 回车:
        • 回车符 \r 和换行符 \n
          • 回车符:回到一行的开头(return)
          • 换行符:下一行(newline)。
        • 系统中的换行:
          • Windows系统里,每行结尾是 回车+换行 即 \r\n
          • Unix系统里,每行结尾只有 换行 ,即 \n
          • Mac系统里,每行结尾是 回车 ,即 \r 从 Mac OS X开始与Linux统一
    • InputStreamjava.io.InputStream 抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中

      • 定义了字节输入 流的基本共性功能方法:
        • public void close() :关闭此输入流并释放与此流相关联的任何系统资源
        • public abstract int read() : 从输入流读取数据的下一个字节
        • public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。
    • FileInputStream类 是文件输入流 从文件中读取字节

      • 构造方法
        • public FileInputStream(File file) : 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名
        • public FileInputStream(String name) : 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件 系统中的路径名name命名 当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有该文件 会抛出 FileNotFoundException
      • 读取字节数据:
        • 读取字节: read 方法,每次可以读取一个字节的数据,提升为int类型,读取到文件末尾,返回 -1
          • 使用read方法 读取到一个字节 会自动的进行类型的提升 提升为int型 另外的一点就是在进行流的操作完成之后 需要使用close 方法进行流的关闭
          • 上面的方式执行的效率非常的低 极高效率的方式就是使用字节数组进行读取:read(byte[] b) ,每次读取b的长度个字节到数组中,返回读取到的有效字节个数,读取到末尾时,返回 -1 使用返回值能防止以前读取的数据没有进行完全替换 这样的方式减少了系统间的IO操作次数,从而提高了读写的效率
          • 注意: 多个流之间的关闭顺序 就是先开的后关闭 后开的先关闭
    • 使用字节流的对拷实现图片的复制 :

      public class Copy { 
      	public static void main(String[] args) throws IOException { 
      	// 1.创建流对象 
      	// 1.1 指定数据源 
      	FileInputStream fis = new FileInputStream("D:\\test.jpg"); 
      	// 1.2 指定目的地 
      	FileOutputStream fos = new FileOutputStream("test_copy.jpg"); 
      	// 2.读写数据 
      	// 2.1 定义数组 缓冲
      	byte[] b = new byte[1024]; 
      	// 2.2 定义长度 
      	int len; 
      	// 2.3 循环读取 
      	while ((len = fis.read(b))!=1) { 
      		// 2.4 写出数据 
      		fos.write(b, 0 , len); 
      	}
      	// 3.关闭资源  这里为了简便直接将异常抛出
      	fos.close(); 
      	fis.close(); } 
      }
      
  4. 字符流:使用字节流可能出现的问题就是在进行中文字符的读取的时候 可能不会出现完整的字符(主要的原因就是中文是多个字节进行存储的)

    • Reader java.io.Reader 抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中
      • 定义了字符输入 流的基本共性功能方法:
      • public void close() :关闭此流并释放与此流相关联的任何系统资源
      • public int read() : 从输入流读取一个字符
      • public int read(char[] cbuf) : 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中
    • FileReaderjava.io.FileReader 类是读取字符文件的便利类 构造时使用系统默认的字符编码和默认字节缓冲区
      • 注意:Windows系统的中文编码默认是GBK编码表。 idea中UTF-8
      • 构造方法:类似于FileOutputStream
        • public FileReader(File file) : 创建一个新的 FileReader ,给定要读取的File对象
        • public FileReader(String fileName) : 创建一个新的 FileReader ,给定要读取的文件的名称
      • 读取字符数据:
        • 读取字符: read 方法,每次可以读取一个字符的数据,自动提升为int类型,读取到文件末尾,返回 -1
        • 使用字符数组读取: read(char[] cbuf) ,每次读取b的长度个字符到数组中,返回读取到的有效字符个数, 读取到末尾时,返回 -1
    • Writer java.io.Writer 抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。
      • 定义了字节输出流的基本共性功能方法:
        • void write(int c) 写入单个字符
        • void write(char[] cbuf) 写入字符数组
        • abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分,off数组的开始索引,len 写的字符个数
        • void write(String str) 写入字符串
        • void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数
        • void flush() 刷新该流的缓冲
        • void close() 关闭此流,但要先刷新它
    • FileWriterjava.io.FileWriter 类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区
      • 构造方法:,类似于FileOutputStream
        • public FileWriter(File file) : 创建一个新的 FileWriter,给定要读取的File对象
        • public FileWriter(String fileName) : 创建一个新的 FileWriter,给定要读取的文件的名称
      • 基本写出数据
        • 写出字符: write(int b) 方法,每次可以写出一个字符数据 没有调用close方法,数据只是保存到了缓冲区 并未写出到文件中
      • 关闭和刷新
        • 因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据 的。如果我们既想写出数据,又想继续使用流,就需要 flush 方法了
          • flush :刷新缓冲区,流对象可以继续使用。
          • close :先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了
      • 写出其他数据
        • 写出字符数组 : write(char[] cbuf) 和 write(char[] cbuf, int off, int len) ,每次可以写出字符数组中的数据,用法类似FileOutputStream
        • 写出字符串: write(String str) 和 write(String str, int off, int len) ,每次可以写出字符串中的数据
        • 续写和换行 类似于FileOutputStream
  5. try-with-resource 语句:该语句确保了每个资源在语句结束时关闭

    • 使用格式:
      try (创建流对象语句,如果多个,使用';'隔开) { 
      	// 读写数据 
      } catch (IOException e) {
      	e.printStackTrace(); 
      }
      
  6. 使用流进行properties文件的加载:(在使用Druid数据库连接池的时候会使用到)

    • 概述

      • java.util.Properties 继承于 Hashtable ,来表示一个持久的属性集。它使用键值对存储数据,每个键及其对应值都是一个字符串 该类也被许多Java类使用,比如获取系统属性时, System.getProperties 方法就是返回 一个 Properties 对象
    • 构造方法:

      • public Properties() :创建一个空的属性列表
    • 基本的存储方法:

      • public Object setProperty(String key, String value) : 保存一对属性
      • public String getProperty(String key) :使用此属性列表中指定的键搜索属性值
      • public Set<String> stringPropertyNames() :所有键的名称的集合
    • 与流相关的方法 :

      • public void load(InputStream inStream) : 从字节输入流中读取键值对。 参数中使用了字节输入流,通过流对象,可以关联到某文件上,这样就能够加载文本中的数据了
      • 注意:文本中的数据,必须是键值对形式,可以使用空格、等号、冒号等符号分隔
    • 代码演示:

       //3.加载配置文件
      Properties pro = new Properties();
      InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
      pro.load(is);
      //4.获取连接池对象(需要传入一个Properties对象)
      DataSource ds = DruidDataSourceFactory.createDataSource(pro);
      //5.获取连接
      Connection conn = ds.getConnection();
      // 进行jdbc的操作...
      
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!