java inputstream读取文件_java如何获取输入的数据

java inputstream读取文件_java如何获取输入的数据InputStream读取流有三个方法,分别为read(),read(byte[] b),read(byte[] b,int off,int len)。其中read()方法是一次读取一个字节,鬼都知道效率是非常低的。所以最好是使用后面两个方法。 /** *读取流 * *@paraminStream *@return字节数组 *@throwsExcepti

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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);
}

关于InputStream类的available()方法
这个方法的意思是返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。为什么需要这个方法?因为在一些网络应用中,数据流并不是一次性就能传递的,如果我们还是像上面那样去将这个流转换,会出问题的。我们来做一个例子,这是一个Socket编程的简单例子,具体Socket内容我会在后面文章中解释的。

首先编写两个类,一个用户初始化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/1434416


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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/191017.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 使用Python打包含有pymssql成exe所躺的坑「建议收藏」

    使用Python打包含有pymssql成exe所躺的坑「建议收藏」一、如何打包Python打包exe文件简单运用pyinstaller库就行了1)安装pyinstaller库(自行安装)2)win+R打开运行窗口输入“powershell”3)输入pyinstaller-F路径\文件名.py(打包py文件的路径,py不能省略)看到successfully即为打包成功,但不一定能运用的!!!(划重点,下面便是我躺过的坑)二、打包exe成功但运行遇报错(打包成功,但双击运行一闪而过):打包的文件代码在这里想查清报错win+R打开运行窗口输入“cmd”

  • 前端面试——W3C标准及规范「建议收藏」

    前端面试——W3C标准及规范「建议收藏」作为前端工程师对W3C标准和规范不是很陌生。很多招聘要求中经常提到深入了解W3C标准及规范。那下面就总结一下W3C标准及规范:概念:W3C标准  中文名:万维网联盟,外文名:WorldWideWebConsortium      万维网联盟标准不是某一个标准,而是一些列标准的集合。网页主要有三部分组成:结构(Structure)、表现(Presentation)、行为(B…

  • 遗传算法经典实例matlab_蚁群算法matlab实例

    遗传算法经典实例matlab_蚁群算法matlab实例二进制编码为基础%目标函数functiony=fobj(x)ifx<=0y=sin(x);elseifx<=2y=x^2/2;elsey=3-x/2;endend%主程序%清楚窗口内容和变量clearclcpc=0.8;%交叉率pm=0.05;%变异率Iter_N=100;%迭代最大代数popsize=10;%种群规模,个体的集合LB=-10;UB=

  • 利用DNSPod实现动态域名解析DDNS (解析内网、外网或IPV6地址)

    利用DNSPod实现动态域名解析DDNS (解析内网、外网或IPV6地址)更新记录2020-01-03-修复了12月31日由于dnspodAPI改动导致的失效。2019-05-24-支持IPV6(如你所料,之前所说的支持是假的)-根据网站的更新,api调用使用TLSv1.2,解决了之前调用失败的问题(感谢@lth410指出)。——————————-以下正文—————–…

  • python——循环(for循环、while循环)及练习

    python——循环(for循环、while循环)及练习目标程序的三大流程1.while循环的基本使用 2.break和continue 3.while循环嵌套在程序开发中,一共有三种流程方式:顺序:从上向下,顺序执行代码 分支:根据条件判断,决定执行代码的分支 循环:让特定代码重复执行(解决程序员重复工作)一、for循环1、基本用法for循环使用的语法:“”"for变量inrange(10):循环…

  • 深度相机之TOF原理详解

    深度相机之TOF原理详解3D建模是VR领域的重要技术基础,而随着深度相机消费级别的普及,对3D建模在硬件支持方面迈出了很关键的一步,本文分享了TOF深度相机的原理,应用的领域,能很好的给读者一个全局的把握

发表回复

您的电子邮箱地址不会被公开。

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