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();
}
}
java用NIO实现文件传输_Java Nio 实现文件的传输相关推荐
- java获取文件编码_java如何获取文件编码格式
1:简单判断是UTF-8或不是UTF-8,因为一般除了UTF-8之外就是GBK,所以就设置默认为GBK. 按照给定的字符集存储文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理 ...
- java 读取大文件内容_java读取大文件
java一般读取文件时,将文件文内容全部加在到内存,然后读取,但是这种读取方式很明显不适合读取大文件,在进行大文件处理时,考虑到内存有限,采用分次读取的方式. java分次读取文件内容有三种方式, 1 ...
- java读取 info.plist源码_Java 解析 IPA 文件,读取 Info.plist 信息-Go语言中文社区
在做移动MDM功能的时候,就遇到了这样一个问题,当用户上传IPA文件时,我如何知道这个IPA文件的相关信息呢?IPA文件有一个很重要的文件Info.plist 就类似于Android程序的Manife ...
- java文件递归_java递归处理文件夹和文件
import java.io.File; /** * 文件综合使用示例 */ public class FileDelete { public static void main(String[] ar ...
- java 获取文件权限_Java中的文件权限,检查权限和更改权限 - Break易站
Java提供了许多方法调用来检查和更改文件的权限,例如可以将只读文件更改为具有写入权限.当用户想要限制文件允许的操作时,需要更改文件权限.例如,文件权限可以从写入更改为只读,因为用户不再想要编辑文件. ...
- java 文件 递归_JAVA实现遍历文件夹下的所有文件(递归调用和非递归调用)
JAVA 遍历文件夹下的所有文件(递归调用和非递归调用) 1.不使用递归的方法调用. public void traverseFolder1(String path) { int fileNum = ...
- java多线程 文件夹_Java多线程遍历文件夹,广度遍历加多线程加深度遍历结合
复习IO操作,突然想写一个小工具,统计一下电脑里面的Java代码量还有注释率,最开始随手写了一个递归算法,遍历文件夹,比较简单,而且代码层次清晰,相对易于理解,代码如下:(完整代码贴在最后面,前面是功 ...
- java删除相对路径文件夹_Java IO,io,文件操作,删除文件,删除文件夹,获取文件父级目录...
Java IO,io,文件操作,删除文件,删除文件夹,获取文件父级目录 这里先简单的贴下常用的方法: File.separator //当前系统文件分隔符 File.pathSeparator// F ...
- java实现视频文件转换为flv(带文件缩略图)_java实现视频文件转换为flv(带文件缩略图)...
在android中获取视频文件的缩略图有三种方法: 1.从媒体库中查询 2. android 2.2以后使用ThumbnailUtils类获取 3.调用jni文件,实现MediaMetadataRet ...
最新文章
- 针对JavaScript的常用事件、对象捕获和使用技巧
- Android点击Button实现功能的几种方法
- Python工程师面试题集合
- Pinterest 首位产品经理:爆发式增长背后的 5 大经验总结
- JDK12的五大重要新特性
- python打开文件中文名_windows下Python打开包含中文路径名文件
- full gc JAVA_java触发full gc的几种情况概述
- 郭明錤:华为可能在10月开始出货鸿蒙手机
- select和其元素options
- Android ListView 技巧 (一) Android ListView Header
- 拓端tecdat|python在Keras中使用LSTM解决序列问题
- 利用过滤器(Filter)统一处理请与响应乱码
- APUE 头文件apue.h 解决方法
- 拆解日本松下的老古董收录机,感受50年前的电路设计,满满的历史感
- 算法设计与分析: 2-13 标准二维表问题
- python小游戏————坦克大战
- C语言输出三位数的水仙花数
- 解决IDEA : Could not autowire. No beans of ‘xxxx‘ type found
- 实现一个行内三个div等分_一个div,包含三个小的div,平均分布的样式
- 新中新身份证读卡器开发问题
热门文章
- 网际控制报文协议icmp_网络中的ICMP(Internet控制消息协议)
- hive中实现行转列_漫谈数据仓库之拉链表(原理、设计以及在Hive中的实现)
- Android的引用jar包
- Oracle 练习题 20131017
- js处理16进制hex转str出现的中文乱码问题
- mysql集群搭建(使用docker 一主一从)
- Windows7搭建FTP文件
- java 队列复制_复制一个文件夹里的文件到另一个目录下 (使用队列的方法实现)...
- java 验证码校验_JavaWeb验证码校验功能代码实例
- 混凝土墙开洞_易县混凝土剪力墙切割常见问题