java InputStream读取数据

java InputStream读取数据InputStream 读取流有三个方法 分别为 read read byte nbsp b read byte nbsp b int nbsp off int nbsp len 其中 read 方法是一次读取一个字节 鬼都知道效率是非常低的 所以最好是使用后面两个方法 读取流 paraminStrea return 字节数组 throwsExcept

InputStream读取流有三个方法,分别为read(),read(byte[] b),read(byte[] b, int off, int len)。其中read()方法是一次读取一个字节,鬼都知道效率是非常低的。所以最好是使用后面两个方法。

 / * 读取流 * * @param inStream * @return 字节数组 * @throws Exception */ public static byte[] readStream(InputStream inStream) throws Exception { ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = -1; while ((len = inStream.read(buffer)) != -1) { outSteam.write(buffer, 0, len); } outSteam.close(); inStream.close(); return outSteam.toByteArray(); }

测试一下:

 public static void main(String[] args) { try { File file = new File("C:\\ceshi.txt"); FileInputStream fin = new FileInputStream(file); byte[] filebt = readStream(fin); System.out.println(filebt.length); } catch (Exception e) { e.printStackTrace(); } }

关于InputStream.read(byte[] b)和InputStream.read(byte[] b,int off,int len)这两个方法都是用来从流里读取多个字节的,有经验的程序员就会发现,这两个方法经常 读取不到自己想要读取的个数的字节。比如第一个方法,程序员往往希望程序能读取到b.length个字节,而实际情况是,系统往往读取不了这么多。仔细阅读Java的API说明就发现了,这个方法 并不保证能读取这么多个字节,它只能保证最多读取这么多个字节(最少1个)。

int count = 100; byte[] b = new byte[count]; int readCount = 0; // 已经成功读取的字节的个数 while (readCount < count) { readCount += inStream.read(b, readCount, count - readCount); }

首先编写两个类,一个用户初始化Socket服务,并且处理每个请求都有新的线程去处理,代码如下:

package com.service; import java.net.*; public class DstService { public static void main(String[] args) { try { // 启动监听端口 8001 ServerSocket ss = new ServerSocket(8001); boolean bRunning = true; while (bRunning) { // 接收请求 Socket s = ss.accept(); // 将请求指定一个线程去执行 new Thread(new DstServiceImpl(s)).start(); } } catch (Exception e) { e.printStackTrace(); } } }

处理类

package com.service; import java.io.*; import java.net.*; import com.util.*; public class DstServiceImpl implements Runnable { Socket socket = null; public DstServiceImpl(Socket s) { this.socket = s; } public void run() { try { InputStream ips = socket.getInputStream(); OutputStream ops = socket.getOutputStream(); while (true) { byte[] bt = StreamTool.readStream(ips); String str = new String(bt); System.out.println("主机收到信息:" + str); String restr = "你好,主机已经收到信息!"; ops.write(restr.getBytes()); ops.flush(); } } catch (Exception e) { e.printStackTrace(); } } }

工具类

package com.util; import java.io.*; public class StreamTool { public static void main(String[] args) { try { File file = new File("C:\\ceshi.txt"); FileInputStream fin = new FileInputStream(file); byte[] filebt = readStream(fin); System.out.println(filebt.length); } catch (Exception e) { e.printStackTrace(); } } / * @功能 读取流 * @param inStream * @return 字节数组 * @throws Exception */ public static byte[] readStream(InputStream inStream) throws Exception { ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = -1; while ((len = inStream.read(buffer)) != -1) { outSteam.write(buffer, 0, len); } outSteam.close(); inStream.close(); return outSteam.toByteArray(); } }

Socket客户端测试

package com.client; import java.io.*; import java.net.*; import com.util.*; public class DstClient { public static void main(String[] args) { try { Socket socket = new Socket("127.0.0.1", 8001); // 开启保持活动状态的套接字 socket.setKeepAlive(true); // 设置读取超时时间 socket.setSoTimeout(30 * 1000); OutputStream ops = socket.getOutputStream(); String mess = "你好,我是*!"; ops.write(mess.getBytes()); InputStream ips = socket.getInputStream(); byte[] rebyte = StreamTool.readStream(ips); String remess = new String(rebyte); System.out.println("收到主机消息:" + remess); socket.close(); } catch (Exception e) { e.printStackTrace(); } } }

先运行DstService,然后运行客户端,看效果。会发现,控制台没有任何输出。

修改代码

/ * @功能 读取流 * @param inStream * @return 字节数组 * @throws Exception */ public static byte[] readStream(InputStream inStream) throws Exception { int count = 0; while (count == 0) { count = inStream.available(); } byte[] b = new byte[count]; inStream.read(b); return b; }

参考:http://cuisuqiang.iteye.com/blog/









版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226540.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午10:40
下一篇 2026年3月16日 下午10:40


相关推荐

  • java基础io流——OutputStream和InputStream的故事(温故知新)

    java基础io流——OutputStream和InputStream的故事(温故知新)io 流概述 IO 流用来处理设备之间的数据传输 上传文件和下载文件 Java 对数据的操作是通过流的方式 Java 用于操作流的对象都在 IO 包中 IO 流分类按照数据流向输入流读入数据输出流写出数据按照数据类型字节流字符流什么情况下使用哪种流呢 如果数据所在的文件通过 windows 自带的记事本打开并能读懂里面的内容 就用字符流 其他用字节流 如果你什么都

    2026年3月20日
    1
  • mybatis log 激活码(注册激活)

    (mybatis log 激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月27日
    631
  • 网站管理后台帐号密码暴力激活成功教程方法

    网站管理后台帐号密码暴力激活成功教程方法【导读】对于网站运行的个人站长而言,最担心的是应如何有效且安全的去管理自己的网站,否则自己辛辛苦苦经营的网站就会被不请自来的不速之客给攻破,轻则站点数据被窃取,重则整个网站都被攻陷,导致无法恢复。本文主要从管理后台这个方面来讲解其黑客攻击过程,并通过在虚拟环境中展开实例演示,各读者可以跟着本教程去做实验,通过实验加强对攻击过程的了解,如果你是一名菜鸟站长也可以针对性的去做一下防护方案。…

    2022年10月13日
    4
  • cegui 0.8.7 安装和构建

    cegui 0.8.7 安装和构建cegui是一个开源GUI库,经过历史的验证和发展,变得非常庞大和复杂,但效率是有所保证的,常用于游戏开发。1.首先去CEGUI官网,点击进入下载界面。2.下载这两个,第一个是cegui

    2022年7月3日
    25
  • 全网最强DeepSeek图片教程,让你驯服Deepseek!(非常详细)从零基础到精通,收藏这篇就够了!

    全网最强DeepSeek图片教程,让你驯服Deepseek!(非常详细)从零基础到精通,收藏这篇就够了!

    2026年3月16日
    1
  • pycharm怎么调试程序_简单辅助调试

    pycharm怎么调试程序_简单辅助调试我这里已经简单的创建了一个文件,为了浅显易懂,这里程序写的比较简单1.      运行程序首先,找到编辑窗口上面有一个向下方向的灰色箭头,点击它点击之后,选择第一个选项editConfigurations,然后在弹出的窗口的第一栏name栏取一个你想要的名字,接着在第二栏Script栏后面点击后面的…选择你刚刚编写的程序,然后点击ok。这个时候你会发现刚刚灰色箭头的后面的

    2022年8月26日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号