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


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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 房费制——登录优化

    房费制——登录优化

    2022年1月15日
    50
  • gg 修改器游戏被保护_GG修改器sky光遇脚本下载app_GG修改器光遇脚本2020最新版下载 安卓版 V411.41.41…

    gg 修改器游戏被保护_GG修改器sky光遇脚本下载app_GG修改器光遇脚本2020最新版下载 安卓版 V411.41.41…GG修改器sky光遇脚本是一款知名的手机游戏修改软件,这款手机软件十分强劲,拥有它你能随时一键游戏修改值,加快手机游戏这些作用,使你在这儿感受到一站式的游戏辅助软件感受。这个脚本app不需要root权限就可以快速运行,有需要的朋友们赶紧来下载GG修改器sky光遇脚本2020最新版app吧。GG修改器sky光遇脚本app特色1.本专用工具永久免费、没有广告、绝对安全可靠;2.根据改动已经运作的游戏里…

    2022年7月16日
    19
  • 量子搜索算法例题详解_量子算法与编程入门

    量子搜索算法例题详解_量子算法与编程入门量子搜索算法Groversearch问题定义:Problem:f:{0,1,2,3,……,N−1}→{0,1}f:{0,1,2,3,……,N−1}→{0,1}找到f(x)=1的x解法经典解法:经典解法很简单,就是把每一个都看一遍,如果只有一个x对应的f(x)=1,那么平均是要看一半,才能找到那个x。时间复杂度O(N)量子解法:使用Groversea…

    2025年5月22日
    4
  • EFI shell操作

    EFI shell操作进入EFIshell后,切换盘符使用fs0:(注意冒号不能丢)

    2022年7月24日
    14
  • Java 线程死锁及如何避免死锁介绍

    Java 线程死锁及如何避免死锁介绍死锁是指两个或两个以上的线程在执行过程中,**因争夺资源而造成的互相等待**的现象,在无外力作用的情况下,这些线程会一直相互等待而无法继续运行下去,

    2022年7月13日
    14
  • android游戏引擎andengine学习系列三:绘制游戏虚拟摇杆

    android游戏引擎andengine学习系列三:绘制游戏虚拟摇杆如何高效的学习,这才是我们最值得去学习的。  andengine中绘制虚拟游戏摇杆非常简单,只需要实现AnalogOnScreenControl模拟摇杆类,在设置一些属性即可。先看效果图:左边的摇杆是控制精灵上下左右移动,右边的摇杆空值精灵的旋转。代码结构跟andengine学习系列二一样,其中很多注释在系列二中有说明,在该章内便不多复述。onLoadEngine()方法:

    2025年12月10日
    4

发表回复

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

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