java进阶(三)

news2025/1/22 16:13:35

IO与网络编程

  • 3 输入输出流IO
    • 3.1 基础定义
    • 3.2 IO框架
    • 3.3 读取字节输入流-InputStream
      • 3.3.1 InputStream.read
      • 3.3.2 FileInputStream类说明
    • 3.4读取字符输入流Reader
      • 3.4.1 Reader.read
      • 3.4.2 FileReader类说明
    • 3.5 字节输出流OutputStream
      • 3.5.1 OutputStream.write
      • 3.5.2 FileOutputStream类说明
    • 3.6字符输出流Writer
      • 3.6.1 Writer.write
      • 3.6.2 FileWriter类说明
    • 3.7 BufferedInputStream类说明

3 输入输出流IO

3.1 基础定义

java的输入输出流是比较难懂的地方,什么是java.io?

I/O 是指Input/Output,即输入和输出。
Input指从外部读入数据到内存,例如,把文件从磁盘读取到内存,从网络读取数据到内存等等。
Output指把数据从内存输出到外部,例如,把数据从内存写入到文件,把数据从内存输出到网络等等。

Java程序在执行的时候,是在内存进行的,外部的数据需要读写到内存才能处理;而在内存中的数据是随着程序结束就消失的,有时候我们也需要把数据输出到外部文件。Java中,是通过流 处理IO的,这种处理模式称为 IO流,IO流是一种顺序读写数据的模式。
你可以想象它是一根水管,数据就像水一样, 起点—终点 可互相流动。

在这里插入图片描述

  • 源头
    从文件、网络、管道,我们称之为目标源

  • 输入/输出
    从目标源读取到内容,我们叫输入,用InputStream或者Reader相关子类来处理。
    从内存输出到目标源,我们称之为输出,用OutputStream或者Writer相关子类来处理

  • 传递介质
    我们想要把目标源转化成Byte或者Char才能传输,Byte用InputStream/OutputStream来操作,Char用Reader/Writer来操作。
    一般情况,视频、音频、图片等,用byte来传递;文字类的用Char来传递方便一些

3.2 IO框架

1.4大框架类

类型字节流字符流
输入流InputStreamReader
输出流OutputStreamWriter

在这里插入图片描述

3.3 读取字节输入流-InputStream

InputStream 这个抽象类是表示输入字节流的所有类的超类(父类)。

3.3.1 InputStream.read

InputStream 中的三个基本的读方法:

  • int read() :
    读取一个字节数据,并返回读到的数据,如果返回 -1,表示读到了输入流的末尾。
  • int read(byte[] b) :
    将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。
  • int read(byte[] b, int off, int len) :
    将数据读入一个字节数组,同时返回实际读取的字节数。如果返回 -1,表示读到了输入流的末尾。off 指定在数组 b 中存放数据的起始偏移位置;len 指定读取的最大字节数。

InputStream子类

ByteArrayInputStream
FileInputStream
FilterInputStream
PushbackInputStream
DataInputStream
BufferedInputStream
LineNumberInputStream
ObjectInputStream
PipedInputStream
SequenceInputStream
StringBufferInputStream

其中最重要的是FileInputStream、BufferedInputStream

3.3.2 FileInputStream类说明

FileInputStream是文件字节输入流,就是对文件数据以字节的方式来处理,如音乐、视频、图片等。

  //1.一个一个和字节读入
    @Test
    public void t2() throws IOException {
        FileInputStream fis=new FileInputStream("d:\\x.txt");
        int dataByte=0;
        //1.一个一个和字节读入,如果返回-1,表示读取到末尾
        while((dataByte=fis.read())!=-1){
            System.out.print((char)dataByte);
        }
        fis.close();
    }

    //以字节数组读入
    @Test
    public void t3() throws IOException {
        File file=new File("d:\\x.txt");
        InputStream fis=new FileInputStream(file);
        int byte_len=0;
        byte[]bytes=new byte[8];
        //一个字节数组的读出数据,放置到bytes数组李,高效
        while((byte_len=fis.read(bytes))!=-1){
            System.out.print(new String(bytes));
//            for (int i = 0; i < byte_len; i++) {
//                System.out.print((char) bytes[i]);
//            }
        }


    }

    //一次性读入
    @Test
    public void t4() throws IOException {
        File file=new File("d:\\a.txt");
        InputStream fis=new FileInputStream(file);
        //把流里面左右内容转化为字节,jdk1.9以上提供
        byte[]bytes =  fis.readAllBytes();
        System.out.println(new String(bytes));

        //或者用以下方法
        /**
        int iAvail = fis.available(); //总的字节数
        int byte_len=0;
        byte[]bytes2=new byte[iAvail];
        //一个字节数组的读出数据,放置到bytes数组李,高效
        while((byte_len=fis.read(bytes2))!=-1){
            System.out.println(new String(bytes2));
        }
      **/
    }

注意:
英文一般占用1个字节,中文占用3个字节,直接用FileInputStream操作字符形式的文件,容易出现乱码,所以视频、音频、图片这些非字符型的流处理才直接使用FileInputStream

3.4读取字符输入流Reader

我们程序很多时候是操作字符型的输入流,如果用字节inputStream来读取,其是以字节byte形式,容易出现乱码,用Reader操作的是字符流,是字符,不会出现乱码

3.4.1 Reader.read

两则都是通过read方法来读取,一个是直接,一个是字符。

读取方法说明
InputStreamint read();//读取一个字节,返回的是字节,本身是一个整数
int read(byte[] bs) //把流内容读取到字节数组bs里
Readerint read();//读取的是一个字符char,返回这个字符对应的整数
int read(char[] chs) //把流的内容读取到一字符数组里

3.4.2 FileReader类说明

我们这个例子是以Reader->InputStreamReader->FileReader为例子

 @Test
    public void t5() throws IOException {
        File file = new File("d:\\x.txt");
        Reader reader=new FileReader(file);
        //一个一个字符读取,注意read返回的是一个整数,用char可以转化为对应的char
        //在java中,char可以用整数表示
        int  ch;
        while((ch=reader.read())!=-1){
            System.out.print((char)ch);
        }
        reader.close();

    }

    @Test
    public void t6() throws IOException {
        File file = new File("d:\\x.txt");
        Reader reader=new FileReader(file);
        //读取一个字符数组,高效
        int  len=-1;
        char[] ch=new char[10];
         //这里字符数组的大写可以任意定义,也可以定义全部大小
        //ch=new char[(int)file.length()];  //这个写法是long->int,如果文字内容太大,可能造成丢失
        while((len=reader.read(ch))!=-1){
            System.out.print(new String(ch));
        }

        //或者这样写  
        while((len=reader.read(ch,0,10))!=-1){
            System.out.print(new String(ch));
        }
        reader.close();

    }

3.5 字节输出流OutputStream

3.5.1 OutputStream.write

OutputStream最重要的方法就是write
OutputStream源码

 /**
  b就是字节值
  如果读完流后返回-1
     */
public abstract void write(int b) throws IOException;

    /**
   字节数组
   如果读完流后返回-1
     */
    public void write(byte b[]) throws IOException {
        write(b, 0, b.length);
    }

    /**
     字节数组
     如果读完流后返回-1
     */
    public void write(byte b[], int off, int len) throws IOException {
        Objects.checkFromIndexSize(off, len, b.length);
        // len == 0 condition implicitly handled by loop bounds
        for (int i = 0 ; i < len ; i++) {
            write(b[off + i]);
        }
    }

3.5.2 FileOutputStream类说明

OutputStream->FileOutputStream,FileOutputStream是处理文件流的类

 @Test
    public void t7() throws IOException {
        File file = new File("d:\\jj.txt");
        //把字符串写入
        OutputStream os=new FileOutputStream(file);
        String str="我热你温\n你个蛤蟆皮";
        os.write(str.getBytes());
        os.close();


    }

    //文件复制

    @Test
    public void t8() throws IOException {
        File file = new File("d:\\a.txt");
        File target = new File("d:\\jb.txt");
        InputStream is=new FileInputStream(file);
        OutputStream os=new FileOutputStream(target);
        int len=-1;
        byte[] bs=new byte[10];
        while((len=is.read(bs))!=-1){
            os.write(bs);
        }
        System.out.println("copy ok");
        is.close();
        os.close();


    }

    @Test
    public void t9() throws IOException {
        File file = new File("d:\\a.txt");
        File target = new File("d:\\jb.txt");
        InputStream is=new FileInputStream(file);
        OutputStream os=new FileOutputStream(target);
        int c=-1;

        while((c=is.read())!=-1){
            os.write(c);
        }
        System.out.println("copy ok");
        is.close();
        os.close();
    }

3.6字符输出流Writer

OutputStream一般用于视频、音频、图片等非字符类的资源流,如果是文字类型,用Writer最方便

3.6.1 Writer.write

和OutputStream一致,其最重要的方法就是write方法
Writer源码:

/**
    输入一个char字符对应的整数
 */
public void write(int c) throws IOException {
        synchronized (lock) {
            if (writeBuffer == null){
                writeBuffer = new char[WRITE_BUFFER_SIZE];
            }
            writeBuffer[0] = (char) c;
            write(writeBuffer, 0, 1);
        }
    }

    /**
     输入char数组
     */
    public void write(char cbuf[]) throws IOException {
        write(cbuf, 0, cbuf.length);
    }

    /**
  字符串
     */
    public void write(String str) throws IOException {
        write(str, 0, str.length());
    }

    /**
  字符串
     */
    public void write(String str, int off, int len) throws IOException {
        synchronized (lock) {
        .....
        }
    }

3.6.2 FileWriter类说明

代码说明

@Test
    public void t10() throws IOException {
        File file = new File("d:\\x.txt");
        String str="宇宙第一胎神,四川蛤蟆皮";
        Writer writer=new FileWriter(file);
        writer.write(str);
        writer.close();
    }

    @Test
    public void t11() throws IOException {

        File file = new File("d:\\a.txt");
        File target = new File("d:\\jb2.txt");
        Reader rd=new FileReader(file);
        Writer wt=new FileWriter(target);
        int c=-1;
        //读取字符
        while((c=rd.read())!=-1){
            wt.write(c);
        }
        System.out.println("copy ok");
        rd.close();
        wt.close();
    }

    @Test
    public void t12() throws IOException {

        File file = new File("d:\\a.txt");
        File target = new File("d:\\jb3.txt");
        Reader rd=new FileReader(file);
        Writer wt=new FileWriter(target);
        int len=-1;
        char[] cs=new char[20];
        //读取字符
        while((len=rd.read(cs))!=-1){
            wt.write(cs);
        }
        System.out.println("copy ok");
        rd.close();
        wt.close();
    }

3.7 BufferedInputStream类说明

使用方式基本和FileInputStream一致。

BufferedInputStream有一个内部缓冲区数组,一次性读取较多的字节缓存起来,默认读取defaultBufferSize = 8192,作用于读文件时可以提高性能。

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

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

相关文章

Docker容器基础知识点总结

一 、Docker架构 dockers加速镜像&#xff1a; sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https://z90yxq2m.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restar…

thinkphp6.0升级到8.0

目录 一&#xff1a;升级过程 二&#xff1a;报错处理 最近写的项目需要使用thinkphp8.0&#xff0c;之前的老项目需要从php6.0升级到8.0&#xff0c;特此记录下升级过程。 一&#xff1a;升级过程 查看版本&#xff1a; php think version,我目前的版本是6.1.4 生成thin…

Rust学习笔记001:HELLOW WORLD + Cargo

Rust介绍 Rust&#xff08;中文称为“锈”&#xff09;是一种由Mozilla开发的系统编程语言&#xff0c;它着力于提供安全性、并发性和实用性。Rust的设计目标是消除程序出现的内存安全性问题&#xff0c;如空指针引用、数据竞争等。它通过在编译时进行严格的所有权和借用检查来…

Java实现树结构(为前端实现级联菜单或者是下拉菜单接口)

Java实现树结构&#xff08;为前端实现级联菜单或者是下拉菜单接口&#xff09; 我们常常会遇到这样一个问题&#xff0c;就是前端要实现的样式是一个级联菜单或者是下拉树&#xff0c;如图 这样的数据接口是怎么实现的呢&#xff0c;是什么样子的呢&#xff1f; 我们可以看看 …

【jdk与tomcat配置文件夹共享防火墙设置(入站出站规则)】

目录 一、jdk与tomcat配置 1.1 jdk配置 1.2 tomcat配置 二、文件夹共享 2.1 为什么需要配置文件夹共享功能 2.2 操作步骤 2.2.1 高级共享 2.2.2 普通共享 2.3 区别 三、防火墙设置&#xff08;入站规则&出站规则&#xff09; 3.1 入站规则跟出站规则 3.2 案例…

【低代码平台】10个开源免费Airtable 的替代方案

Airtable是一个易于使用的简单低代码平台&#xff0c;有助于团队协作管理复杂的数据表&#xff0c;并创建定制的工作流程。把它想象成一个类固醇上的云电子表格。 Airtable还简化了数据输入过程&#xff0c;连接和集成第三方服务和应用程序&#xff0c;并提供了许多数据导入/导…

第二部分 离散型随机变量

目录 求分布律里的未知数 例1 例2 根据X的分布律写Y的分布律 例3 根据(X,Y)的分布律写Z的分布律 例4 根据(X,Y)的分布律写边缘分布律 例5 X与Y相互独立时的联合分布律 例6 根据分布律求期望、方差 例7 求分布律里的未知数 例1 已知X的分布律为 X-202P0.40.3k ,试求k 解 0.40…

普中STM32-PZ6806L 使用FlyMcu串口烧录程序

简介 我的串口下载电路坏掉了, 所以研究了下如何通过USB转TTL进行程序的下载, 为后续Bootloader部分做准备;连接 我的板几乎是十年前买的&#xff0c; 所以电路与现有网上的资料有些差异, 所以仅供参考 USB 转 TTL线 与开发板 连接&#xff0c; 如图图中 ①, 需要去掉第一个…

[2024区块链开发入门指引] - 比特币运行原理

一份为小白用户准备的免费区块链基础教程 工欲善其事,必先利其器 Web3开发中&#xff0c;各种工具、教程、社区、语言框架.。。。 种类繁多&#xff0c;是否有一个包罗万象的工具专注与Web3开发和相关资讯能毕其功于一役&#xff1f; 参见另一篇博文&#x1f449; 2024最全面…

RFC6749-OAuth2.0

前言 最近在项目中需要实现SSO(单点登录)功能,以实现一处注册,即可在任何平台之间登录的功能。我们项目中并没有直接对接第三方认证系统而是通过集成keycloak 完成一系类安全协议的对接工作。如果我们在代码级别自己完成各种安全协议的对接是一项十分大的工程。不仅要走统一的…

提取 PE 文件的各种信息

前段时间项目需要实现对 Windows PE 文件版本信息的提取&#xff0c;如文件说明、文件版本、产品名称、版权、原始文件名等信息。获取这些信息在 Windows 下当然有一系列的 API 函数供调用&#xff0c;简单方便。 我们先看一下PE文件结构&#xff0c;PE文件由DOS首部&#xff0…

【网络面试(4)】协议栈和套接字及连接阶段的三次握手原理

1. 协议栈 一直对操作系统系统的内核协议栈理解的比较模糊&#xff0c;借着这一篇博客做一下简单梳理&#xff0c; 我觉得最直白的理解就是&#xff0c;内核协议栈就是操作系统中的一个网络控制软件&#xff0c;就是一段程序代码&#xff0c;它负责和网卡驱动程序交互&#xff…

【nodejs】前后端身份认证

前后端身份认证 一、web开发模式 服务器渲染&#xff0c;前后端分离。 不同开发模式下的身份认证&#xff1a; 服务端渲染推荐使用Session认证机制前后端分离推荐使用JWT认证机制 二、session认证机制 1.HTTP协议的无状态性 了解HTTP协议的无状态性是进一步学习Session认…

appium入门基础

介绍 appium支持在不同平台的UI自动化&#xff0c;如web,移动端,桌面端等。还支持使用java&#xff0c;python&#xff0c;js等语言编写自动化代码。主要用于自动化测试脚本&#xff0c;省去重复的手动操作。 Appium官网 安装 首先必须环境有Node.js用于安装Appium。 总体来…

接入Cloudflare后Nginx和Django获取用户真实IP的办法

可以用Nginx的real_ip的相关命令来实现这个需求。 01-real_ip命令集详解 real_ip命令的使用分为两个步骤: 01-1-设置从哪些代理IP获取真实IP 第1个步骤&#xff1a;通过set_real_ip_from命令设置从哪些代理IP请求获取真实的IP,比如下面的命令&#xff1a; set_real_ip_from…

2022年全球软件质量效能大会(QECon北京站2022)-核心PPT资料下载

一、峰会简介 当前&#xff0c;新一轮科技革命和产业变革正在重塑全球经济格局&#xff0c;以云计算为代表的新一代信息技术创新活跃&#xff0c;与实体经济深度融合&#xff0c;推动泛在连接、数据驱动、智能引领的数字经济新形式孕育而生。 新兴技术的出现给测试乃至整个软…

探索 Vue 异步组件的世界:解锁高效开发的秘密(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

JavaScript 基础通关

快速熟悉 JavaScript 的基础语法&#xff0c;比较高级的比如事件放在后面的笔记中。 JavaScript 1. JavaScript 介绍 1.1 JavaScript 基本介绍 JavaScript 是一门运行在客户端&#xff08;浏览器&#xff09;的编程语言&#xff0c;实现人机交互的效果。实现网页特效、表单验…

SpringBoot学习(一)

注&#xff1a;此为笔者学习狂神说SpringBoot的笔记&#xff0c;其中包含个人的笔记和理解&#xff0c;仅做学习笔记之用&#xff0c;更多详细资讯请出门左拐B站&#xff1a;狂神说!!! Spring Boot 是一种基于 Spring 框架的开发模式&#xff0c;旨在简化 Spring 应用程序的创…

学生管理系统(vue + springboot)

学生管理系统&#xff08;vuespringboot&#xff09;资源-CSDN文库 项目介绍 这是一个采用前后端分离开发的项目&#xff0c;前端采用 Vue 开发、后端采用 Spring boot Mybatis 开发。 项目部署 ⭐️如果你有 docker 的话&#xff0c;直接 docker compose up 即可启动&#…