Java进阶API第六章

发布时间:2023年12月17日

Java进阶API第六章

一.相对论和IO流之说?

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

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

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

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

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

?1.汉语文学理解IO流

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

2.?图解IO流

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

反之写入output。

?三.InputStream和OutPutStream

终极静态父类

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

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

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

四.FileInputStream字节流读取文件

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

我们创建一个文件,并写好内容。?

?

  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();

    }

五.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();
    }

六.buff缓冲复制文件?

?任务:复制照片

  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();

    }

七.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?类继承而来。该类按字符向流中写入数据

@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();
    }

由上面的例子可以看出,使用方法与字节流一样。?

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

九.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.io (Java SE 11 & JDK 11 ) (runoob.com)

十一.Apache Common IO?

引入架包:Maven Repository: commons-io ? commons-io (mvnrepository.com)?

引入方法:前几章说过

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);
    }
}

?

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

文章来源:https://blog.csdn.net/2301_76556912/article/details/134872530
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。