IO流【内存流、打印流、随机访问流】;初识网络编程

day37

IO流

继day36

各种流

对象流

day36

内存流

class ByteArrayInputStream – 内存输入流

class ByteArrayOutputStream – 内存输出流

注意:

  1. 内存流是程序和内存交互,跟文件无关
  2. 内存流是程序到内存的通道,是关闭不掉的

应用场景:项目中频繁使用的数据可以使用内存流备份一份

为什么使用内存流:

ps:内存(服务器)和硬盘(数据库):交互频繁,效率低
即使用Redis缓存数据库,减少交互【就是服务器先与缓存数据库交互】,其中缓存数据库使用到内存流

内存输出流

理解:无参构造32传有参构造,new数组,write方法中循环写入数组,当然其也有相应的扩容机制
不会直接返回数组地址,而是拷贝一份,考虑安全和线程安全,返回数据字符串给你

public class Test01 {public static void main(String[] args) throws IOException {//1.创建流对象ByteArrayOutputStream baos = new ByteArrayOutputStream();//关闭资源(内存流是程序到内存的通道,是关闭不掉的)//baos.close();//2.写入数据 -- 将数据写入到baos对象中的byte数组里baos.write("123abc木头人".getBytes());//获取流对象里的数据System.out.println(new String(baos.toByteArray()));System.out.println(baos.toString());}
}
内存输入流
public class Test02 {public static void main(String[] args) throws IOException {//1.创建流对象ByteArrayInputStream bais = new ByteArrayInputStream("123abc木头人".getBytes());//关闭资源(内存流是程序到内存的通道,是关闭不掉的)//bais.close();//2.读取数据byte[] bs = new byte[1024];int len;while((len = bais.read(bs)) != -1){System.out.println(new String(bs, 0,len));}}
}

打印流

class PrintStream – 字节打印流

class PrintWriter – 字符打印流

注意:打印流实际上就是输出流,只有一个方向(程序->文件)

PrintStream vs PrintWriter

区别1:PrintStream是以字节为单位,PrintWriter是以字符为单位

区别2:

​ PrintStream:将字节流转换为字节打印流

​ PrintWriter:将字节流和字符流转换为字符打印流

字节打印流
public class Test01 {public static void main(String[] args) throws IOException {//1.创建流对象//PrintStream ps = new PrintStream("io.txt");//1.创建流对象(字节流 -> 字节打印流)//PrintStream ps = new PrintStream(new FileOutputStream("io.txt"));//1.创建流对象(字节流 -> 字节打印流) + 在末尾追加PrintStream ps = new PrintStream(new FileOutputStream("io.txt",true));//2.写入数据ps.write("沙尘暴".getBytes());//3.关闭资源ps.close();}
}
字符打印流

输出流文件不存在的情况都会自动创建
工作中创建字符流一般都添加设置编码格式,但出现不能末尾追加;考虑前面两种情况和考虑效率,即new多个流转化,和带缓冲区的流

public class Test02 {public static void main(String[] args) throws IOException {//1.创建流对象//PrintWriter pw = new PrintWriter("io.txt");//1.创建流对象(字节流 -> 字节打印流)//PrintWriter pw = new PrintWriter(new FileOutputStream("io.txt"));//1.创建流对象(字节流 -> 字节打印流) + 在末尾追加//PrintWriter pw = new PrintWriter(new FileOutputStream("io.txt",true));//1.创建流对象(字符流 -> 字符打印流)//PrintWriter pw = new PrintWriter(new FileWriter("io.txt"));//1.创建流对象(字符流 -> 字符打印流) + 在末尾追加//PrintWriter pw = new PrintWriter(new FileWriter("io.txt",true));//1.创建流对象(设置编码格式 + 在末尾追加 + 考虑到效率)PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream("io.txt",true), "GBK")));//2.写入数据pw.write("沙尘暴");//3.关闭资源pw.close();	}
}
重定向

理解:重新定义系统标准的输入流、输出流、错误输出流的方向

System.in:获取系统标准输入流的方向(控制台->程序)
System.out:获取系统标准输出流的方向(程序->控制台)
System.err:获取系统标准错误输出流的方向(程序->控制台)

//重定向:重新定义系统标准输入流的方向(文件->程序)
System.setIn(new FileInputStream(“io.txt”));

//重定向:重新定义系统标准输出流的方向(程序->文件)
System.setOut(new PrintStream(new FileOutputStream(“io.txt”,true)));

//重定向:重新定义系统标准错误输出流的方向(程序->文件)
System.setErr(new PrintStream(new FileOutputStream(“io.txt”,true)));

回顾:day19【集合之前】标准输入、出、错误输出流有学习

重定向系统标准输入流的方向

System.in:获取系统标准输入流的方向(控制台->程序)

public class Test03 {public static void main(String[] args) throws FileNotFoundException {//重定向:重新定义系统标准输入流的方向(文件->程序)System.setIn(new FileInputStream("io.txt"));InputStream in = System.in;Scanner scan = new Scanner(in);String str = scan.next();System.out.println(str);scan.close();}
}
重定向系统标准输出流的方向

System.out:获取系统标准输出流的方向(程序->控制台)

字节打印流

public class Test04 {public static void main(String[] args) throws FileNotFoundException {//重定向:重新定义系统标准输出流的方向(程序->文件)System.setOut(new PrintStream(new FileOutputStream("io.txt",true)));PrintStream ps = System.out;ps.println("长城炮");}	
}
重定向系统错误输出流的方向

System.err:获取系统标准错误输出流的方向(程序->控制台)

另:打印到文件不会是红色,是黑色

public class Test05 {public static void main(String[] args) throws FileNotFoundException {//重定向:重新定义系统标准错误输出流的方向(程序->文件)System.setErr(new PrintStream(new FileOutputStream("io.txt",true)));PrintStream ps = System.err;ps.println("苍山雪洱海月");}
}

随机访问流

class RandomAccessFile

理解:该流认为文件是一个大型的byte数组。有一个隐藏的指针(默认为0),其实就是下标,可以从指针的位置写入或读取,意味着该流两个方向

模式:r-读,rw-读写

利用随机访问流 向文件写入数据

rw原因:读的权限比写的权限高
写入是替换对应字节数的内容,不像前面的流是全部清空替换

需求1:

向文件写入 数字、英文、中文数据

public class Test01 {public static void main(String[] args) throws IOException {//1.创建流对象RandomAccessFile w = new RandomAccessFile("io.txt", "rw");//2.写入数据w.write("123abc木头人".getBytes());//3.关闭资源w.close();}
}
需求2:

在文件末尾追加

public class Test02 {public static void main(String[] args) throws IOException {//1.创建流对象File file = new File("io.txt");RandomAccessFile w = new RandomAccessFile(file, "rw");//设置指针的位置w.seek(file.length());//2.写入数据w.write("123abc木头人".getBytes());//3.关闭资源w.close();}
}
利用随机访问流 读取文件里的数据
需求1:

读取数据

public class Test03 {public static void main(String[] args) throws IOException {//1.创建流对象RandomAccessFile r = new RandomAccessFile("io.txt", "r");//2.读取数据byte[] bs = new byte[1024];int len;while((len = r.read(bs)) != -1){System.out.println(new String(bs, 0, len));}//3.关闭资源r.close();}
}
需求2:

从英文处开始读取数据

ps:123abc木头人

public class Test04 {public static void main(String[] args) throws IOException {//1.创建流对象RandomAccessFile r = new RandomAccessFile("io.txt", "r");//设置指针的位置r.seek(3);//2.读取数据byte[] bs = new byte[1024];int len;while((len = r.read(bs)) != -1){System.out.println(new String(bs, 0, len));}//3.关闭资源r.close();}
}
拷贝文件 – 断点续传

设置指针,读写都要设置,保证断点续传,即从指针位置继续

public class Copy {public static void main(String[] args) throws IOException {RandomAccessFile r = new RandomAccessFile("奇男子.mp4", "r");File targetFile = new File("copy.mp4");RandomAccessFile w = new RandomAccessFile(targetFile, "rw");//设置指针long fileLength = targetFile.length();r.seek(fileLength);w.seek(fileLength);byte[] bs = new byte[1024];int len;while((len = r.read(bs)) != -1){w.write(bs, 0, len);}r.close();w.close();}
}

初识网络编程

实现多台计算机之间实现数据的共享和传递,网络应用程序主要组成为:

网络编程+IO流+多线程

理解图

TCP、UDP都是传输层的协议, HTTP属于应用层协议

TCP

​ 建立连接,形成传输数据的通道;在连接中进行大数据量传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低,例如:打电话

UDP

​ 将数据源和目的封装到数据包中,不需要建立连接;每个数据报的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快:例如发短信

HTTP

​ 建立连接:客户端通过TCP/IP协议建立与服务器的连接,发送请求:客户端发送HTTP请求,服务器处理,发送响应, 接收响应;关闭连接:在完成请求和响应后,客户端和服务器都可以选择关闭连接,释放资源。

初识网络编程理解图

总结

1.内存流

2.打印流

字节打印流、字符打印流、重定向

3.随机访问流

4.初识网络编程

流的大类:BIO(学)、NIO、AIO

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

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

相关文章

深度学习pytorch好用网站分享

深度学习在线实验室Featurizehttps://featurize.cn/而且这个网站里面还有一些学习教程 免费好用 如何使用 PyTorch 进行图像分类https://featurize.cn/notebooks/5a36fa40-490e-4664-bf98-aa5ad7b2fc2f 华为modelArtshttps://bbs.huaweicloud.com/forum/thread-76328-1-1.html…

阿里云飞燕平台搭建与linux程序通信(全图文教程)

阿里云飞燕平台搭建与linux程序通信(全图文教程) 一、MQTT理论1.1 概念1.2 理解发布和订阅1.3 MQTT传输的消息组成 二、阿里云飞燕平台搭建2.1 产品创建2.2 自定义自己的功能2.3 人机交互 三、测试3.1代码分析3.2 效果验证 一、MQTT理论 1.1 概念 MQTT…

vue3从精通到入门17:内置组件之Transition和TransitionGroup

Transition <Transition> 是一个内置组件&#xff0c;它用于在元素或组件的插入、更新和移除时应用过渡效果。Vue 3 的 <Transition> 组件提供了一个声明式的方式来处理这些过渡效果&#xff0c;使开发者能够更容易地添加动画到他们的 Vue 应用中。 基本概念 包裹…

蓝桥杯每日一题:鱼塘钓鱼(多路归并)

题目描述&#xff1a; 有 N 个鱼塘排成一排&#xff0c;每个鱼塘中有一定数量的鱼&#xff0c;例如&#xff1a;N5 时&#xff0c;如下表&#xff1a; 鱼塘编号12345第1分钟能钓到的鱼的数量&#xff08;1..1000&#xff09;101420169每钓鱼1分钟钓鱼数的减少量&#xff08;1…

指针的总结

公司面试题 定义&#xff1a; 1.一个整型数&#xff1a;int a; 2.一个指向整型数的指针&#xff1a;int *a 3.一个指向指针的 (指针)&#xff0c;它 (指向的指针) 指向一个整型数:int **a 4.一个有10个整型数的数组 : int a[10]; 5.一个有10个指针的数组&#xff0c;每个…

flutter组件_AlertDialog

官方说明&#xff1a;A Material Design alert dialog. 翻译&#xff1a;一个材料设计警告对话框。 作者释义&#xff1a;显示弹窗&#xff0c;类似于element ui中的Dialog组件。 AlertDialog的定义 const AlertDialog({super.key,this.icon,this.iconPadding,this.iconColor,t…

高阶函数,前端切片处理提升用户体验,代码复制即用

使用范围ALL /*** 高阶函数之数组切片* M楸M 前言* 好处: 解决页面卡顿加载缓慢问题* 常用于渲染真实dom节点数据量大问题* 从根源上去处理这个问题 页面卡顿基本原因是主线程阻塞16.6ms渲染一次* 在16.6毫秒间分段处理* **/ function performChunk(data, taskHandler, schedu…

边缘计算平台原理、关键功能以及技术优势

1、什么是边缘计算及其工作原理&#xff1f; 边缘计算是一种分布式计算模型&#xff0c;它将数据处理和存储靠近数据源头和最终用户的边缘设备上&#xff0c;从而减少了数据传输和延迟。边缘计算旨在解决云计算模型所面临的问题&#xff0c;例如延迟高、带宽瓶颈和安全性等问题…

【前端性能优化】使用惰性函数减少无意义的重复判断

什么是惰性函数&#xff1f; 惰性函数表示函数执行的分支只会在函数第一次调用的时候执行&#xff0c;在第一次调用过程中&#xff0c;该函数会被覆盖为另一个按照合适方式执行的函数&#xff0c;这样任何对原函数的调用就不用再经过执行的分支了。 惰性函数的本质就是函数重…

【JavaWeb】Day38.MySQL概述——数据库设计-DQL(一)

数据库设计——DQL 介绍 DQL英文全称是Data Query Language(数据查询语言)&#xff0c;用来查询数据库表中的记录。 查询关键字&#xff1a;SELECT 查询操作是所有SQL语句当中最为常见&#xff0c;也是最为重要的操作。在一个正常的业务系统中&#xff0c;查询操作的使用频次…

Python实现BOA蝴蝶优化算法优化随机森林分类模型(RandomForestClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蝴蝶优化算法(butterfly optimization algorithm, BOA)是Arora 等人于2019年提出的一种元启发式智能算…

synchronized用于静态方法与普通方法有区别吗?

Synchronized 关键字在 Java 中用于实现线程同步&#xff0c;确保在多线程环境下对共享资源的访问是安全的。当应用于方法时&#xff0c;它可以用于静态方法和普通方法&#xff0c;但二者之间确实存在一些区别。 锁的对象不同&#xff1a; 对于普通方法&#xff0c;锁的对象是调…

3.13 Python位运算符

Python位运算符详解 Python位运算按照数据在内存中的二进制位&#xff08;Bit&#xff09;进行操作&#xff0c;它一般用于底层开发&#xff08;算法设计、驱动、图像处理、单片机等&#xff09;&#xff0c;在应用层开发&#xff08;Web 开发、Linux 运维等&#xff09;中并不…

神经网络训练中batch的作用

在神经网络训练中&#xff0c;batch的作用主要包括以下几个方面&#xff1a; 减少内存占用和计算成本&#xff1a;在训练神经网络时&#xff0c;需要加载并处理大量的数据。使用batch训练可以将数据分成较小的批次&#xff0c;每次处理一小部分数据&#xff0c;从而减少内存占用…

数据库讲解---(SQL语句--练习题讲解)【MySQL版本】

目录 零.前言 一.例题一 1.1查询姓刘的老师所授课程的课程号和课程名 1.2查询年龄大于23岁的男同学的学号和姓名 1.3查询学号为S3的学生所学课程的课程号、课程名和任课教师姓名 1.4查询“张小飞”没有选修的课程号和课程名 1.5查询至少选修了三门课程的学生的学号和姓名…

cmake + mingw32构建和编译第三方lib库, qt 使用lib库

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 背景 qt 有两种编译器&#xff0c;分别是visual studio和MinGW。很多第三方库提供编译好的visual studio 库&#xff0c;MinGW库需要自己编译。喜欢MinGW没有太多版本…

Python的时间和日期:探索datetime模块

&#x1f680; 个人主页&#xff1a;xmp65535 &#x1f680; 专栏&#xff1a;python技术专栏 目录 一、前言 二、datetime 模块简介 三、基本使用 1.日期和时间的创建 2.获取当前日期和时间 3.时间戳与日期时间之间的转换 4.时间运算 5.格式化日期和时间 6.解析字符串…

vs2022启动cmake项目(qt+c++)

1.本工程&#xff0c;如图&#xff0c;1个cmakelist.txt3个文件 2.启动vs 3.选择文件夹 4.进入这个页面&#xff0c;就说明配置没问题 5.启动 6.最后会自己生成其他文件

Proteus 8 的使用记录

创建仿真文件 新建文件&#xff1a;默认下一步&#xff0c;至完成创建。 功能选择如图&#xff1a; 放置器件 常用元器件名称 keywords 常用51单片机 AT89C52 晶振 CRYSTAL 电阻 RES 排阻 RESPACK-8 瓷片电容 CAP 电解电容 CAP-ELEC 单刀单掷开关 S…

网络协议学习——以太网协议

目录 ​编辑 一&#xff0c;以太网简介 二&#xff0c;以太网通信的过程 为什么不用IP地址&#xff1f; 过程 MAC帧 MAC帧的字段介绍 ARP协议 传输过程的一些问题 RARP协议 提高效率 三&#xff0c;其他问题 ARP诈骗问题 URL解析过程 一&#xff0c;以太网简介 …