资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

javanio代码实现 java实现n!

怎么为JAVA NIO或Netty程序设置网络通信代理?

服务端

成都创新互联公司基于成都重庆香港及美国等地区分布式IDC机房数据中心构建的电信大带宽,联通大带宽,移动大带宽,多线BGP大带宽租用,是为众多客户提供专业服务器托管报价,主机托管价格性价比高,为金融证券行业遂宁托管服务器,ai人工智能服务器托管提供bgp线路100M独享,G口带宽及机柜租用的专业成都idc公司。

// 设置一个处理客户端消息和各种消息事件的类(Handler)bootstrap.setPipelineFactory(newChannelPipelineFactory() { @Override publicChannelPipeline getPipeline()throwsException { returnChannels.pipeline( newObjectDecoder(ClassResolvers.cacheDisabled(this .getClass().getClassLoader())), newObjectServerHandler()); }});

客户端

// 设置一个处理服务端消息和各种消息事件的类(Handler)

bootstrap.setPipelineFactory(newChannelPipelineFactory() { @Override publicChannelPipeline getPipeline()throwsException { returnChannels.pipeline(newObjectEncoder(), newObjectClientHandler()); }});

要传递对象,自然要有一个被传递模型,一个简单的Pojo,当然,实现序列化接口是必须的。

/** * @author lihzh * @alia OneCoder * @blog */public class Command implementsSerializable { privatestaticfinallongserialVersionUID = 7590999461767050471L; privateString actionName; publicString getActionName() { returnactionName; } publicvoidsetActionName(String actionName) { this.actionName = actionName; }}

服务端和客户端里,我们自定义的Handler实现如下:

ObjectServerHandler .java

/** * 对象传递服务端代码 * * @author lihzh * @alia OneCoder * @blog */public class ObjectServerHandler extendsSimpleChannelHandler { /** * 当接受到消息的时候触发 */ @Override publicvoidmessageReceived(ChannelHandlerContext ctx, MessageEvent e) throwsException { Command command = (Command) e.getMessage(); // 打印看看是不是我们刚才传过来的那个 System.out.println(command.getActionName()); }}

ObjectClientHandler .java

/** * 对象传递,客户端代码 * * @author lihzh * @alia OneCoder * @blog */public class ObjectClientHandler extendsSimpleChannelHandler { /** * 当绑定到服务端的时候触发,给服务端发消息。 * * @author lihzh * @alia OneCoder */ @Override publicvoidchannelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) { // 向服务端发送Object信息 sendObject(e.getChannel()); } /** * 发送Object * * @param channel * @author lihzh * @alia OneCoder */ privatevoidsendObject(Channel channel) { Command command =newCommand(); command.setActionName("Hello action."); channel.write(command); } }

启动后,服务端正常打印结果:Hello action.

简单梳理一下思路:

通过Netty传递,都需要基于流,以ChannelBuffer的形式传递。所以,Object - ChannelBuffer.

Netty提供了转换工具,需要我们配置到Handler。

样例从客户端 - 服务端,单向发消息,所以在客户端配置了编码,服务端解码。如果双向收发,则需要全部配置Encoder和Decoder。

这里需要注意,注册到Server的Handler是有顺序的,如果你颠倒一下注册顺序:

bootstrap.setPipelineFactory(newChannelPipelineFactory() {

@Override publicChannelPipeline getPipeline()throwsException { returnChannels.pipeline(newObjectServerHandler(), newObjectDecoder(ClassResolvers.cacheDisabled(this .getClass().getClassLoader())) ); }});

结果就是,会先进入我们自己的业务,再进行解码。这自然是不行的,会强转失败。至此,你应该会用Netty传递对象了吧。

利用java.nio的FileChannel能够实现按行读取文件吗?(解决了)

利用java.nio的FileChannel能够实现按行读取文件:

具体思路是:设置两个缓冲区,一大一小,大的缓冲区为每次读取的量,小的缓冲区存放每行的数据(确保大小可存放文本中最长的那行)。读取的时候判断是不是换行符13,是的话则返回一行数据,不是的话继续读取,直到读完文件。

实现方法:

FileChannel fc=raf.getChannel();

//一次读取文件,读取的字节缓存数

ByteBuffer fbb=ByteBuffer.allocate(1024*5);

fc.read(fbb);

fbb.flip();

//每行缓存的字节   根据你的实际需求     

ByteBuffer bb=ByteBuffer.allocate(500);

//判断是否读完文件

public boolean hasNext() throws IOException {

if(EOF)return false;

if(fbb.position()==fbb.limit()){//判断当前位置是否到了缓冲区的限制

if(readByte()==0)  return false;

}

while(true){

if(fbb.position()==fbb.limit()){

if(readByte()==0)  break;

}

byte a=fbb.get();

if(a==13){

if(fbb.position()==fbb.limit()){

if(readByte()==0)  break;

}

return true;

}else{

if (bb.position()  bb.limit()) {

bb.put(a);

}else {

if(readByte()==0)  break;

}

}

}

return true;

}

Java NIO和IO的区别

Java

NIO和IO的主要区别如下:

1.NIO

的创建目的是为了让

Java

程序员可以实现高速

I/O

而无需编写自定义的本机代码。NIO

将最耗时的

I/O

操作(即填充和提取缓冲区)转移回操作系统,因而可以极大地提高速度。传统的IO操作属于阻塞型,严重影响程序的运行速度。

2,。流与块的比较。原来的

I/O

库(在

java.io.*中)

NIO

最重要的区别是数据打包和传输的方式。正如前面提到的,原来的

I/O

以流的方式处理数据,而

NIO

以块的方式处理数据。

面向流

I/O

系统一次一个字节地处理数据。一个输入流产生一个字节的数据,一个输出流消费一个字节的数据。为流式数据创建过滤器非常容易。链接几个过滤器,以便每个过滤器只负责单个复杂处理机制的一部分,这样也是相对简单的。不利的一面是,面向流的

I/O

通常相当慢。

3.一个

面向块

I/O

系统以块的形式处理数据。每一个操作都在一步中产生或者消费一个数据块。按块处理数据比按(流式的)字节处理数据要快得多。但是面向块的

I/O

缺少一些面向流的

I/O

所具有的优雅性和简单性。


文章名称:javanio代码实现 java实现n!
链接地址:http://cdkjz.cn/article/ddghigj.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220