java进阶(三)

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.一个一个和字节读入@Testpublic 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();}//以字节数组读入@Testpublic 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]);
//            }}}//一次性读入@Testpublic 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为例子

 @Testpublic 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();}@Testpublic 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 boundsfor (int i = 0 ; i < len ; i++) {write(b[off + i]);}}

3.5.2 FileOutputStream类说明

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

 @Testpublic 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();}//文件复制@Testpublic 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();}@Testpublic 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类说明

代码说明

@Testpublic void t10() throws IOException {File file = new File("d:\\x.txt");String str="宇宙第一胎神,四川蛤蟆皮";Writer writer=new FileWriter(file);writer.write(str);writer.close();}@Testpublic 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();}@Testpublic 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.mzph.cn/news/588663.shtml

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

相关文章

nodejs微信小程序+python+PHP特困救助供养信息管理系统-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

分库分表之Mycat应用学习四

4 分片策略详解 分片的目标是将大量数据和访问请求均匀分布在多个节点上&#xff0c;通过这种方式提升数 据服务的存储和负载能力。 4.1 Mycat 分片策略详解 总体上分为连续分片和离散分片&#xff0c;还有一种是连续分片和离散分片的结合&#xff0c;例如先 范围后取模。 …

基于AT89C51单片机可做实物的温度烟雾火灾报警设计

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/88658141?spm1001.2014.3001.5503 C 源码仿真图毕业设计实物制作步骤02 摘要 随着现代家庭用火、用电量的增加&#xff0c;家庭火灾发生的频率越来越高。火灾报警…

浅学lombok

Lombok&#xff08;Project Lombok&#xff09;是一个用于 Java 编程语言的开源库&#xff0c;旨在减少 Java 代码中的冗余和样板代码&#xff0c;提高开发人员的生产力。它通过使用注解来自动生成 Java 类的常见方法和代码&#xff0c;从而使开发人员能够编写更简洁、更具可读…

ColibriSM v1.4.2 已注册– 仿脸书类社交网络PHP源码

ColibriSM&#xff1a;当代社交网络平台的崛起 一、开篇与概述 在信息时代的浪潮中&#xff0c;社交媒体成为了人们日常生活中不可或缺的一部分。ColibriSM&#xff0c;作为一个仿照脸书&#xff08;Facebook&#xff09;、推特&#xff08;Twitter&#xff09;和照片墙&#…

WPF 新手指引弹窗

新手指引弹窗介绍 我们在第一次使用某个软件时&#xff0c;通常会有一个“新手指引”教学引导。WPF实现“新手指引”非常方便&#xff0c;且非常有趣。接下来我们就开始制作一个简单的”新手指引”(代码简单易懂&#xff0c;便于移植)&#xff0c;引用到我们的项目中又可添加一…

Windows电脑引导损坏?按照这个教程能修复

前言 Windows系统的引导一般情况下是不会坏的&#xff0c;小伙伴们可以不用担心。发布这个帖子是因为要给接下来的文章做点铺垫。 关注小白很久的小伙伴应该都知道&#xff0c;小白的文章都讲得比较细。而且文章与文章之间的关联度其实还是蛮高的。在文章中&#xff0c;你会遇…

使用uni-app editor富文本组件设置富文本内容及解决@Ready先于onload执行,无法获取后端接口数据的问题

开始使用富文本组件editor时&#xff0c;不知如何调用相关API设置富文本内容和获取内容&#xff0c;本文将举例详解 目录 一.了解editor组件的常用属性及相关API 1.属性常用说明 2.富文本相关API说明 1&#xff09;editorContext 2&#xff09; editorContext.setContents…

【Leetcode】第 378 场周赛

文章目录 100166. 检查按位或是否存在尾随零题目题意代码 100185. 找出出现至少三次的最长特殊子字符串 I题目思路代码 100184. 找出出现至少三次的最长特殊子字符串 II 100166. 检查按位或是否存在尾随零 题目 题意 这里题目要求的是或运算&#xff0c;所以原数组中只需要有…

LeetCode每日一题.04(不同路径)

一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&#xff1f; 示例 1…

Spring Cloud + Vue前后端分离-第10章 基于阿里云OSS的文件上传

源代码在GitHub - 629y/course: Spring Cloud Vue前后端分离-在线课程 Spring Cloud Vue前后端分离-第10章 基于阿里云OSS的文件上传 前面介绍的文件上传是基于本地文件服务器的文件上传&#xff0c;但是自己搭文件服务器会有很多运维的问题&#xff0c;比如磁盘满了要扩容…

Spark SQL简介与基本用法

Apache Spark是一个强大的分布式计算框架&#xff0c;Spark SQL是其组件之一&#xff0c;用于处理结构化数据。Spark SQL可以使用SQL查询语言来查询和分析数据&#xff0c;同时还提供了与Spark核心API的无缝集成。本文将深入探讨Spark SQL的基本概念和用法&#xff0c;包括数据…

Flink Job 执行流程

Flink On Yarn 模式 ​ 基于Yarn层面的架构类似 Spark on Yarn模式&#xff0c;都是由Client提交App到RM上面去运行&#xff0c;然后 RM分配第一个container去运行AM&#xff0c;然后由AM去负责资源的监督和管理。需要说明的是&#xff0c;Flink的Yarn模式更加类似Spark on Ya…

mysql间隙锁demo分析

概述 通常用的mysql都是innodb引擎&#xff1b; 一般在update的时候用id都会认为是给行记录加锁&#xff1b; 在使用非唯一索引更新时&#xff0c;会遇到临键锁&#xff08;范围锁&#xff09;&#xff1b; 临键锁和表中的数据有关&#xff1b; mysq版本:8 隔离级别&#xf…

jmeter的常用功能及在测试中的基本使用和压测实战

Jmeter基础功能 了解Jmeter的常用组件 元件&#xff1a;多个类似功能组件的容器&#xff08;类似于类&#xff09; 一&#xff1a;Test Plan&#xff08;测试计划&#xff09; 测试计划通常用来给测试的项目重命名&#xff0c;使用多线程脚本运行时还可以配置线程组运行方式…

【C++】STL 容器 - map 关联容器 ① ( std::map 容器简介 | std::map 容器排序规则 | std::map 容器底层实现 )

文章目录 一、std::map 容器1、std::map 容器简介2、std::map 容器排序规则3、std::map 容器底层实现 二、代码示例 - std::map 容器1、代码示例2、执行结果 一、std::map 容器 1、std::map 容器简介 std::map 容器 是 C 语言 标准模板库 ( STL , Standard Template Library ) …

分布式技术之数据复制技术

文章目录 什么是数据复制技术&#xff1f;数据复制技术原理及应用同步复制技术原理及应用异步复制技术原理及应用半同步复制技术原理及应用三种数据复制技术对比 什么是数据复制技术&#xff1f; 数据复制是一种实现数据备份的技术。数据复制技术&#xff0c;可以保证存储在不…

Plantuml之甘特图语法介绍(二十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

磁盘和文件系统管理

一&#xff1a;磁盘结构&#xff1a; 1.磁盘基础&#xff1a; 扇区固定大小&#xff0c;每个扇区4k。磁盘会进行磨损&#xff0c;损失生命周期。 设备文件&#xff1a; 一切皆文件 设备文件&#xff1a;关联至一个设备驱动程序&#xff0c;进而能够跟与之对应硬件设备进行通…

Rust学习笔记000 安装

安装命令 curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh $ curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh info: downloading installerWelcome to Rust!This will download and install the official compiler for the Rust programming la…