java用NIO实现文件传输_Java Nio 实现文件的传输

使用Java Nio实现文件的传输

1、ServerSocket.java

package ch2;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.net.InetSocketAddress;

import java.nio.ByteBuffer;

import java.nio.channels.FileChannel.MapMode;

import java.nio.channels.FileChannel;

import java.nio.channels.SelectionKey;

import java.nio.channels.Selector;

import java.nio.channels.ServerSocketChannel;

import java.nio.channels.SocketChannel;

import java.util.Iterator;

import java.util.Set;

public class ServerSocket {

public static void main(String[] args) throws Exception {

int port = 10000;

//打开服务器套接字通道

ServerSocketChannel ssc = ServerSocketChannel.open();

//创建一个选择器

Selector selector = Selector.open();

//设置非阻塞模式

ssc.configureBlocking(false);

InetSocketAddress address = new InetSocketAddress(port);

//绑定监听端口

ssc.bind(address);

//注册选择器,保持等待模式

ssc.register(selector, SelectionKey.OP_ACCEPT);

System.out.println("服务器已开启,端口:"+port);

while(true){

selector.select();

//返回此选择器的已选择键集

Set keys=selector.selectedKeys();

Iterator iterKey=keys.iterator();

while(iterKey.hasNext()){

SelectionKey sk=iterKey.next();

//测试此键的通道是否已准备好接受新的套接字连接

if(sk.isAcceptable()){

SocketChannel sc=ssc.accept();

try {

//接收

new ReceiveAndSend().receiveFile(sc);

sc.close();

} catch (Exception e) {

}

}

}

}

}

}

ClientSocket.java

package ch2;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.net.InetSocketAddress;

import java.nio.ByteBuffer;

import java.nio.channels.FileChannel;

import java.nio.channels.SocketChannel;

public class ClientSocket {

public static void main(String[] args) throws Exception {

int port=10000;

String ip = "localhost";

//打开传输通道

SocketChannel sc = SocketChannel.open();

//连接

sc.connect(new InetSocketAddress(ip,port));

//发送文件

new ReceiveAndSend().sendFile(sc, "e:"+File.separator+"node.txt","node.txt");

//关闭传输通道

sc.close();

}

}

ReceiveAndSend.java

package ch2;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.nio.ByteBuffer;

import java.nio.channels.FileChannel;

import java.nio.channels.SocketChannel;

import java.nio.charset.Charset;

public class ReceiveAndSend {

/**

* 接收文件

* @param sc

* @throws IOException

*/

public void receiveFile(SocketChannel sc) throws IOException{

//获取保存文件

File file=new File("e:"+File.separator+"mmm.txt");

FileOutputStream fos=new FileOutputStream(file);

//获取通道

FileChannel foc = fos.getChannel();

//设置接收消息体缓冲区

ByteBuffer bb=ByteBuffer.allocateDirect(1024);

//设置接收消息头缓冲区

ByteBuffer headByte=ByteBuffer.allocateDirect(32);

//接收消息头

sc.read(headByte);

byte[] b=new byte[32];

headByte.flip();

for (int i = 0; headByte.hasRemaining(); i++) {

b[i]=headByte.get();

}

headByte.clear();

//获取文件信息

String fileInfo=new String(b,Charset.forName("UTF-8"));

String[] strInfo=fileInfo.split("\\|");

System.out.println("文件:"+strInfo[0]+"--大小:"+strInfo[1]);

int read=sc.read(bb);

while(read!=-1){

bb.flip();

//写入到输出通道

foc.write(bb);

bb.clear();

read=sc.read(bb);

}

foc.close();

fos.close();

}

/**

* 发送文件

* @param sc

* @param path

* @param fileName

* @throws IOException

*/

public void sendFile(SocketChannel sc,String path,String fileName) throws IOException{

File file=new File(path);

FileInputStream fis = new FileInputStream(file);

FileChannel fic = fis.getChannel();

ByteBuffer bb = ByteBuffer.allocateDirect(1024);

ByteBuffer headbb = ByteBuffer.allocateDirect(32);

int read=0;

long fileSize = file.length();

long sendSize=0;

System.out.println("文件大小:"+fileSize);

//拼接头信息

String head=fileName+"|"+fileSize+"|;";

//将头信息写入缓冲区

headbb.put(head.getBytes(Charset.forName("UTF-8")));

int c=headbb.capacity()-headbb.position();

//填满头信息

for (int i = 0; i < c; i++) {

headbb.put(";".getBytes(Charset.forName("UTF-8")));

}

headbb.flip();

//将头信息写入到通道

sc.write(headbb);

do{

//将文件写入到缓冲区

read = fic.read(bb);

sendSize+=read;

bb.flip();

//将文件写入到通道

sc.write(bb);

bb.clear();

System.out.println("已传输/总大小:"+sendSize+"/"+fileSize);

}while(read!=-1&&sendSize

System.out.println("文件传输成功");

fic.close();

fis.close();

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是RPC?RPC框架dubbo的核心流程

一、REST 与 RPC&#xff1a; 1、什么是 REST 和 RPC 协议&#xff1a; ​ 在单体应用中&#xff0c;各模块间的调用是通过编程语言级别的方法函数来实现&#xff0c;但分布式系统运行在多台机器上&#xff0c;一般来说&#xff0c;每个服务实例都是一个进程&#xff0c;服务…

zap安装提示java_使用API调用进行ZAP身份验证

我正在使用ZAP API调用来使用命令行测试站点 . 但即使我遵循正确的步骤&#xff0c;我的用户身份验证也有问题 . 但是当蜘蛛作为用户时&#xff0c;我仍然无法设法通过登录页面 . 以下是我要介绍的步骤 .1.包含在上下文中(context / includeContext)2.更改认证方法以形成基础 .…

MySQL 中 count(*) 和 count(1) 有什么区别?哪个性能最好?

当我们对一张数据表中的记录进行统计的时候&#xff0c;习惯都会使用 count 函数来统计&#xff0c;但是 count 函数传入的参数有很多种&#xff0c;比如 count(1)、count(*)、count(字段) 等。 到底哪种效率是最好的呢&#xff1f;是不是 count(*) 效率最差&#xff1f; 我曾…

java中有ClockPane类吗_Java程序设计教程 冶金工业出版社第9章

第9章多线程与Applet//例程9-1&#xff1a;Pi.java/*演示采用多线程技术计算圆周率*/public class Pi{public static void main(String[] args){PiCaculator pc new PiCaculator();Thread t new Thread(pc);t.start();try{Thread.sleep (10000); //休眠&#xff0c;等待可能出…

Spring Boot为什么不需要额外安装Tomcat?

首次接触 Spring Boot 的时候&#xff0c;绝大多数小伙伴应该和我一样好奇&#xff1a; 为什么 Spring Boot 不需要额外安装 Tomcat 啊&#xff1f; 到底为什么呢&#xff1f;让我们带着好奇心开始今天的旅程吧。 打开上一节我们搭建好的 tobebetterjavaer 项目&#xff0c;找…

azure webjob java_使用 WebJobs 运行后台任务 | Azure Docs

在 Azure 应用服务中使用 WebJobs 运行后台任务Run background tasks with WebJobs in Azure App Service10/19/2020本文内容本文介绍如何使用 Azure 门户部署 WebJobs&#xff0c;以便上传可执行文件或脚本。This article shows how to deploy WebJobs by using the Azure por…

适合程序员的画图工具

最近很多读者私信问我&#xff0c;我图解文章中用到的画图工具、思维导图工具、代码贴图工具是什么&#xff1f; 我在很早的时候提到过&#xff0c;不过时间有点久了&#xff0c;而且比较零散&#xff0c;可能现在大部分读者还不知道。 我今天统一整理一下&#xff0c;我图解…

go加载python_python培训 | python调用go语言来提速

在写一些对性能要求十分严格的功能的时候&#xff0c;python往往力不从心。毕竟是一个解释性的语言&#xff0c;没有办法和变异性的语言去比较速度和内存占用率。但是python的本身的特定就使得我们可以将耗时的操作移交给编译性的语言去实现。由于项目上的关系&#xff0c;需要…

Spring Boot框架中使用Jackson的处理总结

1.前言 通常我们在使用Spring Boot框架时&#xff0c;如果没有特别指定接口的序列化类型&#xff0c;则会使用Spring Boot框架默认集成的Jackson框架进行处理&#xff0c;通过Jackson框架将服务端响应的数据序列化成JSON格式的数据。 本文主要针对在Spring Boot框架中使用Jac…

SpringBoot中对输出的json按字典表排序

SpringBoot中对输出的json按字典表排序 springboot默认的json处理为jackson。 如果是全局设置&#xff0c;在application.properties中添加spring.jackson.mapper.sort-properties-alphabeticallytrue

Java hdfs连接池_Java使用连接池管理Hdfs连接

记录一下Java API 连接hadoop操作hdfs的实现流程(使用连接池管理)。以前做过这方面的开发&#xff0c;本来以为不会有什么问题&#xff0c;但是做的还是坑坑巴巴&#xff0c;内心有些懊恼&#xff0c;记录下这烦人的过程&#xff0c;警示自己切莫眼高手低&#xff01;一&#x…

为了拿捏 Redis 数据结构,我画了 40 张图(完整版)

Redis 为什么那么快&#xff1f; 除了它是内存数据库&#xff0c;使得所有的操作都在内存上进行之外&#xff0c;还有一个重要因素&#xff0c;它实现的数据结构&#xff0c;使得我们对数据进行增删查改操作时&#xff0c;Redis 能高效的处理。 因此&#xff0c;这次我们就来…

java put set_Java PutItemRequest.setItem方法代码示例

import com.amazonaws.services.dynamodbv2.model.PutItemRequest; //导入方法依赖的package包/类public List reindex(T instance) throws DataStoreException {DynamoClassMapping tableInfo getClassMapping(instance);log.debug("reindex {}", instance.getClas…

fastjson为什么默认是无序的

在做项目的时候&#xff0c;无意间发现添加到json中的元素是无存放顺序的。严格来说&#xff0c;json默认是有存放顺序的&#xff0c;不过是采用HashCode值来排序。下面来看一段源码 上图展示了创建json对象的一个过程&#xff0c;可以清晰的看出&#xff0c;无论用户调用哪个…

php一句话怎么写_PHP一句话木马后门

在我们进行渗透测试的最后阶段&#xff0c;入侵到内网里&#xff0c;无论是想要浏览网站结构&#xff0c;还是抓取数据库&#xff0c;或者是挂个木马等等&#xff0c;到最后最常用的就是执行一句话木马&#xff0c;从客户端轻松连接服务器。一句话木马的原理很简单&#xff0c;…

JSON书写格式

JSON是什么 JSON ( JavaScript Object Notation) &#xff0c;是一种数据交互格式。 为什么有这个技术 Json之前&#xff0c;大家都用 XML 传递数据。XML 是一种纯文本格式&#xff0c;所以适合在网络上交换数据&#xff0c;但是 XML 格式比较复杂&#xff0c;终于道格拉斯克…

php判断目录是否有写的权限,php中判断文件空目录是否有读写权限

/*问题出现&#xff1a;如何检查一个目录是否可写&#xff0c;如何目录下还有目录和文件&#xff0c;那么都要检查思路&#xff1a;(1)首先先写出检查空目录是否可写的算法&#xff1a;在该目录中生成一个文件&#xff0c;如果不能生成&#xff0c;表明该目录没有写的权限(2)使…

List.addAll方法的入参不能为null

缘由&#xff1a; ​ 某天&#xff0c;发现一段日志中出现了诡异的NPE。经过定位&#xff0c;认为是ArrayList不能加入null所致。 验证&#xff1a; ​ new一个ArrayList&#xff0c;然后调用其addAll方法&#xff0c;并将入参设为null。 public static void main(String[] …

php 微信转账,php实现微信公众号企业转账功能

企业付款提供由商户直接付钱至用户微信零钱的能力&#xff0c;支持平台操作及接口调用两种方式&#xff0c;资金到账速度快&#xff0c;使用及查询方便。主要用来解决合理的商户对用户付款需求&#xff0c;比如&#xff1a;保险理赔、彩票兑换等等。特点发起方式灵活&#xff0…

Java之HashMap.values()转List时的错误和正确操作

因为项目中需要获取到Map的值的集合&#xff0c;所以调用了HashMap.values()方法转成List&#xff0c;当时是使用了以下代码。&#xff08;逻辑上这样想应该没问题&#xff0c;但生活总是会是不是给你一点小“”惊喜“”&#xff09; List<AreaItemOpt> areaItemOpts (…