首页 > 其他分享 >IO流原理及流的分类

IO流原理及流的分类

时间:2023-05-20 13:08:29浏览次数:39  
标签:文件 读取 分类 String FileOutputStream IO FileInputStream 及流 字节

1. IO 流原理及流的分类  614

1.1 Java IO 流原理

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

2. Java程序中, 对于数据的输入/输出操作以”流(stream)" 的方式进行。

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

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

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

1.2 流的分类

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

按数据流的流向不同分为:输入流,输出流

按流的角色的不同分为:节点流,处理流/包装流

IO流原理及流的分类_java

1) Java的IO流共涉及40多个类,实际上非常规则,都是从如上4个抽象基类派生的。

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

2. IO 流体系图-常用的类  614

2.1 IO 流体系图

IO流原理及流的分类_IO_02

2.2 文件 VS 流

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

3. InputStream:字节输入流  615

3.1  InputStream抽象类是所有类字节输入流的超类

3.1.1  InputStream常用的子类  615

FileInputStream:文件输入流

BufferedInputStream:缓冲字节输入流

ObjectInputStream:对象字节输入流

4. FileInputStream和FileOutputStream

4.1  案例演示FileInputStream:文件输入流  615

请使用 FileInputStream 读取 hello.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;//用来存储read(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 案例演示 FileOutputStream:字节输出流 616

IO流原理及流的分类_IO_04

要求: 请使用 FileOutputStream 在 a.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(){
        //创建一个FileOutputStream对象
        String filePath = "e:\\a.txt";
        FileOutputStream fileOutputStream = null;//定义一个FileOutputStream类型
        try {
            //得到FileOutputStream对象
            //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;

//文件拷贝 617
public 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个就读取真实个数
                //输出文件资源,即使用FileOutputStream输出流 程序-->目的地
                //一定要使用write(buf,0,readLen)方法而不能使用write(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();
            }
        }
    }
}

标签:文件,读取,分类,String,FileOutputStream,IO,FileInputStream,及流,字节
From: https://blog.51cto.com/u_15784725/6317321

相关文章

  • Visual Studio1.76.0Mac软件安装包下载VS软件安装教程
    [名称]:VisualStudio1.76.0Mac[大小]:2M[语言]:简体中文 [适用系统]:macOS系统[简介]:VisualStudio是微软推出的一款C++编译器,将“高级语言”翻译为“机器语言(低级语言)”的程序,VS是一个非常完整的开发工具集,包括了所有软件生命周期中所需的大部分工具,如UML工具、代码管控工具、集成开......
  • P5179 Fraction 题解
    题目描述给你四个正整数\(a,\,b,\,c,\,d\),求一个最简分数\(\frac{p}{q}\)满足\(\frac{a}{b}<\frac{p}{q}<\frac{c}{d}\)。若有多组解,输出\(q\)最小的一组,若仍有多组解,输出\(p\)最小的一组。前置知识:Stern-Brocot树首先引入分数逼近。这里的分数逼近是指用用一个......
  • AtCoder Regular Contest 130 C Digit Sum Minimization
    洛谷传送门AtCoder传送门分类讨论,但是写起来挺答辩的。首先发现我们要使进位尽量多。特判怎么重排都没有进位的情况(\(a_i+b_i<10\))。然后枚举个位选的两个数字,并且要求它们和\(\ge10\)。如果当前位两个位都有数字,那么从小到大枚举数位的和\(\in[9,18]\);如果有数字......
  • ASP.NET Core(二):IOC、DI,即依赖注入和控制反转
    此文只是从中摘录整理下自己感兴趣的部分,以便备忘和方便查找回顾,详见:Artech-博客园(cnblogs.com)《ASP.NETCore6框架揭秘》整个ASP.NETCore框架建立在一个底层的依赖注入框架之上,它使用依赖注入容器提供所需的服务对象。服务服务通常由组件提供,组件可以理解成......
  • May 2022-Neighborhood Mixup Experience Replay: Local Convex Interpolation for Im
    摘要:经验回放在提高深度强化学习智能体的样本效率方面起着至关重要的作用。经验回放的最新进展建议使用Mixup-2018,通过合成样本生成进一步提高样本效率。在这种技术的基础上,提出了邻域混合经验回放(NMER),一种基于几何的回放缓冲区,用状态-动作空间中最近邻的转换进行插值。NMER仅......
  • Java文件与IO流
    首先我们要清楚什么是流,正如其名,很形象,流就是像水一样的东西,具有方向性,在java中,流大概就是类接下来,我们要对输入输出流有一个基本认识,什么是输入输出流呢?输入输出明显需要一个参照,而这个参照就是主存。清楚了上面的概念,我们接着看下去吧。文件文件的创建文件创建共有三种......
  • 一种基于token 和 Permission 的权限管理中间件示例
    1.先上封装后的使用效果[Permission(Key="/User/AddUser")][HttpPost]publicResultAddUser([FromBody]SaUseruser){//Dosth.thrownewNotImplementedException();}[Authorize]......
  • ChatGPT 推出 iOS 应用,支持语音输入,使用体验如何?
    最近,OpenAI宣布推出官方iOS应用,允许用户随时随地访问其高人气AI聊天机器人,此举也打破了近几个月内苹果AppStore上充斥似是而非的山寨服务的窘境。该应用程序是ChatGPT的首个官方移动应用程序。ChatGPT软件程序在去年推出后迅速获得了超过1亿用户,这也让技术行业火速......
  • Connections could not be acquired from the underlying database!
    报错内容:五月19,20239:02:42上午org.apache.catalina.core.StandardWrapperValveinvoke严重:在路径为的上下文中,Servlet[springmvc]的Servlet.service()引发了具有根本原因的异常Requestprocessingfailed;nestedexceptionisorg.springframework.transaction.CannotCreat......
  • flutter系列之:使用AnimationController来控制动画效果
    目录简介构建一个要动画的widget让图像动起来总结简介之前我们提到了flutter提供了比较简单好用的AnimatedContainer和SlideTransition来进行一些简单的动画效果,但是要完全实现自定义的复杂的动画效果,还是要使用AnimationController。今天我们来尝试使用AnimationController来实现......