当前位置: 首页 > 图灵资讯 > 技术篇> IO流原理及流的分类

IO流原理及流的分类

来源:图灵教育
时间:2023-05-21 09:24:29

1.6141.1JavaIO流原理及流量分类

1.I/O是Input/Output缩写,I/O技术是处理数据传输的非常实用的技术。如阅读/撰写文件、网络通信等。

2.在Java程序中,数据的输入/输出操作是流动的(stream)以“方式进行。

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

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

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

1.2流的分类

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

根据数据流的不同流向,分为输入流和输出流

根据流的不同角色,分为节点流、处理流/包装流

IO流原理及流的分类_InputStream

Java的IO流涉及40多个类别,实际上是非常规则的,都是从以上4个抽象基类中衍生出来的。

2)这四类衍生出来的子类名称都是以其父类名为子类名的后缀。

2.IO流体系图-常用类6142.1IO流体系图

IO流原理及流的分类_输入流_02

2.2文件VS流

IO流原理及流的分类_java_03

3.InputStream:字节输入流6153.1InputStream抽象类是所有类字节输入流的超类3.1.Inputstream常用的子类615

FileInputStream:文件输入流

BufferedInputStream:缓冲字节输入流

ObjectInputStream:对象字节输入流

4.FileinputstreamFileOutputStream4.1案例演示FileInputstreamm:文件输入流615

请使用Fileinputstream阅读hellol.txt文件并在控制台上显示文件内容.

com中的代码.stulzl.inputstream_fileInputstream.包中FileInputStream_

package com.stulzl.inputstream_fileInputstream;import org.junit.jupiter.api.Test;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;//FileInputStream:文件输入流  615//请使用 FileInputStream 读取 hello.txt 文件,并在控制台上显示文件内容.public class FileInputStream_ {    public static void main(String[] args) {    }    //演示 FileInputStream 使用(字节输入流 文件--> 程序)    ///读取单个字节,效率比较低    @Test    public void readFile01(){        String filePath = "e:\\hello.txt";        int readData = 0;////用于接收read()读取数据的返回值        FileInputStream fileInputStream = null;        try {            //创建 FileInputStream 文件输入流对象,用于读取文件            fileInputStream = new FileInputStream(filePath);            ///从输入流读取字节数据。 如果没有可用的输入,这种方法将被阻止。            /如果返回-1 , 说明读完了            //解释循环读取,read()每次读取一个数据,都会返回一个int类型的值,读取后返回-1            //我们将返回值放入readdata,用作循环判断条件            while((readData = fileInputStream.read())!=-1){//read()一次读取字节数据的方法                System.out.print((char)readData);///类型转换            }        } catch (IOException e) {            e.printStackTrace();        }finally {            ////关闭文件流释放资源            try {                fileInputStream.close();            } catch (IOException e) {                e.printStackTrace();            }        }    }    //使用read(byte[] b)提高效率    @Test    public void readFile02(){        String filePath = "e:\\hello.txt";        ///定义一个字节数组        byte[] buf = new byte[8];///可以一次读8个字节        int readLen = 0;//用于存储readad(buf)读取数据返回值的方法        FileInputStream fileInputStream = null;        try {            //创建 FileInputStream 对象,用于读取 文件            fileInputStream = new FileInputStream(filePath);            ////从这个输入流读最多 b.length 字节数据到字节数组。 在某些输入可用之前,这种方法会阻塞它。            /如果返回-1 , 说明读完了            //如果读得正常, 返回实际读取的字节数(即要读取的数据)            ///读取数据>buf数组的大小(8)最多返回8            //这个循环读取是在数组buf中读取数据,第一次读8个,第二次读3个数据            while((readLen = fileInputStream.read(buf))!=-1){//read()一次读取字节数据的方法                ///在这里解释new String(buf,0,readLen),String系统为String提供的构造器之一                //String s4 = new String(charD a,int startIndex,int count)                //功能传输数组、位置、长度,然后将数组转换为字符串                System.out.print(new String(buf,0,readLen));//显示            }        } catch (IOException e) {            e.printStackTrace();        }finally {            ////关闭文件流释放资源            try {                fileInputStream.close();            } catch (IOException e) {                e.printStackTrace();            }        }    }}

4.2案例演示Fileoutputstreamm:字节输出流616

IO流原理及流的分类_InputStream_04

要求:请使用Fileoutstream.“txt文件”写在txt文件中hello,world”.如果文件不存在,将创建文件(注:前提是目录已经存在.)

com中的代码.stulzl.outputstream_fileoutputstream.包中FileOutputStream_01

import org.junit.jupiter.api.Test;import java.io.FileOutputStream;import java.io.IOException;// 案例演示 FileOutputStream:字节输出流   616//要求: 请使用 FileOutputStream 在 a.txt 文件,中写入 “hello,world”.// 若文件不存在,会创建文件(注:前提是目录已经存在.)public class FileOutputStream_01 {    public static void main(String[] args) {    }    //演示使用 FileOutputStream 在文件中写下数据    @Test    public void writeFile(){        //创建Fileoutstream对象        String filePath = "e:\\a.txt";        FileOutputStream fileOutputStream = null;//定义Fileoutstream类型        try {            ///获得Fileoutstream对象            //1. new FileOutputStream(filePath) 创建方式,当内容被写入时,它将覆盖原始内容            //2. new FileOutputStream(filePath, true) 当写入内容时,创建方法是,它被添加到文件后面            //fileOutputStream = new FileOutputStream(filePath);            fileOutputStream = new FileOutputStream(filePath, true);            ///写字节            //fileOutputStream.write('H');            ///写字符串            String str = "hello,world!";            ///这里解释一下str.getBytes()方法可以将字符串转换为字节数组,重点哦            //fileOutputStream.write(str.getBytes());            ///另一种写字符串的方法,写入想要长度的字符串            fileOutputStream.write(str.getBytes(),0,5);//即 只写hello        } catch (IOException e) {            e.printStackTrace();        } finally {            try {                fileOutputStream.close();            } catch (IOException e) {                e.printStackTrace();            }        }    }}

4.3文件副本617

编程完成图片的复制.

com中的代码.stulzl.filecopy_.包中FileCopy_

package com.stulzl.filecopy_;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;//文件复制 617public class FileCopy_ {    public static void main(String[] args) {        //完成文件复制,将e:\\guidao.将jpg复制到d:\\        //思路        //1. 输入流创建文件 , 在程序中读取文件        //2. 输出流创建文件, 将读取的文件数据,写入指定文件        String srcFilePath = "e:\\guidao.jpg";        String destFilePath = "d:\\guidao.jpg";        //两种类型的定义者        FileInputStream fileInputStream = null;        FileOutputStream fileOutputStream = null;        try {            fileInputStream = new FileInputStream(srcFilePath);            fileOutputStream = new FileOutputStream(destFilePath);            byte[] buf = new byte[1024];///创建临时字节数组            int readLen = 0;            ///阅读文件资源,FileInputstream输入即将到来的图片资源-->程序            while((readLen=fileInputStream.read(buf))!=-1){///一次读1024个,不到1024个就读真实个数                //输出文件资源,即使用Fileoutstream输出流 程序-->目的地                //必须使用writete(buf,0,readLen)不能使用writeee的方法(buf)因为,可以读到最后真实                // 可能没有1024个文件资源,buf的使用意味着每次都有1024个                fileOutputStream.write(buf,0,readLen);            }            System.out.println(成功复制文件);        } catch (IOException e) {            e.printStackTrace();        } finally {            try {                ///关闭相应的流,释放资源                if(fileInputStream!=null){                    fileInputStream.close();                }                if(fileOutputStream!=null){                    fileOutputStream.close();                }            } catch (IOException e) {                e.printStackTrace();            }        }    }}