java打开网络中的流,如何设置java计算最长路径时间

java中网络流的read方法,什么时候会返回-1?
<a data-traceid="question_detail_above_text_l&&
& & 就是封装了socket的getInputStream的一个输入流,调用其read方法时,什么时候返回-1?
引用来自“张江男”的答案流的末尾会返回-1, 像你这种情况就是当对方将socket的输出流关闭后, 你将对方的输出都读完后,再读下一个字节就会返回-1.非常感谢:)
流的末尾会返回-1, 像你这种情况就是当对方将socket的输出流关闭后, 你将对方的输出都读完后,再读下一个字节就会返回-1.
嗯,了解,谢谢。
如果是用阻塞IO的话,它会选择阻塞,不会返回-1,直到timeout抛出异常。
流的末尾这个概念太抽象,我纠结的地方主要是在网络流中如果接收方接收数据速度比较快,发送发发送数据比较慢,这个时候用read方法来读取数据的话不是回阻塞吗?那么什么时候read方法不是阻塞,而是直接返回-1呢?
读取的指针(姑且这么叫)达到流的末尾时会返回-1.网络数据流的java处理
前言:java程序要处理很多的网络数据,网络数据发送和接收以及数据流的处理是java程序要特别关注的方面,随着java的发展,这些方法也越来越得到重视和加强。本文从几个方面解释了java正确处理网络数据流的要素,这些也是java程序员必须了解的基本的知识。1:庞大的java流处理
首先,之所以说java流的庞大,是因为java中的流处理比其他语言的流处理在内容上多的多。
java流在处理上分为字符流和字节流。字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。
Java内用Unicode编码存储字符,字符流处理类负责将外部的其他编码的字符流和java内Unicode字符流之间的转换。而类InputStreamReader和OutputStreamWriter处理字符流和字节流的转换。字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高。
对应不同的流,需要不同的流构建器或流过滤实现。java目前依然在逐渐增加其流处理方法,虽然java类库的创作人员可以列举出很多理由来说明这要做的优点,但我还是觉得java开始变得向其他语言一样复杂起来。2:网络数据流的收发
java对网络数据的发送和接收处理,也借用了一般流处理的方法。我们知道,在几乎其他所有语言中,网络数据的收发在利用类似send(或write)和recv(或read)的方法时并没有明显的流处理。但是java和这些语言的收发方法有较大区别,要借助流才可以完成:.......
sock = new Socket(addr, port);
OutputStream os = sock.getOutputStream();
InputStream is = sock.getInputStream();
os.write(byte[] b);
is.read(byte[] b);
这些方法总给人一种不太舒服的感觉。不过从Jdk1.4开始弥补了这一点。JDK1.4中新增加了新的I/O流处理,在缓冲区管理、可伸缩网络和文件IO、字符集支持、正规表达式匹配方面做了新的处理。其中缓冲区管理和通道(Channel)概念则是对网络数据流的收发处理支持的强化。缓冲区管理中ByteBuffer类更好的支持了网络数据流处理。在网络连接中,通道代表了sockets的连接。基于这些新的IO处理,以上代码可以改写为:......
ByteBuffer bytebuf = ByteBuffer.allocate(2048); // 创建一个指定大小的缓冲区
InetSocketAddress isa = new InetSocketAddress(hostname,port);
sc = SocketChannel.open(); // 建立一个socket通道
sc.connect( isa);
// 建立一个socket连接
sc.write(bytebuf); // 发送数据
sc.read(bytebuf); // 接收数据
这样的程序似乎要流畅的多。3:java对网络数据流的处理
java程序对网络数据流的处理要关注四个基本方面:数据流的编码,字节顺序,数据格式对应和取数。这是四个不同的问题,但是都影响到网络数据的正确接收。3.1 网络数据流的解码和编码网络数据流的编码和解码主要针对流中出现的字符串。网络数据流中的字符串均为原始的字节流形式。
要正确接收网络数据流中的字符串,首先要知道该字符串的编码方案。然后才可以调用解码的方法获得java能够认识的Unicode编码字符串。可以用如下代码处理网络数据流中字符串的编码和解码:// 获得编码对象,即网络对等方的认识的字符串编码。
Charset charset = Charset.forName("--?"); // --?为对等方的编码名,java必须支持。
// 生成编码器和解码器对象。
CharsetDecoder decoder = charset.newDecoder();
CharsetEncoder encoder = charset.newEncoder();
// 对从网络数据流中获得的字节流解码取得java字符串
CharBuffer charbuf = decoder.decode(bytebuff);
// 将java字符串编码成指定编码的字节流,以便网络发送
bytebuff = encoder.encode(CharBuffer.wrap("Test String");
.......3.2 网络数据流的字节顺序目前的字节顺序有两类:BIG_ENGIAN和LITTLE_ENDIAN。各个平台所支持的字节序不同,例如AIX、Tru64Unix、Windows等操作系统平台采用LITTLE_ENDIAN字节序,Solaris等操作系统平台采用BIG_ENGIAN。Java自身采用的是BIG_ENGIAN字节序,当java和运行在其他平台上的其他语言编写的通信程序通信时,则必须考虑到数据的字节序。
Jkd1.4新增加的包NIO中的类ByteOrder则带来了一定的方便。针对从网络数据流的字节序,我们只要增加一行就可以轻松的处理字节序了:
bytebuf.order(ByteOrder.LITTLE_ENDIAN);
//按照LITTLE_ENDIAN字节序收发数据
sc.read(bytebuf); // 接收数据
上面的方法虽然简化了我们的编程,但没有真正处理好分布式应用的网络数据字节序问题。例如,java同时和在Tru64Unix、Solaris平台上的应用通信时,上述方法就不能解决问题。因为同一数据包,可能无法判断其字节序是那一种。此时要求网络数据包内携带附加的字节序信息显然是不现实的。这种情况下,java语言需要提供对XDR(外部数据表达)的支持,目前XDR已经为事实上的网络数据流的标准格式,分布式应用的网络数据流基本都遵循了这种格式,如果java语言提供了对XDR的支持,就可以解决通用性的问题。对于分布式应用中的网络数据流的处理就无需再根据其平台判断其字节序,只要按照XDR格式进行处理就可以了。3.3
网络数据流中数据格式的对应C/C++语言编写的网络程序中一般采用数据结构的缓冲区发送数据,在java端接收数据时,会出现一些因数据组织引起的问题:如结构 typedef struct {
} SendData在32位操作系统中,它的大小并不是42,而是44!数据的组织如下图所示:
当通过网络发送到客户端时,客户端也接收到44个字节,如果按照顺序依次取相应的值,则会发现最后取得的浮点值不正确。这是因为把短整型数据后没有意义的两位作为了浮点数中的其中两位。如果想正确接收该数据,则必须跳过短整型数据后没有意义的两位,再取浮点值。而如果以上的结构变为:typedef struct {
}则java端按照顺序依次接收数据就不会发生问题。
所以,在编写程序时,对数据的正确组织也是非常重要的。3.4从网络数据流中取得需要的数据在C/C++的Socket编程时,采用数据结构收发数据很方便,特别是接收数据时,可以由数据结构的数据类型自动获得网络数据流相应的数据。但是在java中,目前我们必须对流进行分析,逐一的取得自己所需要的数据,并且由于网络数据流是原始的数据流,还要根据程序所需要的数据类型对网络数据流进行解码处理。发送网络数据时同样需要对数据进行封装。这个过程也增加了java程序的烦琐性。例如上述结构,要用如下代码获取相应数据:int id = bytebuf.getInt(); // 获得整数型值int limit = bytebuf.limit(); // 获得字节缓冲区的限值bytebuf.limit(36); //
设置字节缓冲区的限值,为字符串后面的第一个字节位置CharBuffer charbuf = decoder.decode(bytebuf); //
解码获得字符串Bytebuf.limit(limit); // 恢复字节缓冲区原来的限值float fval = bytebuf.getfloat(); // 获得浮点型值short val = bytebuf.getshort(); // 获得短整型数值4:结束语
从上面的介绍可以看出,java程序中对网络数据流的处理涉及的问题较多。在编写网络程序时,必须注意这些问题,以使得程序正确的处理通信的内容。
添加或订阅评论,请先或。
有新评论时提醒我
static.content.url=http://www.ibm.com/developerworks/js/artrating/SITE_ID=10Zone=Java technologyArticleID=53438ArticleTitle=网络数据流的java处理publish-date=技术 | java文件流下载网络文件
public HttpServletResponse download(String path, HttpServletResponse response) {
// path是指欲下载的文件的路径。
File file = new File(path);
// 取得文件名。
String filename = file.getName();
// 取得文件的后缀名。
String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();
// 以流的形式下载文件。
InputStream fis = new BufferedInputStream(new FileInputStream(path));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
// 设置response的Header
response.addHeader("Content-Disposition", "filename=" + new String(filename.getBytes()));
response.addHeader("Content-Length", "" + file.length());
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
toClient.write(buffer);
toClient.flush();
toClient.close();
} catch (IOException ex) {
ex.printStackTrace();
public void downloadLocal(HttpServletResponse response) throws FileNotFoundException {
// 下载本地文件
String fileName = "Operator.doc".toString(); // 文件的默认保存名
// 读到流中
InputStream inStream = new FileInputStream("c:/Operator.doc");// 文件的存放路径
// 设置输出的格式
response.reset();
response.setContentType("bin");
response.addHeader("Content-Disposition", " filename="" + fileName + """);
// 循环取出流中的数据
byte[] b = new byte[100];
while ((len = inStream.read(b)) & 0)
response.getOutputStream().write(b, 0, len);
inStream.close();
} catch (IOException e) {
e.printStackTrace();
public void downloadNet(HttpServletResponse response) throws MalformedURLException {
// 下载网络文件
int bytesum = 0;
int byteread = 0;
URL url = new URL("windine.blogdriver.com/logo.gif");
URLConnection conn = url.openConnection();
InputStream inStream = conn.getInputStream();
FileOutputStream fs = new FileOutputStream("c:/abc.gif");
byte[] buffer = new byte[1204];
while ((byteread = inStream.read(buffer)) != -1) {
bytesum +=
System.out.println(bytesum);
fs.write(buffer, 0, byteread);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
微官网:http://www.oraclewdp.com
实训咨询:010-
咨询QQ:
版权所有:作者及甲骨文北京实训基地,转载必须告之
觉得不错,请点赞↓↓↓
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
今日搜狐热点一切的新技术都是在现有技术方面的提升
java网络的流量控制
这里简单的讨论一下设计网络程序中如何控制上传和下载速度,我们常见的,,等协议都是的,但是现在流行的却基于实现了自己协议拥塞控制,不管使用什么协议,站在的角度来说,限速的控制思路都是一样的。思路很简单,如下:假设下载或者上传速度上限是那么发送一个固定的字节数据假设是字节的时间花费是:;假设现在要发送字节的数据,那么理论所需的时间应该是,而在实际情况下,发送字节的数据只花费了秒,那么发送该发送线程就应该睡眠秒,这样就基本实现了速度的控制。代码以为例速度控制
package com.actiontec.net. 2
* @author Le 6
*/ 8 public class BandwidthLimiter { 9 10
/* KB */11
private static Long KB = 1024l;12 13
/* The smallest count chunk length in bytes */14
private static Long CHUNK_LENGTH = 1024l;15 16
/* How many bytes will be sent or receive */17
private int bytesWillBeSentOrReceive = 0;18 19
/* When the last piece was sent or receive */20
private long lastPieceSentOrReceiveTick = System.nanoTime();21 22
/* Default rate is 1024KB/s */23
private int maxRate = 1024;24 25
/* Time cost for sending CHUNK_LENGTH bytes in nanoseconds */26
private long timeCostPerChunk = (l * CHUNK_LENGTH)27
/ (this.maxRate * KB);28 29
* Initialize a BandwidthLimiter object with a certain rate.31
* @param maxRate33
the download or upload speed in KBytes34
public BandwidthLimiter(int maxRate) {36
this.setMaxRate(maxRate);37
* Set the max upload or download rate in KB/s. maxRate must be grater than41
* 0. If maxRate is zero, it means there is no bandwidth limit.42
* @param maxRate44
If maxRate is zero, it means there is no bandwidth limit.45
* @throws IllegalArgumentException46
public synchronized void setMaxRate(int maxRate)48
throws IllegalArgumentException {49
if (maxRate & 0) {50
throw new IllegalArgumentException("maxRate can not less than 0");51
this.maxRate = maxRate & 0 ? 0 : maxR53
if (maxRate == 0)54
this.timeCostPerChunk = 0;55
this.timeCostPerChunk = (l * CHUNK_LENGTH)57
/ (this.maxRate * KB);58
* Next 1 byte should do bandwidth limit.62
public synchronized void limitNextBytes() {64
this.limitNextBytes(1);65
* Next len bytes should do bandwidth limit69
* @param len71
public synchronized void limitNextBytes(int len) {73
this.bytesWillBeSentOrReceive +=74 75
/* We have sent CHUNK_LENGTH bytes */76
while (this.bytesWillBeSentOrReceive & CHUNK_LENGTH) {77
long nowTick = System.nanoTime();78
long missedTime = this.timeCostPerChunk79
- (nowTick - this.lastPieceSentOrReceiveTick);80
if (missedTime & 0) {81
Thread.sleep(missedTime / 1000000,83
(int) (missedTime % 1000000));84
} catch (InterruptedException e) {85
e.printStackTrace();86
this.bytesWillBeSentOrReceive -= CHUNK_LENGTH;89
this.lastPieceSentOrReceiveTick = nowTick90
+ (missedTime & 0 ? missedTime : 0);91
package com.actiontec.net. 2
3 import java.io.IOE 4 import java.io.InputS 5
* @author Le 8
*/10 public class DownloadLimiter extends InputStream {11
private InputStream is = null;12
private BandwidthLimiter bandwidthLimiter = null;13
public DownloadLimiter(InputStream is, BandwidthLimiter bandwidthLimiter)15
this.is =17
this.bandwidthLimiter = bandwidthL18
@Override20
public int read() throws IOException {21
if(this.bandwidthLimiter != null)22
this.bandwidthLimiter.limitNextBytes();23
return this.is.read();24
public int read(byte b[], int off, int len) throws IOException27
if (bandwidthLimiter != null)29
bandwidthLimiter.limitNextBytes(len);30
return this.is.read(b, off, len);31
同样,上传控制
package com.actiontec.net. 2
3 import java.io.IOE 4 import java.io.OutputS 5
* @author Le 8
*/10 public class UploadLimiter extends OutputStream {11
private OutputStream os = null;12
private BandwidthLimiter bandwidthLimiter = null;13
public UploadLimiter(OutputStream os, BandwidthLimiter bandwidthLimiter)15
this.os =17
this.bandwidthLimiter = bandwidthL18
@Override21
public void write(int b) throws IOException {22
if (bandwidthLimiter != null)23
bandwidthLimiter.limitNextBytes();24
this.os.write(b);25
public void write(byte[] b, int off, int len) throws IOException {28
if (bandwidthLimiter != null)29
bandwidthLimiter.limitNextBytes(len);30
this.os.write(b, off, len);31
ServerSocket socket = new ServerSocket();2 //其它初始化略
//从中以一定的速率读数据 2 //```java 3 DownloadLimiter dl = new DownloadLimiter(socket.getInputStream(), new BandwidthLimiter(6250)); 4 is = new DataInputStream(dl); 5
6 //读数据 7 int len = is.readInt(); 8 ByteBuffer buffer = ByteBuffer.allocate(4 + len); 9 buffer.putInt(len);10 is.readFully(buffer.array(), 4, buffer.remaining());11 //```12 13 //以一定的速率写数据到14 //```java15 UploadLimiter ul = new UploadLimiter(socket.getOutputStream(), new BandwidthLimiter(6250));16 ul.write();
【网络协议】TCP的流量控制机制
java流量控制
Java实现局域网流量监控
0728-Java流量控制 选择结构
Java解析网络数据流的三种方法
没有更多推荐了,&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
网络数据流的java处理(1)
摘要:1.庞大的java流处理首先,之所以说java流的庞大,是因为java中的流处理比其他语言的流处理在内容上多的多。java流在处理上分为字符流和字节流。字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。Java内用Unicode编码存储字符,字符流处理类负责将外部的其他编码的字符流和java内Unicode字符流之间的转换。而类InputStreamReader和OutputStreamWriter
1.庞大的java流处理
首先,之所以说java流的庞大,是因为java中的流处理比其他语言的流处理在内容上多的多。java流在处理上分为字符流和字节流。字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。Java内用Unicode编码存储字符,字符流处理类负责将外部的其他编码的字符流和java内Unicode字符流之间的转换。而类InputStreamReader和OutputStreamWriter处理字符流和字节流的转换。字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高。对应不同的流,需要不同的流构建器或流过滤实现。java目前依然在逐渐增加其流处理方法,虽然java类库的创作人员可以列举出很多理由来说明这要做的优点,但我还是觉得java开始变得向其他语言一样复杂起来。2.网络数据流的收发
java对网络数据的发送和接收处理,也借用了一般流处理的方法。我们知道,在几乎其他所有语言中,网络数据的收发在利用类似send(或write)和recv(或read)的方法时并没有明显的流处理。但是java和这些语言的收发方法有较大区别,要借助流才可以完成:.......sock = new Socket(addr, port);OutputStream os = sock.getOutputStream();InputStream is = sock.getInputStream();os.write(byte[] b);is.read(byte[] b);这些方法总给人一种不太舒适的感觉。不过从Jdk1.4开始弥补了这一点。JDK1.4中新增加了新的I/O流处理,在缓冲区治理、可伸缩网络和文件IO、字符集支持、正规表达式匹配方面做了新的处理。其中缓冲区治理和通道(Channel)概念则是对网络数据流的收发处理支持的强化。缓冲区治理中ByteBuffer类更好的支持了网络数据流处理。在网络连接中,通道代表了sockets的连接。基于这些新的IO处理,以上代码可以改写为:......ByteBuffer bytebuf = ByteBuffer.allocate(2048); // 创建一个指定大小的缓冲区InetSocketAddress isa = new InetSocketAddress(hostname,port);sc = SocketChannel.open(); // 建立一个socket通道sc.connect( isa); // 建立一个socket连接… sc.write(bytebuf); // 发送数据…sc.read(bytebuf); // 接收数据
这样的程序似乎要流畅的多。
1.庞大的java流处理
首先,之所以说java流的庞大,是因为java中的流处理比其他语言的流处理在内容上多的多。java流在处理上分为字符流和字节流。字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。Java内用Unicode编码存储字符,字符流处理类负责将外部的其他编码的字符流和java内Unicode字符流之间的转换。而类InputStreamReader和OutputStreamWriter处理字符流和字节流的转换。字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高。对应不同的流,需要不同的流构建器或流过滤实现。java目前依然在逐渐增加其流处理方法,虽然java类库的创作人员可以列举出很多理由来说明这要做的优点,但我还是觉得java开始变得向其他语言一样复杂起来。2.网络数据流的收发
java对网络数据的发送和接收处理,也借用了一般流处理的方法。我们知道,在几乎其他所有语言中,网络数据的收发在利用类似send(或write)和recv(或read)的方法时并没有明显的流处理。但是java和这些语言的收发方法有较大区别,要借助流才可以完成:.......sock = new Socket(addr, port);OutputStream os = sock.getOutputStream();InputStream is = sock.getInputStream();os.write(byte[] b);is.read(byte[] b);这些方法总给人一种不太舒适的感觉。不过从Jdk1.4开始弥补了这一点。JDK1.4中新增加了新的I/O流处理,在缓冲区治理、可伸缩网络和文件IO、字符集支持、正规表达式匹配方面做了新的处理。其中缓冲区治理和通道(Channel)概念则是对网络数据流的收发处理支持的强化。缓冲区治理中ByteBuffer类更好的支持了网络数据流处理。在网络连接中,通道代表了sockets的连接。基于这些新的IO处理,以上代码可以改写为:......ByteBuffer bytebuf = ByteBuffer.allocate(2048); // 创建一个指定大小的缓冲区InetSocketAddress isa = new InetSocketAddress(hostname,port);sc = SocketChannel.open(); // 建立一个socket通道sc.connect( isa); // 建立一个socket连接… sc.write(bytebuf); // 发送数据…sc.read(bytebuf); // 接收数据
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
新用户大礼包!
现在注册,免费体验40+云产品,及域名优惠!
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
网络数据流的java处理(1)相关信息,包括
的信息,所有网络数据流的java处理(1)相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International

我要回帖

更多关于 手机打开java文件 的文章

 

随机推荐