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

《Java网络编程》第二章:Stream流

Stream有哪些?

  • Java的IO建立在流(stream)上,输入流读取数据,输出流写入数据
  • 过滤器(filter)可以串链到输入流或输出流上。读写数据时,可以修改数据或者提供额外的方法将数据转换为其他格式
  • 阅读器(reader)和书写器(writer)允许程序读写文本而不是字节
  • Java还支持使用通道和缓冲区的非阻塞I/O

输出流

Java的基本输出流类是java.io.OutputStream

OutputStream基本方法是write(int b),接收0-255的整数。实际上是写入一个无符号字节,用int来替代。如果一个超出0-255的数传入,将会写入这个数的最低字节,其他三个字节将被忽略(int强转为byte)

通常写入一个字节效率不高。例如以太网卡的每个TCP分片包包含至少40字节的开销用于路由和纠错。因此,大多数TCP/IP实现都会缓存数据。所以写入数据完成后,刷新(flush)非常重要。

flush()方法可以强迫缓冲的流发送数据,即使缓冲区还没有满,来打破死锁的状态

当结束一个流的操作时调用close()方法关闭。调用其那立即刷新输出所有流,否则关闭流时留在缓冲区的数据可能丢失

释放模式

public void testOutput(){OutputStream out = null;try {out = new FileOutputStream("D:\\test.txt");} catch (FileNotFoundException e) {throw new RuntimeException(e);}finally {if(out != null){try {out.close();} catch (IOException e) {//忽略}}}
}

try with resource

public void testOutput2(){try(OutputStream out = new FileOutputStream("D:\\test.txt")){//处理输出流}catch (IOException e){System.err.println( e);}}

会对try块参数表中生命的所有AutoCloseable对象自动调用close()

输入流

基本输入类是java.io.InputStream

流的结束返回-1来表示,read()方法会等待并阻塞其后任何代码的执行直到有1字节的数据可供读取。因此尽量把I/O放在单独的线程中

read()只读取一个字节,但会返回int,把结果储存在字节数组里必须进行类型转换。

public void testInput2() throws IOException {byte[] input = new byte[10];InputStream in = null;for(int i = 0; i < input.length; i++){int b = in.read();if(b == -1){break;}int j = (byte)b >= 0?b:256 + b;input[i] = (byte) j;}}

重复读取至数组为满

public void testInput2() throws IOException {int byteRead = 0;int byteToRead = 1024;byte[] input = new byte[byteToRead];InputStream in = new FileInputStream("D:\\test.txt");while(byteRead < byteToRead){byteRead += in.read(input, byteRead, byteToRead - byteRead);}}

可以使用available()方法来确定不阻塞的情况下有多少字节可以读取

一旦结束对输入流的操作,应当调用它的close()方法将其关闭

标记和重置

mark()方法标记流的当前位置,在以后的某个时刻用reset()方法把流重置到标记的位置。

标记只能存在一个

如果试图重置的太远,就会抛出IOException异常

可用markSupport()来检查当前流是否支持标记和重置

过滤器流

将过滤器串链在一起

FileInputStream fin = new FileInputStream("xxx.txt");
BufferedInputStream bin = new BufferedInputStream(in);

缓冲流

BufferedInputStream类也有一个作为缓冲区的保护字节数组,名为buf。当调用read()方法时,它首先尝试从缓冲区中获取请求的数据。当缓冲区没有数据时,才从底层的源中读取数据并尽可能多的存入缓冲区。

BufferedOutputStream每次写入会把数据放入缓冲区中,因此需要发送数据时应当刷新输出流

PrintStream

System.out就是一个PrintStream

PrintStream是有害的,网络编程应当避免使用。存在三个问题

  1. println()输出是与平台有关的。在UNIX下是换行符\n,MacOS下是回车符\r,Windows下是\r\n。因此程序可能会在Windows正常工作却无法再UNIX MacOS下运行
  2. 假定使用所在平台的默认编码方式
  3. 吞掉了所有的异常,提供的错误通知对未知的网络连接来说不足够

数据流

DataInputStream和DataOutputStream类提供了方法可以用二进制格式读写Java的基本数据类型和字符串

writeChars()方法值写入每个字符的低字节,因此如果字符包换有Letin 1字符集以外的字符,其中的信息将会丢失

readLine()方法已被BufferedReader的readLine()方法替代。因为其不能将非ASCII码转换为字节。但两个方法存在同一个隐含的bug:它们并不总能把一个回车识别为行结束。readLine()检测到回车时会继续等待,看下一个字符是否为换行,如果是就抛掉字符和换行,如果不是就抛掉这个回车。但如果回车是这个流的最后一个字符,那么readLine()就会挂起。

阅读器和书写器

基本类时java.io.Reader和java.io.Writer

重要的具体子类时InputStreamReader和OutputStreamWriter。InputStreamReader包含一个底层输入流,可以从中读取原始字节,再根据指定的编码方式将字节转换为Unicode字符

http://www.dtcms.com/a/391780.html

相关文章:

  • 速卖通“AI全站推”上新!跨境卖家如何利用 AI 做营销
  • Apple Developer Program注册被拒原因分析与技术性申诉指南
  • 卷积神经网络从入门到经典模型详解
  • C#超市商品管理系统入门级实现
  • 自注意力机制Self-Attention (二)
  • InternVLA-N1——规划-执行双系统下的VLN基础模型:具备学习型的潜在规划能力,可部署在轮式、四足、双足人形上
  • 睡眠PSG数据集技术
  • 【AI落地应用实战】利用亚马逊云科技 Step Functions 集成现有系统快速实现个性化邮件触达
  • 手机备忘录待办APP工具评测
  • 总线错误(Bus Error)是什么?
  • 《Java网络编程》第三章:Internet地址
  • 【软件项目验收:第三方软件测评报告合规性和有效性审核,辨别真假软件测评报告书】
  • 变邻域含变惯性权重策略的自适应离散粒子群算法
  • cocos通过碰撞collider进行道具获取 或者出发事件
  • 自动化测试可行性分析
  • 三轴云台之抗干扰设计篇
  • Kubernetes 高级运维:监控升级、ETCD 备份与 Kustomize 配置管理
  • 计算机专业《软件工程》:构建数字世界的基石
  • 苹果组织/企业开发者账号(ADP)申请核心材料与技术审核要点
  • TLS 1.3加密加持:云环境Redis安全传输最佳实践
  • CS231n学习笔记3-3: DDPM
  • 抗辐照MCU在核电站巡检机器人摄像头模组中的应用探讨
  • 机器人编程教育闭环:校内外学习无缝衔接的设计思路
  • 如何在不修改域名解析的情况下检查WordPress网站迁移是否成功
  • JEL机器人使用经验分享(寻边器校准失败,晶圆偏移量太大,放入平台后发现每一片的位置都不一样)
  • 充电器自动化测试系统有哪些测试项目和方法?
  • 深度学习-卷积神经网络
  • ROS python程序将本地照片转为topic
  • 多态及其原理
  • 智能体流程:自拍照片处理与六宫格图像生成