当前位置: 首页 > news >正文

梁山做网站价格南山做网站的公司

梁山做网站价格,南山做网站的公司,代理公司注册地址,区块链技术开发一、摘要 说到 IO#xff0c;相信大家都不陌生#xff0c;英文全称#xff1a;Input/Output#xff0c;即输入/输出#xff0c;通常指数据在内部存储器和外部存储器或其他周边设备之间的输入和输出。 比如我们常用的SD卡、U盘、移动硬盘等等存储文件的硬件设备#xff…一、摘要 说到 IO相信大家都不陌生英文全称Input/Output即输入/输出通常指数据在内部存储器和外部存储器或其他周边设备之间的输入和输出。 比如我们常用的SD卡、U盘、移动硬盘等等存储文件的硬件设备当我们将其插入电脑的 usb 硬件接口时我们就可以从电脑中读取设备中的信息或者写入信息这个过程就涉及到 I/O 的操作。 当然涉及 I/O 的操作也不仅仅局限于硬件设备的读写还有网络数据的传输。比如我们在电脑上用浏览器搜索互联网上的信息这个信息的过程也涉及到 I/O 的操作。 无论是从磁盘中读写文件还是在网络中传输数据可以说 I/O 主要为处理人机交互、机与机交互中获取和交换信息提供的一套解决方案。 在 Java 的 IO 体系中类将近有 80 个位于java.io包下初步看起来感觉非常复杂但是经过一番梳理之后你会发现还是有规律可循的。 从传输数据的格式角度看可以大致分为两组 基于字节操作的 I/O 接口InputStream 和 OutputStream基于字符操作的 I/O 接口Reader 和 Writer 从传输数据的方式角度看也可以大致分为两组 基于磁盘操作的 I/O 接口File基于网络操作的 I/O 接口Socket 虽然 Socket 类并不在java.io包下但是我们仍然把它们划分在一起因为 I/O 的核心问题要么是数据格式影响 I/O 操作要么是传输方式影响 I/O 操作也就是将什么样的数据写到什么地方的问题。 I/O 只是人与机器或者机器与机器交互的手段除了在它们能够完成这个交互功能外我们关注的就是如何提高它的运行效率而数据格式和传输方式是影响效率最关键的因素。 下面我们基于这两点来展开分析 二、传输格式的分类 从传输格式角度看可以分两类字节流和字符流。 基于字节的输入和输出操作接口分别是InputStream 和 OutputStream基于字符的输入和输出操作接口分别是Reader 和 Writer 。 2.1、字节流接口 字节流是 I/O 流中最底层的流能处理任何类型的数据传输比如文字、图片、视频、文件等。 2.1.1、基于字节输入流的接口 打开 JDK 源码整理之后InputStream 输入流接口的类继承层次如下图所示 这些输入流类根据角色不同还可以进行分类分为节点流和处理流。 节点流指的是向指定的设备比如磁盘、网络进行读/写数据也被称为底层流直接和数据源相接处理流指的是在已存在的节点流或者处理流基础上包装一些更加方便操作 io 流的功能比如压缩、序列化、缓冲操作等也被称为包装流 输入流类根据角色的划分类别如下 OutputStream 输出流的类层次结构也是类似。 2.1.2、基于字节输出流的接口 OutputStream 输入流接口的类继承层次如下图所示 字节输出流类根据角色的划分类别如下 这里就不详细的介绍各个子类的使用方法有兴趣的朋友可以查看 JDK 的 API 说明文档笔者也会在后期的系列文章会进行详细的介绍。 这里只是重点想说一下无论是输入还是输出操作数据的方式可以组合使用各个处理流的类并不是只操作固定的节点流比如如下输出方式 //将文件输出流包装到序列化输出流中再将序列化输出流包装到缓冲中 OutputStream out new BufferedOutputStream(new ObjectOutputStream(new FileOutputStream(new File(fileName)))另外输出流最终写到什么地方必须要指定要么是写到硬盘中要么是写到网络中从图中可以发现写网络实际上也是写文件只不过写到网络中需要经过底层操作系统将数据发送到其他指定的计算机中而不是写入到本地硬盘中。 2.2、字符流接口 不管是磁盘还是网络传输最小的存储单元都是字节而不是字符所以 I/O 操作的都是字节而不是字符。 那为什么要有操作字符的 I/O 接口呢 这是因为我们的程序中通常操作的数据都是以字符形式为了程序操作更方便而提供一个直接写字符的 I/O 接口仅此而已 除此之外使用字节流操控文字时不是很方便容易乱码由此诞生了不同的字符集以及对应的字符编码规则 由于全世界的文字博大精深不同的字符集占用的字节位数不同以中文为例在GBK编码规则中一个中文使用二个字节存储而在UTF-8编码规则中一个中文使用三个字节存储如果写入和读取的编码规则不一样读取的字节数很容易裂开导致出现乱码。 比如以下案例 public static void main(String[] args) throws Exception {byte[] bytes 学习Java语言.getBytes(ISO8859-1);File file new File(encoding.txt);OutputStream out new FileOutputStream(file);out.write(bytes);out.close(); }文件的内容如下 ??Java??为了更方便地处理中文这些字符计算机就推出了字符编码规则。 实现原理字节流 编码表。 当写入一段文字时会使用指定的字符集将该 String 编码为一系列字节将结果存储到新的字节数组中进行传输当读取一段文字时通过指定的字符集解码指定的字节数组来构造新的 String从而解决文字乱码的问题。 2.2.1、基于字符输入流的接口 Reader 输入流接口的类继承层次如下图所示 同样的字符输入流类根据角色的划分类别如下 2.2.2、基于字符输出流的接口 Writer 输出流的类继承层次如下图所示 字符输出流类根据角色的划分类别如下 2.3、字节与字符的转化 刚刚我们说到不管是磁盘还是网络传输最小的存储单元都是字节而不是字符设计字符的原因是为了程序更方便的操作文本。 那么怎么将字符转化成字节或者将字节转化成字符呢 其中InputStreamReader和OutputStreamWriter就是转化桥梁。 2.3.1、输入流转换方案 输入流字符解码相关类结构的转化过程如下图所示 从图上可以看到InputStreamReader类是字节到字符的转化桥梁 其中StreamDecoder指的是一个解码操作类Charset指的是字符集。 InputStream到Reader的过程需要指定编码字符集否则将采用操作系统默认字符集很可能会出现乱码问题StreamDecoder则是完成字节到字符的解码的实现类。 案例如下 File file new File(encoding.txt); FileInputStream inputStream new FileInputStream(file); //字节输入流转为字符输入流 InputStreamReader streamReader new InputStreamReader(inputStream, Charset.forName(UTF-8));2.3.2、输出流转换方案 输出流转化过程也是类似如下图所示 通过OutputStreamWriter类完成字符到字节的编码过程由StreamEncoder 完成编码过程。 案例如下 File file new File(output.txt); FileOutputStream outputStream new FileOutputStream(file); //字符输出流转字节输出流 OutputStreamWriter streamWriter new OutputStreamWriter(outputStream, Charset.forName(UTF-8));三、传输方式的分类 上文我们介绍了数据的传输格式可以通过字节流和字符流接口来完成数据的传输至于数据写到何处主要取决于数据的传输方式。 从传输方式角度看可以分两类磁盘和网络。 基于磁盘操作的操作接口是File基于网络操作的操作接口是Socket 3.1、文件接口 我们知道数据在磁盘的唯一最小描述就是文件也就是说上层应用程序只能通过文件来操作磁盘上的数据文件也是操作系统和磁盘驱动器交互的一个最小单元。 在 Java I/O 体系中File类是唯一代表磁盘文件本身的对象。 File 类定义了一些与平台无关的方法来操作文件包括检查一个文件是否存在、创建、删除文件、重命名文件、判断文件的读写权限是否存在、设置和查询文件的最近修改时间等等操作。 值得注意的是 Java 中通常的 File 并不代表一个真实存在的文件对象当你通过指定一个路径描述符时它就会返回一个代表这个路径相关联的一个虚拟对象这个可能是一个真实存在的文件或者是一个包含多个文件的目录。 例如读取一个文件内容程序如下 public static void main(String[] args) throws Exception {StringBuilder str new StringBuilder();char[] buf new char[1024];// 读取文件的内容FileReader f new FileReader(input.txt);while(f.read(buf)0){str.append(buf);}str.toString(); }以上面的程序为例从硬盘中读取一段文本字符操作流程如下图 当我们传入一个指定的文件名来创建File对象通过FileReader来读取文件内容时会自动创建一个FileInputStream对象来读取文件内容也就是我们上文中所说的字节流来读取文件。 紧接着会创建一个FileDescriptor的对象其实这个对象就是真正代表一个存在的文件对象的描述。 由于我们需要读取的是字符格式所以需要StreamDecoder类通过解码方法decode将字节转字符至于如何从磁盘驱动器上读取一段数据由操作系统帮我们完成。 3.2、网络接口 继续来说说数据传输的另一种处理方式网络通信。 3.2.1、Socket 简介 在 Java 网络体系中Socket是描述计算机之间完成相互通信一种抽象定义。 光从描述看可能很难理解打个比方可以把Socket比作为两个城市之间的交通工具有了它就可以在城市之间来回穿梭了并且交通工具有多种每种交通工具也有相应的交通规则。 Socket 也一样也有多种大部分情况下我们使用的都是基于 TCP/IP 的流套接字它是一种稳定的通信协议。 比较典型的基于 Socket 通信的应用程序场景如下图 主机 A 的应用程序要想和主机 B 的应用程序通信必须通过 Socket 建立连接而建立 Socket 连接必须需要底层 TCP/IP 协议来建立 TCP 连接。 3.2.2、建立通信链路 我们知道网络层使用的 IP 协议可以帮助我们根据 IP 地址来找到目标主机但是一台主机上可能运行着多个应用程序如何才能与指定的应用程序通信呢 这个时候需要通过 TCP 或 UPD 协议也就是指定对应的端口号。 通过 IP 端口号就可以创建一个代表唯一一个主机上的一个应用程序的通信链路了创建后的通信链路我们称它为 Socket 实例。 以 TCP 协议为例为了准确无误地把数据送达目标处TCP 协议采用了三次握手策略如下图 其中SYN 全称为 Synchronize Sequence Numbers表示同步序列编号是 TCP/IP 建立连接时使用的握手信号。 ACK 全称为 Acknowledge character即确认字符表示发来的数据已确认接收无误。 在客户机和客户机之间建立正常的 TCP 网络连接时发送端首先发出一个 SYN 消息接收端使用 SYN ACK 应答表示接收到了这个消息最后发送端再以 ACK 消息响应。 整体流程如下 发送端 –发送带有 SYN 标志的数据包 – 接受端第一次握手接受端 –发送带有 SYN ACK 标志的数据包– 发送端第二次握手发送端 –发送带有 ACK 标志的数据包 – 接受端第三次握手 完成三次握手之后发送端和接收端之间建立起可靠的 TCP 连接客户端应用程序与服务器应用程序就可以开始传送数据了。 3.2.3、传输数据 当客户端要与服务端通信时客户端首先要创建一个 Socket 实例也就是指定目标服务器的 IP 和端口。 默认操作系统将为这个 Socket 实例分配一个没有被使用的本地端口号并创建一个包含本地、远程地址和端口号的套接字数据结构这个数据结构将一直保存在系统中直到这个连接关闭。 客户端简单示例 public static void main(String[] args) throws IOException {//通过IP和端口与服务端建立连接Socket socket new Socket(127.0.0.1,8080);//将字符流转化成字节流并输出BufferedWriter bufferedWriter new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));String strHello我是客户端!;bufferedWriter.write(str);bufferedWriter.flush();bufferedWriter.close(); }服务端简单示例 public static void main(String[] args) throws Exception {//初始化服务端socket并且绑定 8080 端口ServerSocket serverSocket new ServerSocket(8080);//循环监听所有连接的客户端请求while (true){try {//等待客户端的连接Socket socket serverSocket.accept();//将字节流转化成字符流读取客户端输入的内容BufferedReader bufferedReader new BufferedReader(new InputStreamReader(socket.getInputStream()));//读取一行数据String str bufferedReader.readLine();//输出打印System.out.println(服务端收到客户端发送的信息 str);} catch (Exception e) {}} }我们先启动服务端程序再运行客户端服务端收到客户端发送的信息打印结果如下 服务端收到客户端发送的信息Hello我是客户端!注意客户端只有与服务端建立三次握手成功之后才会发送数据而 TCP/IP 握手过程底层操作系统已经帮我们实现了 当连接已经建立成功服务端和客户端都会拥有一个Socket实例每个Socket实例都有一个InputStream和OutputStream正如我们前面所说的网络 I/O 都是以字节流传输的Socket正是通过这两个对象来交换数据。 当Socket对象创建时操作系统同时将会为InputStream和OutputStream分别分配一定大小的缓冲区数据的写入和读取都是通过这个缓存区完成的。 发送端将数据写到OutputStream对应的SendQ队列中当队列填满时数据将被发送到另一端InputStream的RecvQ队列中如果这时RecvQ已经满了那么OutputStream的write方法将会阻塞直到RecvQ队列有足够的空间容纳SendQ发送的数据。 值得特别注意的是缓存区的大小以及写入端的速度和读取端的速度非常影响这个连接的数据传输效率由于可能会发生阻塞所以网络 I/O 和磁盘 I/O 在数据的写入和读取还要有一个协调的过程如果两边同时传送数据可能会产生死锁的问题。 如何提高网络 IO 传输效率、保证数据传输的可靠这个我们后面单独开篇进行讲解。 四、小结 本文阐述的内容较多整合了很多有用的信息从 Java 基本的 I/O 类库结构开始说起主要介绍了 IO 的传输格式和传输方式包括字节流和字符流接口相关的分类介绍以及磁盘 I/O 和网络 I/O 的基本工作方式。 内容难免有所遗漏和理解不到的位置欢迎网友留言指出 五、参考 1、https://developer.ibm.com/zh/articles/j-lo-javaio/ 六、写到最后 最近无意间获得一份阿里大佬写的技术笔记内容涵盖 Spring、Spring Boot/Cloud、Dubbo、JVM、集合、多线程、JPA、MyBatis、MySQL 等技术知识。需要的小伙伴可以点击如下链接获取资源地址技术资料笔记。 不会有人刷到这里还想白嫖吧点赞对我真的非常重要在线求赞。加个关注我会非常感激
http://www.w-s-a.com/news/270227/

相关文章:

  • 建设银行网站信息补充营销推广的作用
  • 网站见建设seo外链自动群发工具
  • 在境外做网站网站团购网站seo
  • 进网站后台加什么360推广 网站建设
  • 网站备案号码专做网站漏扫的工具
  • 罗店网站建设wordpress响应式
  • 网站怎么制作小程序wordpress实时获取qq资料
  • 网站的流量怎么赚钱经销做网站都有什么好处
  • 如何做好网站首页企术建站
  • 杭州网站建设咨询蓝韵网络聊城有制作网站的吗
  • 网站开发注意的事项深圳企业网站
  • 哈尔滨网站制作哪里专业网站建设维护有哪些内容
  • 花的网站建设规划书网络营销培训
  • 又拍云wordpress全站cdn无锡做网站品牌公司
  • 计算机网络工程网站建设黄石建设信息网站
  • 旅游网站开发毕业设计开题报告青岛网站建设服务公司
  • 人员调动在网站上怎么做网站开发课程意见和建议
  • 卓训网是个什么网站wordpress命令执行时间
  • 网站建设需要做哪些工作网片焊接
  • 网站优化方案dedecms win8风格网站模板
  • 企业如何制作网站管理系统慈溪住房和城乡建设部网站
  • 青岛网站建设有哪些公司区块链网站开发价格
  • 怎么设置网站的logo微信公众号的h5网站开发6
  • 粉色的网站绍兴市建设局网站
  • 个人网站的基本风格是wordpress 模板选择
  • 南昌专业做网站公司有哪些广州市住房城乡建设部门户网站
  • 福州网站建设团队淘宝联盟网站怎么建设
  • 福州企业网站建站模板国内黑色风格的网站
  • 好看的网站首页设计android移动开发
  • 域名注册完成后如何做网站域名 删除 wordpress