java-IO

news2024/9/23 11:15:18

  JAVA IO

- java io可以让我们用标准的读写操作来完成对不同设备的读写数据工作.

- java将IO按照方向划分为输入与输出,参照点是我们写的程序.

- 输入:用来读取数据的,是从外界到程序的方向,用于获取数据.

- 输出:用来写出数据的,是从程序到外界的方向,用于发送数据.

  java将IO比喻为"流",即:stream. 就像生活中的"电流","水流"一样,它是以同一个方向顺序移动的过程.只不过这里流动的是字节(2进制数据).所以在IO中有输入流和输出流之分,我们理解他们是连接程序与另一端的"管道",用于获取或发送数据到另一端.

Java定义了两个超类(抽象类):

- java.io.InputStream:

所有字节输入流的超类,其中定义了读取数据的方法.因此将来不管读取的是什么设备(连接该设备的流)都有这些读取的方法,因此我们可以用相同的方法读取不同设备中的数据


- java.io.OutputStream:

所有字节输出流的超类,其中定义了写出数据的方法.

 java将流分为两类:节点流与处理流:

- 节点流:

也称为低级流.节点流的另一端是明确的,是实际读写数据的流,读写一定是建立在节点流基础上进行的.


- 处理流:

也称为高级流.处理流不能独立存在,必须连接在其他流上,目的是当数据流经当前流时对数据进行加工处理来简化我们对数据的该操作.

实际应用中,我们可以通过串联一组高级流到某个低级流上以流水线式的加工处理对某设备的数据进行读写,这个过程也成为流的连接,这也是IO的精髓所在.

文件流

  文件流是一对低级流,用于读写文件数据的流.用于连接程序与文件(硬盘)的"管道".负责读写文件数据.

文件输出流:java.io.FileOutputStream


package io;

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

/**
 * JAVA IO  Input&Output  输入和输出
 * java程序与外界交换数据是基于IO完成的,这里输入与输出一个负责读一个负责写
 * 输入:是从外界到我们写的程序的方向,是用来从外界获取信息的。因此是"读"操作
 * 输出:是从我们写的程序到外界的方向,是用来向外界发送信息的。因此是"写"操作
 *
 * java将IO比喻为"流",可以理解为是程序与外界连接的"管道",内部流动的是字节,并且
 * 字节是顺着同一侧方向顺序移动的。
 *
 * java.io.InputStream 输入流,这个类是所有字节输入流的超类,规定了所有字节输入
 * 流读取数据的相关方法。
 * java.io.OutputStream 输出流,这个类是所有字节输出流的超类,规定了所有字节输出
 * 流写出数据的相关方法。
 *
 * 实际应用中,我们连接不同的设备,java都专门提供了用于连接它的输入流与输出流,而
 * 这些负责实际连接设备的流称为节点流,也叫低级流。是真实负责读写数据的流。
 * 与之对应的还有高级流,高级流可以连接其他的流,目的是当数据流经它们时,对数据做某
 * 种加工处理,用来简化我们的操作。
 *
 *
 * 文件流
 * java.io.FileInputStream和FileOutputStream
 * 这是一对低级流,继承自InputStream和OutputStream。用于读写硬盘上文件的流
 *
 */
public class FOSDemo {
    public static void main(String[] args) throws IOException {

        //向当前目录下的demo.dat文件中写入数据
        /*
            FileOutputStream提供的常用构造器
            FileOutputStream(String path)
            FileOutputStream(File file)
         */
        //文件流创建时,如果该文件不存在会自动将其创建(前提是该文件所在目录必须存在!)
        FileOutputStream fos = new FileOutputStream("./demo.dat");
        /*
            void write(int d)
            向文件中写入1个字节,写入的内容是给定的int值对应的2进制的"低八位"

            int值 1:                         vvvvvvvv
            二进制:00000000 00000000 00000000 00000001
            demo.dat文件内容:
            00000000

         */
        fos.write(1);
        /*
                                       vvvvvvvv
            00000000 00000000 00000000 00000010

            demo.dat文件内容
            00000001 00000010
         */
        fos.write(2);

        fos.close();
        System.out.println("执行完了!");


    }
}

 文件输入流FileInputStream


package io;

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

/**
 * end 结尾
 * read 读
 *
 *
 * 文件字节输入流,用于从文件中读取字节
 */
public class FISDemo {
    public static void main(String[] args) throws IOException {
        /*
            fos.dat文件内容
            00000001 00000011
         */
        FileInputStream fis = new FileInputStream("fos.dat");
        /*
            int read()
            读取一个字节,并一int型返回。返回的整数中读取的字节部分在该整数2进制的最后8位上
            如果返回值为整数-1,则表示流读取到了末尾。对于读取文件而言就是EOF(end of file
            文件末尾)

            第一次调用read():
            int d = fis.read();
            fos.dat文件内容
            00000001 00000011
            ^^^^^^^^
            读取该字节

            返回int值时,2进制样子:
            00000000 00000000 00000000 00000001
                                       ^^^^^^^^
            |-----补充24个0(3字节)-----| 读取的字节

            返回的int值d就是上述内容
         */
        int d = fis.read();
        System.out.println(d);

        /*
            第二次调用read()
            d = fis.read();
            fos.dat文件内容
            00000001 00000011
                     ^^^^^^^^
                     读取该字节

            返回int值时,2进制样子:
            00000000 00000000 00000000 00000011
                                       ^^^^^^^^
            |-----补充24个0(3字节)-----| 读取的字节

            返回的int值d就是上述内容
         */
        d = fis.read();
        System.out.println(d);

       /*
            第三次调用read()
            d = fis.read();
            fos.dat文件内容
            00000001 00000011
                              ^^^^^^^^
                              文件末尾了

            返回int值时,2进制样子:
            11111111 11111111 11111111 11111111
                                       ^^^^^^^^
            |-----补充32个1(4字节,来表示-1)-----|

            返回的int值d就是上述内容
         */
        d = fis.read();
        System.out.println(d);

        fis.close();
    }
}

总结:   

    Java中的IO(Input/Output)是指处理输入和输出数据的机制。通过IO,可以将数据从一个地方发送到另一个地方,如从文件读取数据,或将数据写入到文件中。Java提供了丰富的IO类和接口来支持各种IO操作。

Java的IO库可以分为两个大类:基于字节流的IO和基于字符流的IO

基于字节流的IO:

  • InputStream和OutputStream是所有字节流的父类,分别用于从源读取字节和将字节写入目标。
  • FileInputStream和FileOutputStream用于从文件中读取字节和将字节写入文件。
  • BufferedInputStream和BufferedOutputStream提供了缓冲的功能,加快IO的速度。
  • ByteArrayInputStream和ByteArrayOutputStream用于读取和写入内存中的字节数组。
  • DataInputStream和DataOutputStream用于以特定的格式读取和写入基本数据类型。
  • ObjectInputStream和ObjectOutputStream可以将对象序列化和反序列化,实现对象的读写。

基于字符流的IO:

  • Reader和Writer是所有字符流的父类,分别用于从源读取字符和将字符写入目标。
  • FileReader和FileWriter用于从文件中读取字符和将字符写入文件。
  • BufferedReader和BufferedWriter提供了缓冲的功能,加快IO的速度。
  • CharArrayReader和CharArrayWriter用于读取和写入内存中的字符数组。
  • InputStreamReader和OutputStreamWriter用于将字节流转换为字符流。
  • StringReader和StringWriter用于将字符串作为字符流进行读写。

另外,Java还提供了一些特殊的IO类和接口,如:

  • RandomAccessFile可以随机访问文件,既可以读取文件的任意位置,也可以在任意位置写入数据。
  • PrintStream和PrintWriter提供了方便的打印功能,可以将数据格式化后写入目标。
  • BufferedReader和Scanner可以用于从输入流中逐行读取数据。
  • FileOutputStream和FileInputStream可以用于读写文件的元数据,如文件权限、创建时间等。

     

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

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

相关文章

Dubbo源码解析第一期:如何使用Netty4构建RPC

一、背景 早期学习和使用Dubbo的时候(那时候Dubbo还没成为Apache顶级项目),写过一些源码解读,但随着Dubbo发生了翻天覆地的变化,那些文章早已过时,所以现在计划针对最新的Apache Dubbo源码来进行“阅读理解…

关于eNSP中主机/PC与USG网络不可达的解决方案

check points:主机防火墙、网段、接口配置、ping权限、接口安全域; 1、主机 确认当前在联网络的属性(专用网络/公共网络),本机防火墙有无放通;检查 eNSP内防火墙 接口配置:IP地址是否配置到了正…

浅谈AcrelEMS-CIA机场智慧能源管平台解决方案-安科瑞 蒋静

1 概述 机场智慧能源管平台解决方案对机场范围内变电站内的高低压配电设备 、 发电机、变压器 、UPS、EPS 、广场照明 、 室内照明 、通风及排水等机电设备进行实时分布式监控和集中管理 , 实现无人值守 , 确保高速公路安全畅通 , 提高 自动化管理水平 , 降低机电设备的运行维…

插入排序(一)——直接插入排序与希尔排序

目录 一.前言 二.排序的概念及其运用 1.1排序的概念 1.2 常用排序算法 三.常用排序算法的实现 3.1 插入排序 3.1.1 基本思想 3.1.2 直接插入排序 3.1.3 希尔排序(缩小增量排序) 四.全部代码 sort.c sort.h test.c 五.结语 一.前言 本文我们…

Android.mk和Android.bp的区别和转换详解

Android.mk和Android.bp的区别和转换详解 文章目录 Android.mk和Android.bp的区别和转换详解一、前言二、Android.mk和Android.bp的联系三、Android.mk和Android.bp的区别1、语法:2、灵活性:3、版本兼容性:4、向后兼容性:5、编译区…

【数据结构】快速排序,归并排序

快速排序 1.hoare版本 根据动图的演示,整理的思路如下, 1.定义left,right,key。key默认是左边第一个元素,像两个指针,左边找比key大的,右边找比k小的,找到的话,交换二者,往返这个过…

限流算法之流量控制的平滑之道:滑动时间窗算法

文章目录 引言简介优点缺点样例样例图样例代码 应用场景结论 引言 在互联网应用中,流量控制是一个重要的组件,用于防止系统过载和保护核心资源。常见的限流算法包括固定窗口算法和滑动时间窗算法。本文将重点介绍滑动时间窗算法,并分析其优缺…

Spring Boot程序的打包与运行:构建高效部署流程

引言 在现代应用开发中,高效的打包和部署流程对于项目的开发、测试和上线至关重要。Spring Boot作为一种快速开发框架,提供了方便的打包工具和内嵌式的Web服务器,使得打包和运行变得更加简单。本文将研究在Spring Boot应用中如何进行打包&am…

java8 列表通过 stream流 根据对象属性去重的三种实现方法

java8 列表通过 stream流 根据对象属性去重的三种实现方法 一、简单去重 public class DistinctTest {/*** 没有重写 equals 方法*/SetterGetterToStringAllArgsConstructorNoArgsConstructorpublic static class User {private String name;private Integer age;}/*** lombo…

梁山泊国潮风礼盒,传承经典,贺礼新春

在春节来临之际,梁山泊隆重推出新年中国红礼盒酒,为您传递新年的祝福与关爱。这款酒以其独特的魅力,为您带来美好的祝愿和愉悦的享受。中国风国潮礼盒采用中国传统红色为主色调,象征着吉祥、喜庆和繁荣。红色的背景上,…

探索curl的高级应用:HTTP请求的大师级技巧

探索curl的高级应用:HTTP请求的大师级技巧 引言高级用法概览1. HTTP请求与响应处理2. 身份验证与安全3. 进阶技巧4. Cookie管理与会话保持5. 脚本自动化 HTTP请求与响应处理1. 自定义请求头2. 发送数据3. 处理响应 身份验证与安全1. 基本认证2. 摘要认证3. HTTPS安全…

禅道使用之项目的过程管理

目录 一.禅道介绍 二.禅道下载 三. 禅道的使用 3.1.禅道管理员管理账号 3.2.禅道管理产品经理角色操作 3.3.禅道管理项目经理角色操作 3.4.禅道管理测试主管角色操作 3.5.禅道管理产品经理发布版本 好啦今天就这里了哦!!!希望能帮到你…

Unity-Arduino Bluetooth Plugin蓝牙插件使用时需要注意的一些事项(附插件下载链接)

一些参考链接 1.Android 无法扫描蓝牙设备踩坑 2.权限相关 1-首先要明确你的蓝牙设备是经典蓝牙还是低功耗(BLE)蓝牙: 转载:Android蓝牙开发—经典蓝牙和BLE(低功耗)蓝牙的区别 2.如果是BLE蓝牙,需要打勾…

Github 2024-01-20开源项目日报 Top10

根据Github Trendings的统计,今日(2024-01-20统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4Jupyter Notebook项目2Lua项目1C项目1PHP项目1Vue项目1非开发语言项目1C项目1 PhotoMaker: 定制逼…

nvm, node.js, npm, yarn 安装配置

文章目录 nvm 安装node.js 安装npm yarn 配置 nvm 安装 nvm 是一个 node.js 管理工具,可以快捷下载安装使用多个版本的node.js linux 命令行输入: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bashwget -qO- https…

程序员的福利到了,轮转数组,经典算法实战

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

ES框架详解

ES框架详解 1、全文检索的介绍 ​ 那么对于一般的公司,初期是没有那么多数据的,所以很多公司更倾向于使用传统的数据库:mysql;比如我们要查找关键字”传智播客“,那么查询的方式大概就是:select * from table where …

2024WebGIS新手必看学习攻略(2)

上期给大家分享了webgis开发学习的第一期,点这里:2024WebGIS新手必看学习攻略(1)https://mp.csdn.net/mp_blog/creation/editor/135680818 主要讲了webgis最基本的前置知识,上期我们介绍到学习webGIS的语言&#xff0…

OpenSource - 工具管理器easy-manager-tool

文章目录 功能说明运行配置环境配置启动docker部署 项目安全UI展示 Easy-Manager-Tool 打造软件行业首款集成工具,不管你是程序员,测试,运维等都可以使用该软件来提升自己的工作效率。 Easy-Manager-Tool 的诞生是为了解决软件行业众多参与者…

java发送邮件、接收邮件

邮件协议 SMTP SMTP (Simple Mail Transfer Protocol),即简单邮件传输协议 默认端口是25,通过SSL协议加密之后的默认端口是465 用户必须首先设置 SMTP 服务器,然后才能配置电子邮件客户端与其连接。完成此操作后,用户按下电子…