怎样读取stream 读取excel

java InputStream读取数据问题 - java小强 - ITeye技术网站
博客分类:
首先请查看一下JavaAPI,可以看到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) {
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类的available()方法这个方法的意思是返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。为什么需要这个方法?因为在一些网络应用中,数据流并不是一次性就能传递的,如果我们还是像上面那样去将这个流转换,会出问题的。我们来做一个例子,这是一个Socket编程的简单例子,具体Socket内容我会在后面文章中解释的。
首先编写两个类,一个用户初始化Socket服务,并且处理每个请求都有新的线程去处理,代码如下:
package com.
import java.net.*;
public class DstService {
public static void main(String[] args) {
// 启动监听端口 8001
ServerSocket ss = new ServerSocket(8001);
boolean bRunning =
while (bRunning) {
// 接收请求
Socket s = ss.accept();
// 将请求指定一个线程去执行
new Thread(new DstServiceImpl(s)).start();
} catch (Exception e) {
e.printStackTrace();
那么处理类我们也来看一下:
package com.
import java.io.*;
import java.net.*;
import com.util.*;
public class DstServiceImpl implements Runnable {
Socket socket =
public DstServiceImpl(Socket s) {
this.socket =
public void run() {
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.
import java.io.*;
public class StreamTool {
public static void main(String[] args) {
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.
import java.io.*;
import java.net.*;
import com.util.*;
public class DstClient {
public static void main(String[] args) {
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,然后运行客户端,看效果。会发现,控制台没有任何输出。经过调试发现,因为请求死在了
while ((len = inStream.read(buffer)) != -1) {
这行代码上面。这就是在网络应用中会造成的后果。那么如何解决呢?有的人给出了如下代码:
int count = in.available();
byte[] b = new byte[count];
in.read(b);
可是在进行网络操作时往往出错,因为你调用available()方法时,对发发送的数据可能还没有到达,你得到的count是0。需要做如下修改,是我们的读取流方法改成如下:
* @功能 读取流
* @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);
下面你在运行,会看到服务端和客户端都收到了消息。
关于InputStream.read(byte[] b)和InputStream.read(byte[] b,int off,int len)这两个方法都是用来从流里读取多个字节的,有经验的程序员就会发现,这两个方法经常 读取不到自己想要读取的个数的字节。比如第一个方法,程序员往往希望程序能读取到b.length个字节,而实际情况是,系统往往读取不了这么多。仔细阅读Java的API说明就发现了,这个方法 并不保证能读取这么多个字节,它只能保证最多读取这么多个字节(最少1个)。因此,如果要让程序读取count个字节,最好用以下代码:
int count = 100;
byte[] b = new byte[count];
int readCount = 0; // 已经成功读取的字节的个数
while (readCount & count) {
readCount += inStream.read(b, readCount, count - readCount);
这样就能保证读取100个字节,除非中途遇到IO异常或者到了数据流的结尾情况!
老规矩,最后是上传源代码!
请您到ITEYE看我的原创:
或支持我的个人博客,地址:
下载次数: 390
浏览 62959
三个read 方法都是一个字节一个字节的读,后两个read方法里面是调用第一个read,效率似乎应该都一样。看了代码,后两个方法是封装了第一个方法,但是如果你自己写的话,估计会更慢。
楼主有个问题, 你把读数据改成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);& &&&& }& 那你要在哪里写数据呢 ?拿到Output就可以写
windseamless 写道windseamless 写道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);
& 如果是这样读取的话,比如在接受心跳数据的时候,发送信条时间间隔比较长的情况下,这个循环一直在执行,去、这样就会造成电脑非常卡windseamless 写道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);
& 如果是这样读取的话,比如在接受心跳数据的时候,发送心跳时间间隔比较长的情况下,这个循环一直在执行,这样就会造成电脑非常卡你说的这个方法很好,这样的话就可以解决死循环问题确实应该增加个休眠
windseamless 写道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);
& 如果是这样读取的话,比如在接受心跳数据的时候,发送信条时间间隔比较长的情况下,这个循环一直在执行,去、这样就会造成电脑非常卡windseamless 写道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);
& 如果是这样读取的话,比如在接受心跳数据的时候,发送心跳时间间隔比较长的情况下,这个循环一直在执行,这样就会造成电脑非常卡你说的这个方法很好,这样的话就可以解决死循环问题
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);
& 如果是这样读取的话,比如在接受心跳数据的时候,发送信条时间间隔比较长的情况下,这个循环一直在执行,去、这样就会造成电脑非常卡可以在里面加个Thread.sleep(200);,然后在定个变量,int k = 0,线程没休眠一次k++,直到k大于等于一个数值,比如15,就即3s内仍无数据,就咔嚓连接
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);
& 如果是这样读取的话,比如在接受心跳数据的时候,发送信条时间间隔比较长的情况下,这个循环一直在执行,去、这样就会造成电脑非常卡windseamless 写道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);
& 如果是这样读取的话,比如在接受心跳数据的时候,发送心跳时间间隔比较长的情况下,这个循环一直在执行,这样就会造成电脑非常卡
cuisuqiang 写道lsh009 写道cuisuqiang 写道lsh009 写道顶,最近在做socket连接,就是read inputstream 死锁了,谢谢你可以看看mina框架你好,服务器端用mina,客户端不要mina用普通的socket或者nio应该可以的吧?没有问题,如果你用mina,别人就必须用mina,那做C和C++的岂不是要死呵呵,确认一下,不然以后有什么问题会很麻烦,毕竟客户端不是我们这边做的,现在只做服务端,再问个问题额,接收到数据 我需要比较长时间处理数据,再返回,用mina需要自己实现多线程吗,还是mina本身实现了,不做多线程的话,后续来的数据,会卡住等待前一个数据处理完才处理吗?谢谢我建议你呢做个实验,在Mina收到数据时打印一条信息,然后长期休眠,然后再模拟发一条数据,看看能不能打印
lsh009 写道cuisuqiang 写道lsh009 写道顶,最近在做socket连接,就是read inputstream 死锁了,谢谢你可以看看mina框架你好,服务器端用mina,客户端不要mina用普通的socket或者nio应该可以的吧?没有问题,如果你用mina,别人就必须用mina,那做C和C++的岂不是要死呵呵,确认一下,不然以后有什么问题会很麻烦,毕竟客户端不是我们这边做的,现在只做服务端,再问个问题额,接收到数据 我需要比较长时间处理数据,再返回,用mina需要自己实现多线程吗,还是mina本身实现了,不做多线程的话,后续来的数据,会卡住等待前一个数据处理完才处理吗?谢谢
cuisuqiang 写道lsh009 写道顶,最近在做socket连接,就是read inputstream 死锁了,谢谢你可以看看mina框架你好,服务器端用mina,客户端不要mina用普通的socket或者nio应该可以的吧?没有问题,如果你用mina,别人就必须用mina,那做C和C++的岂不是要死
lsh009 写道顶,最近在做socket连接,就是read inputstream 死锁了,谢谢你可以看看mina框架你好,服务器端用mina,客户端不要mina用普通的socket或者nio应该可以的吧?
顶,最近在做socket连接,就是read inputstream 死锁了,谢谢你可以看看mina框架
int count = 100;& byte[] b = new byte[count];& int readCount = 0; // 已经成功读取的字节的个数& while (readCount & count) {& &&& readCount += inStream.read(b, readCount, count - readCount);& }& 这个不错这个确实不错!对于socket中特别给力!
wdhdmx 写道三个read 方法都是一个字节一个字节的读,后两个read方法里面是调用第一个read,效率似乎应该都一样。这个只是基本实现,子类可以重写(override)read(byte[], int, int)来提高按块读的效率。比如FileInputStream就是重写通过调用private native int readBytes(byte b[], int off, int len) throws IOE来实现的。看效果即可
三个read 方法都是一个字节一个字节的读,后两个read方法里面是调用第一个read,效率似乎应该都一样。这个只是基本实现,子类可以重写(override)read(byte[], int, int)来提高按块读的效率。比如FileInputStream就是重写通过调用private native int readBytes(byte b[], int off, int len) throws IOE来实现的。
& 上一页 1
cuisuqiang
浏览: 1312108 次
来自: 北京
浏览量:1147022
贴一个项目中采用的定时数据同步器&!-- sql到ora ...
好全面,,正在测试用
wdhdmx 写道三个read 方法都是一个字节一个字节的读, ...
博主好,看到您的帖子,http://cuisuqiang.it ...
这个里面的 ByteBuffer bbuf = GlobalC ...Javascript里如何用stream读取文件?
[问题点数:101分,结帖人youbl]
Javascript里如何用stream读取文件?
[问题点数:101分,结帖人youbl]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2010年10月 Web 开发大版内专家分月排行榜第三
2002年5月 Delphi大版内专家分月排行榜第一2002年1月 Delphi大版内专家分月排行榜第一
2007年11月 .NET技术大版内专家分月排行榜第二2007年1月 Delphi大版内专家分月排行榜第二2006年12月 Delphi大版内专家分月排行榜第二2006年10月 Delphi大版内专家分月排行榜第二2002年8月 Delphi大版内专家分月排行榜第二2002年6月 Delphi大版内专家分月排行榜第二2001年12月 Delphi大版内专家分月排行榜第二
2002年5月 Delphi大版内专家分月排行榜第一2002年1月 Delphi大版内专家分月排行榜第一
2007年11月 .NET技术大版内专家分月排行榜第二2007年1月 Delphi大版内专家分月排行榜第二2006年12月 Delphi大版内专家分月排行榜第二2006年10月 Delphi大版内专家分月排行榜第二2002年8月 Delphi大版内专家分月排行榜第二2002年6月 Delphi大版内专家分月排行榜第二2001年12月 Delphi大版内专家分月排行榜第二
2002年5月 Delphi大版内专家分月排行榜第一2002年1月 Delphi大版内专家分月排行榜第一
2007年11月 .NET技术大版内专家分月排行榜第二2007年1月 Delphi大版内专家分月排行榜第二2006年12月 Delphi大版内专家分月排行榜第二2006年10月 Delphi大版内专家分月排行榜第二2002年8月 Delphi大版内专家分月排行榜第二2002年6月 Delphi大版内专家分月排行榜第二2001年12月 Delphi大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。请问怎么用 QDataStream
读取bin文件
[问题点数:20分,结帖人longneicool]
请问怎么用 QDataStream
读取bin文件
[问题点数:20分,结帖人longneicool]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2011年10月 移动平台大版内专家分月排行榜第三2010年11月 移动平台大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。VB TextStream 如何读取文本文件某行的内容,vb textstream,vb 读取文本文件,vb ..
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
VB TextStream 如何读取文本文件某行的内容
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口

我要回帖

更多关于 qdatastream 读取 的文章

 

随机推荐