Java进阶API第六章

Java进阶API第六章

一.相对论和IO流之说 

  • 词典中Stream的意思是有方向性的流动的液体/电流,强调过程
  • 理解I/O Stream可以看作是输入/输出方向的流体

从相对论的角度看待 I/O流 

如.国家水库向你家输水,国家水库相当于输出水,你家相当于输入水。 

使用说I/O要有源头,要有目的,中间还有要管道。

Java进阶API第六章_第1张图片

二.汉语文学理解IO流与图解IO流

 1.汉语文学理解IO流

  • 解释流这个词,像水流的东西输入/输出
  • 有一个物体会流动,像水一样,有输入和输出两种方式或者两种方向

2. 图解IO流Java进阶API第六章_第2张图片

数据源可以是图中1.程序,2.文件或数据库,3.服务器。 从图中可以理解对程序而言读取软件是input。

反之写入output。Java进阶API第六章_第3张图片

 三.InputStream和OutPutStream

终极静态父类

  • I/O流就是用来管理各种数据的输入和输出,在这个包中有两个终极静态父类,InputStreamOutputStream
  • 这两个类提供和数据操作相关的方法,后有其他不同类型的数据控制子类来继承这两个类

InputStream专门管理数据的读相关操作,OutputStream专门管理数据的写相关操作。

  • Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。
  • Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。
  • 一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。
  • Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。
  • 但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。

四.FileInputStream字节流读取文件

leInputStream流被称为文件字节输入流,意思指对文件数据以字节的形式进行读取操作如读取图片视频等。

我们创建一个文件,并写好内容。 Java进阶API第六章_第4张图片

 Java进阶API第六章_第5张图片

  public void inputFile() throws IOException {

        //  要抛出异常IOException
        FileInputStream fileInputStream = new FileInputStream("D:\\touch.txt");


        // 1. read( )函数 :该函数的返回值为int数值,
        //   表示读取的字符对应的ascii码,当返回为-1表示读取到文件末尾;
        int temp = 0;
        while (  (temp = fileInputStream.read()) != -1) {
            System.out.print((char)temp);
        }

        // 关闭IO流资源,防止内存占用
        fileInputStream.close();

    }

Java进阶API第六章_第6张图片

五.FileOutPutStream字节流写入文件 

public void inputFile() throws IOException {

        // 要抛出异常IOException
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\touch.txt");

        // getBytes()方法可以将字符串转换成数组
        byte[] bytes = "fuck_PPT".getBytes();
        // 使用write()方法写入
        for (int i = 0; i < bytes.length; i++) {
            fileOutputStream.write(bytes[i]);
        }
        fileOutputStream.close();
    }

Java进阶API第六章_第7张图片

六.buff缓冲复制文件 

 任务:复制照片Java进阶API第六章_第8张图片

  public void inputFile() throws IOException {

        FileInputStream fileInputStream = new FileInputStream("D:\\照片\\one.png");
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\照片\\two.png");

        // 缓存区,以1KB的大小读,连续读取写入
        // 如果没有缓冲区,会以一个字节一个字节的搬运,非常慢。
        byte[] buff = new byte[1024];

        int temp = 0;
        // 读
        while ( (temp = fileInputStream.read(buff)) != -1) {
            // 写,括号内表示从零开始以1KB为单位持续搬运。
            fileOutputStream.write(buff,0,temp);
        }

        fileInputStream.close();
        fileOutputStream.close();

    }

Java进阶API第六章_第9张图片

七.buffered字节缓冲流、装饰设计模式 

 上面说了定义缓冲区可以加快读取与写入。其实Java中已经存在带有缓冲区的字节流。可以更快的读取与写入。所以上面的复制照片有,更好的方法。

 public void copyFileBase() throws IOException{

        // 装饰设计模式
        BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("D:\\照片\\one.png"));

        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("D:\\照片\\two.png"));

        int by;
        
        while ( (by = bufferedInputStream.read()) != -1){
            bufferedOutputStream.write(by);
        }
        
        bufferedInputStream.close();
        bufferedOutputStream.close();

    }

八.FileReader和FileWriter,俩专门来搞定txt文件  

上面说的是字节流,可以读取与写入任何文件。下面的字符流,只能读取与写入txt文件。

  • FileReader类从InputStreamReader类继承而来。该类按字符读取流中数据
  • FileWriter 类从OutputStreamWriter 类继承而来。该类按字符向流中写入数据

Java进阶API第六章_第10张图片

@Test
    public void fileReaderTest() throws IOException{

        FileReader fileReader = new FileReader("D:\\1.txt");

        int ch;
        while ( (ch = fileReader.read()) != -1){
            System.out.print((char) ch);
        }

        fileReader.close();
    }

    @Test
    public  void fileWriteTest() throws IOException{

        FileWriter fileWriter = new FileWriter("D:\\2.txt");

        fileWriter.write("your fuck");

        fileWriter.close();
    }

Java进阶API第六章_第11张图片Java进阶API第六章_第12张图片

由上面的例子可以看出,使用方法与字节流一样。 Java进阶API第六章_第13张图片

查看源码其实就可以知道,字符流的本质就是调用字节流。所以他们的字符缓存流与字符缓存流调用方法一样。

九.BufferedReader、BufferedWriter 

 @Test
    public void bufferedWriterTest() throws IOException{

        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("D:\\3.txt"));

        bufferedWriter.write("one");
        // 换行newLine()方法
        bufferedWriter.newLine();
        bufferedWriter.write("two");

        bufferedWriter.close();

    }

    @Test
    public void bufferedReaderTest() throws IOException{

        BufferedReader bufferedReader = new BufferedReader(new FileReader("D:\\3.txt"));

        // 字符流,所以使用String接收更合理
        String ch;

        // 使用readLine()方法取,可以一行一行的读,
        // 使用的是String,所以不能为空
        while ( (ch = bufferedReader.readLine()) != null){
            System.out.println(ch);
        }
        bufferedReader.close();
    }

Java进阶API第六章_第14张图片

Java进阶API第六章_第15张图片

十.各种流的体验

java.io (Java SE 11 & JDK 11 ) (runoob.com)

十一.Apache Common IO 

引入架包:Maven Repository: commons-io » commons-io (mvnrepository.com) Java进阶API第六章_第16张图片

引入方法:前几章说过Java进阶API第六章_第17张图片

Java进阶API第六章_第18张图片

package com.io;

import org.apache.commons.io.FileUtils;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;

public class IoTest {

    @Test
    public void CommonsIoTest() throws IOException {
        File fileB = new File("D:\\1.txt");
        // 判断文件是否存在,不存在创建
        if(!fileB.exists()){
            fileB.createNewFile();
        }

        // 文件添加内容
        FileUtils.writeLines(fileB,new ArrayList<>(Collections.singleton("\n you you")),true);
    }
}

 Java进阶API第六章_第19张图片

其他方法:Commons IO 官方文档-阿里云开发者社区 (aliyun.com) 

你可能感兴趣的:(java,开发语言)