入门Java编程的知识点—>IO流(day13)

news2024/9/25 1:20:24
  • 重点掌握IO流作用是什么?
  • 重点掌握字节流的作用是什么?如何使用?
  • 重点掌握缓冲流的作用是什么?如何使用?

IO简介

I (in):输入指得就是从外界进入到程序的方向,通常我们是需要读取外界的数据,所以输入流就是用来读取数据的。

O(out):输出指的就是从程序发送到外界的方向,通常我们是需要写出数据到外界,所以输出流就是用来写出数据的。

编写程序除了自身定义一些数据信息时,经常也可能会用到外部的数据,或将自己写的数据发送给外部。

例如我们自己写的程序(APP)想要去读取一个文件,或者想往文件中写一些数据时,就需要用到输入和输出的功能。

Java将输入和输出的过程比喻为(流 Stream),想同一侧顺序移动的过程。

并且定义了两个超类

java.io.InputStream : 输入流

里面规定了所有字节输入流的读取方式,用来实际去读取不同设备的输入流都继承它,因此它里面定义了相关的读取操作.

java.io.OutputStream:输出流

里面规定了所有字节输出流的写出方式,用来实际去写出不同设备的输出流都继承它,因此它里面定义了相关的写出操作.

文件流

(可以进行读写文件数据。)

java.io.FileInputStream 和 FileOutputStream

分别继承 InputStream 和 OutputStream

需求,通过程序实现一个文件的拷贝工作.

  1. 通过程序获取被复制文件 -----从外输入到程序中获取则使用输入流

  2. 通过程序写出要拷贝文件 -----从程序中写出到磁盘上则使用输出流

package io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 文件拷贝演示:
 */
public class CopyDemo {

    public static void main(String[] args) throws IOException {
        //文件输入流
        FileInputStream fis = new FileInputStream("paimeng.jpg");//从外界获取图片
        //文件输出流
        FileOutputStream fos = new FileOutputStream("paimeng2.jpg");//拷贝到外界
        //如果读到的数据为 -1  读完了,如果读到的数据不为 -1 需要一直读
        /**
         *  paimeng.jpg 文件内容:
         *  11110000  11111000  00100111  ........
         * */
        int d;
        while ( (d = fis.read()) != -1) { //如果读到的数据不为 -1
            //进行拷贝
            /**
             *  paimeng2.jpg 目标文件
             *  11110000  11111000 00100111
             * */
            fos.write(d);
        }
        fis.close();
        fos.close();
    }
}

解决拷贝速度,提高每次读写的数据量,减少读写的次数,可以提高读写效率。

一组字节的读写是块读写的形式。

块读写的效率要好,随机读写要差。

package io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 拷贝demo02 -------:使用块读写的方式提高读写效率
 */
public class CopyDemo02 {

    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("./神里.jpeg");//建立输入流管道链接源文件
        FileOutputStream fos= new FileOutputStream("./神里4.jpeg");//建立输出流体管道 链接目标写出的文件
        int length;
        /**
         *  1b  ---- 8位
         *   b  ---字节
         *  1024b  ---- 1kb
         *  1024kb ---- 1Mb
         *  1024MB ---- 1GB
         *  1024GB ---- 1TB
         * */
        byte[] data = new byte[1024*10];//10kb
        long start = System.currentTimeMillis();
        while ((length =fis.read(data))!= -1){//读取后看下 如果不等于-1  那么就不是文件末尾
//            fos.write(data);//将读取到的data数组中的字节 一次行写入到文件中。
            /**
             * write(int b)  代表传入字节 来写出
             * write(byte[] byte)  代表传入一个字节数组 来写出
             */
            fos.write(data); //使用含有三个参数的write方法来实现 copy 解决
        }
        long end = System.currentTimeMillis();
        System.out.println("拷贝完毕,总共耗时:"+(end-start)+"ms");
        fis.close();//释放输入流体
        fos.close();//释放输出流体

    }
}

向文件中写入文本数据

package io;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
 * 向文件中写入 文本数据的演示:
 */
public class WriteStringDemo {

    public static void main(String[] args) throws IOException {
        /**
         *  FileOutputStream(String path,boolean append) //第二个参数代表是否追加内容的意思
         *  如果创建时,指定的第二个参数为true时,文件输出流将设置为追加模式
         *  也就是指定的文件存在的数据保留,新写入的数据都会继续向文件中进行追加
         * */
        FileOutputStream fos = new FileOutputStream("fos.txt",true);//建立链接fos文件的管道
        String line = "!!";
        //将line中的文本数据转换为字节数组
        byte[] data = line.getBytes(StandardCharsets.UTF_8);//"utf-8"
        //将转换后的字节数组内容写入到文件中
        fos.write(data);
//        line = "哈哈";
//        //将line中的文本数据转换为字节数组
//        data = line.getBytes(StandardCharsets.UTF_8);//"utf-8"
//        //将转换后的字节数组内容写入到文件中
//        fos.write(data);
        System.out.println("写出完毕");
        fos.close();//释放
    }
}

读取文本的演示:

package io;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
 * 从文本文件中读取文本数据 的演示类:
 */
public class ReadStringDemo {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("fos.txt");
        //流可以估算可以读到的字节量(不一定等同实际文件的长度,文件很大的话)
        int len = fis.available();
        byte[] data = new byte[len];
        fis.read(data);//将读到文件的字节内容存放到data数组里面
        String line = new String(data,"UTF-8");//将data数组内容转换为String
        System.out.println(line);
        fis.close();//释放
    }
}
java流的分类

节点流和处理流

节点流:称之为低级流,是真实连接程序与另一端的管道,读写一定是建立在节点流的基础上进行的。文件流就是节点流。

处理流:称之为高级流,是不能够独立存在的,必须要建立在其他流上面,目的就是当前数据流经过它的时候,可以做一些加工的处理,简化我们的操作。

实际开发过程中,我们经常会用到高级流,串联一组高级流到低级流上。

缓冲流是一对高级流,作用就是加快读写效率。

java.io.BufferedInputStream 缓冲输入流
java.io.BufferedOutputStream 缓冲输出流
package io;
import java.io.*;
/**
 *  缓冲 输入流和输出流的使用演示:
 *            加快读写效率
 * */
public class BOSDemo {

    public static void main(String[] args) throws IOException {
        //文件输入流					
        FileInputStream fis = new FileInputStream("中国风PPT.pptx");//从项目路径下获取资源文件
        BufferedInputStream bis = new BufferedInputStream(fis);
        //文件输出流
        FileOutputStream fos = new FileOutputStream("中国风PPT_copy.pptx");//拷贝到项目路径
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        int d;
        long start = System.currentTimeMillis();//获取系统时间  (毫秒单位) 拷贝开始

        while ( (d = bis.read()) != -1) {
            bos.write(d);
        }
        long end = System.currentTimeMillis();//拷贝结束的时间
        System.out.println("拷贝完毕!耗时:"+(end - start)+"ms");
        System.out.println("文件拷贝完成");
        bis.close();//释放高级流 内部其实也会帮把对应的低级流进行释放
        bos.close();//释放高级流 内部其实也会帮把对应的低级流进行释放
    }
}
  • 缓冲字节输出流,缓冲区会存在问题。

缓冲流是块读写,如果写的内容太少,并没有及时刷新的话,系统不会立即写出文件,导致有时候可能不及时存入数据的现象,那么需要手动调用flush刷新。

  //文件输出流
        FileOutputStream fos = new FileOutputStream("bos.txt");
        //缓冲输出流
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        String line = "圣诞节快乐!!!!!!";
        byte[] data = line.getBytes("utf-8");
        bos.write(data);
        bos.flush(); //手动刷新,强制将缓冲区中的内容 一次性写出
        System.out.println("写出完毕");

        bos.close();//关闭缓冲流 里面会做一次 flush 刷新。

总结

1. IO流作用是什么?

答:程序除了自身定义一些数据信息时,经常也可能会需要读取外部的数据,或将自己写的数据发送给外部。那么就需要用到输入流和输出流.

相对于程序来讲,外部文件读取到程序中使用输入流.

相对于程序来讲,外部文件写出到程序外使用输出流.

2. 字节流的作用是什么?如何使用?

答:字节流是低级流,通过字节读写的方式处理文件,字节流的读写都是单字节读写,所以读写效率低.

​ 字节流分为字节输入流FileInputStream 和 字节输出流FileOutputStream

3. 缓冲流的作用是什么?如何使用?

答:缓冲流是高级流,可以加速对于文件资源的读写效率,需要建立在字节流基础上来使用.

​ 缓冲流分为缓冲输入流BufferedInputStream 和 缓冲输出流 BufferedOutputStream

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2084149.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超越 CAPE 旧模式,P-CAPE 开创股市回报预测新局面

作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话: 本文主要介绍的是周期性调整市盈率(CAPE)及其倒数 CAEY 常用于评估股市长期回报,但原始 CAPE 有局限,未充分考虑未分配收益。未分配收益可再投资或回购股票影响收益。应调整周期性调整后的收益为…

【基础】Three.js中添加操作面板,GUI可视化调试(附案例代码)

1.先引入GUI库: import { GUI } from "three/addons/libs/lil-gui.module.min.js";2.实例化gui对象,并添加需要显示的参数: // 实例化一个gui对象const gui new GUI();//设置操作面板位置gui.domElement.style.right "0px";gui.d…

阿里云私有镜像仓库配置及使用

1 登录阿里云 阿里云访问地址:https://www.aliyun.com/ 右上角选择“控制台” 2 创建个人实例 搜索框搜索“容器镜像服务” 新建“个人实例” 选择“创建个人版” 同意协议,点击确定 3 个人实例配置 设置Registry登录密码 密码要求&#xff1…

【卷起来】VUE3.0教程-01-环境搭建与安装

​分享不易,耗时耗力,麻烦给个不要钱的关注和赞吧 🌲 什么是VUE Vue 是一个框架,也是一个生态。其功能覆盖了大部分前端开发常见的需求。但 Web 世界是十分多样化的,不同的开发者在 Web 上构建的东西可能在形式和规模…

扑捉一只耿鬼(HTML文件)

图例&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>耿鬼</title><style>body {background: #fff;font-family: Comfortaa, sans-serif;}* {box-sizing:…

【动图效果概览】自动化建链后,Exata调用STK更新卫星位置

如下图所示&#xff0c;动画遵循 时间前进方向&#xff0c;划分截取为5段 &#xff08;因为每张照片限制大小5MB&#xff0c;不够应该够看清个大概意思了&#xff09;&#xff1a;

BIO、NIO编程与直接内存、零拷贝详解

目录 一、网络通信编程基本常识 什么是 Socket&#xff1f; 短连接 长连接 什么时候用长连接&#xff0c;短连接&#xff1f; 网络编程里通用常识 二、Java 原生网络编程-BIO 原生 JDK 网络编程 BIO 原生 JDK 网络编程 NIO 什么是 NIO&#xff1f; 和BIO 的主要区别 NI…

C语言中的运算符

一,算数运算符 基本算术运算符&#xff1a; 加法&#xff08;&#xff09;&#xff1a;用于两个数相加。例如 int a 3 5;&#xff0c;结果 a 的值为 8。 减法&#xff08;-&#xff09;&#xff1a;两个数相减。如 int b 7 - 4;&#xff0c;b 的值为 3。 乘法&#xff08;*…

使用推测解码提高 LLM 推理速度

使用尖端优化技术加速推理的实用指南 欢迎来到雲闪世界。大型语言模型非常耗电&#xff0c;需要大量 GPU 资源才能发挥良好性能。然而&#xff0c;Transformer 架构并没有充分利用 GPU。 从设计上讲&#xff0c;GPU 可以并行处理&#xff0c;但 Transformer 架构是自回归的。为…

哈希表两数求和

leetcode题目链接 这道题思路可以说easy 首先想到的就是两层for循环 代码如下 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {vector<int>result;int lengthnums.size();for(int i0;i<length;i){for(int ji1;j<…

【drools】电影推荐搭建

同步用了很久很久 反复了很多了次,最终: drools用的都是9.*** Y9KP 代码 D:\Future\06_movie-recommendation-system-springboot-drools-rule-engine\recommendation\src\main\resources\com.recommendation.movie.rules\medicine_symptoms.drl在spring boot 中集成drools做电…

16.神经网络 - 卷积层

神经网络 - 卷积层 pytorch官网网站卷积层&#xff08;Convolution Layers&#xff09;&#xff1a;Convolution Layers nn.Conv1d 一维卷积Applies a 1D convolution over an input signal composed of several input planes.nn.Conv2d 二维卷积Applies a 2D convolution ov…

扁线电机介绍

相比于圆线&#xff0c;扁线因为扁平矩形的特殊性能够让线圈缠绕更加紧密&#xff0c;槽满率由原先的40%提升到70%。 这意味着相同体积下线圈中的导线更多&#xff0c;电流的传导效率更高&#xff0c;能够减少电阻损耗&#xff0c;产生的磁场更强&#xff0c;电机功率也就更大&…

【软件工程】软件与软件危机

考点1 软件与软件危机 一、软件 1. 定义 在计算机系统支持下&#xff0c;能够完成特定功能和性能的程序、数据和相关的文档。 2. 软件的分类 二、软件危机 在计算机软件开发和维护过程中所遇到的一系列严重问题。 1. 包含两个方面&#xff1a; 如何开发软件如何维护软件…

Rocm-HIP kernel language

HIP的内核启动语法hipLaunchKernelGGL是一个宏&#xff0c;可以作为启动内核的替代方式&#xff0c;它接受启动配置的参数&#xff08;网格维度、分组维度、流、动态共享大小&#xff09;以及任意数量的内核参数。这个宏可以替代CUDA中的三连字符&#xff08;<<< >…

[记录] linux 虚拟机装 windows10

简介 本机系统&#xff1a;Ubuntu22.04 虚拟机&#xff1a;gnome-boxes 相关资料&#xff1a;度盘 安装流程 安装 gnome-boxes sudo apt install gnome-boxes安装 windows10 打开 Boxes, 选择准备好的 windows10 ISO 文件 可以从官网下载&#xff0c;也可以从我给的资料里获…

OpenCV小练习:身份证号码识别

目标&#xff1a;针对一张身份证照片&#xff0c;把身份证号码识别出来&#xff08;转成数字或字符串&#xff09;。 实现思路&#xff1a;需要将目标拆分成两个子任务&#xff1a;(1) 把身份证号码区域从整张图片中检测/裁剪出来&#xff1b;(2) 将图片中的数字转化成文字。第…

【python】OpenCV—Multi Human Pose Estimation

文章目录 1、背景介绍2、关键点检测模型3、源码与结果4、源码解读——检测关键点5、源码解读——找到有效对6、源码解读——组装个人关键点7、涉及到的库cv2.dnn.blobFromImage 8、参考 1、背景介绍 【python】OpenCV—Single Human Pose Estimation 本文以 COCO 格式为例&am…

低代码门户技术:赋能业务灵活性与创新的新时代

随着数字化转型的深入推进&#xff0c;各行各业对灵活、高效的技术解决方案的需求日益增长。在这个背景下&#xff0c;低代码门户技术应运而生&#xff0c;为企业提供了一种新颖的应用开发方式。今天&#xff0c;我们将探讨低代码门户技术的基本概念、优势以及如何在实际应用中…

uni-app启动本地开发环境,修改默认端口号

vite.config.js: import { defineConfig } from "vite"; import uni from "dcloudio/vite-plugin-uni";// https://vitejs.dev/config/ export default defineConfig({server: {port: 3006,},plugins: [uni()], });人工智能学习网站 https://chat.xutong…