使用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 实现文件的传输相关推荐

  1. java获取文件编码_java如何获取文件编码格式

    1:简单判断是UTF-8或不是UTF-8,因为一般除了UTF-8之外就是GBK,所以就设置默认为GBK. 按照给定的字符集存储文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理 ...

  2. java 读取大文件内容_java读取大文件

    java一般读取文件时,将文件文内容全部加在到内存,然后读取,但是这种读取方式很明显不适合读取大文件,在进行大文件处理时,考虑到内存有限,采用分次读取的方式. java分次读取文件内容有三种方式, 1 ...

  3. java读取 info.plist源码_Java 解析 IPA 文件,读取 Info.plist 信息-Go语言中文社区

    在做移动MDM功能的时候,就遇到了这样一个问题,当用户上传IPA文件时,我如何知道这个IPA文件的相关信息呢?IPA文件有一个很重要的文件Info.plist 就类似于Android程序的Manife ...

  4. java文件递归_java递归处理文件夹和文件

    import java.io.File; /** * 文件综合使用示例 */ public class FileDelete { public static void main(String[] ar ...

  5. java 获取文件权限_Java中的文件权限,检查权限和更改权限 - Break易站

    Java提供了许多方法调用来检查和更改文件的权限,例如可以将只读文件更改为具有写入权限.当用户想要限制文件允许的操作时,需要更改文件权限.例如,文件权限可以从写入更改为只读,因为用户不再想要编辑文件. ...

  6. java 文件 递归_JAVA实现遍历文件夹下的所有文件(递归调用和非递归调用)

    JAVA 遍历文件夹下的所有文件(递归调用和非递归调用) 1.不使用递归的方法调用. public void traverseFolder1(String path) { int fileNum = ...

  7. java多线程 文件夹_Java多线程遍历文件夹,广度遍历加多线程加深度遍历结合

    复习IO操作,突然想写一个小工具,统计一下电脑里面的Java代码量还有注释率,最开始随手写了一个递归算法,遍历文件夹,比较简单,而且代码层次清晰,相对易于理解,代码如下:(完整代码贴在最后面,前面是功 ...

  8. java删除相对路径文件夹_Java IO,io,文件操作,删除文件,删除文件夹,获取文件父级目录...

    Java IO,io,文件操作,删除文件,删除文件夹,获取文件父级目录 这里先简单的贴下常用的方法: File.separator //当前系统文件分隔符 File.pathSeparator// F ...

  9. java实现视频文件转换为flv(带文件缩略图)_java实现视频文件转换为flv(带文件缩略图)...

    在android中获取视频文件的缩略图有三种方法: 1.从媒体库中查询 2. android 2.2以后使用ThumbnailUtils类获取 3.调用jni文件,实现MediaMetadataRet ...

最新文章

  1. 针对JavaScript的常用事件、对象捕获和使用技巧
  2. Android点击Button实现功能的几种方法
  3. Python工程师面试题集合
  4. Pinterest 首位产品经理:爆发式增长背后的 5 大经验总结
  5. JDK12的五大重要新特性
  6. python打开文件中文名_windows下Python打开包含中文路径名文件
  7. full gc JAVA_java触发full gc的几种情况概述
  8. 郭明錤:华为可能在10月开始出货鸿蒙手机
  9. select和其元素options
  10. Android ListView 技巧 (一) Android ListView Header
  11. 拓端tecdat|python在Keras中使用LSTM解决序列问题
  12. 利用过滤器(Filter)统一处理请与响应乱码
  13. APUE 头文件apue.h 解决方法
  14. 拆解日本松下的老古董收录机,感受50年前的电路设计,满满的历史感
  15. 算法设计与分析: 2-13 标准二维表问题
  16. python小游戏————坦克大战
  17. C语言输出三位数的水仙花数
  18. 解决IDEA : Could not autowire. No beans of ‘xxxx‘ type found
  19. 实现一个行内三个div等分_一个div,包含三个小的div,平均分布的样式
  20. 新中新身份证读卡器开发问题

热门文章

  1. 网际控制报文协议icmp_网络中的ICMP(Internet控制消息协议)
  2. hive中实现行转列_漫谈数据仓库之拉链表(原理、设计以及在Hive中的实现)
  3. Android的引用jar包
  4. Oracle 练习题 20131017
  5. js处理16进制hex转str出现的中文乱码问题
  6. mysql集群搭建(使用docker 一主一从)
  7. Windows7搭建FTP文件
  8. java 队列复制_复制一个文件夹里的文件到另一个目录下 (使用队列的方法实现)...
  9. java 验证码校验_JavaWeb验证码校验功能代码实例
  10. 混凝土墙开洞_易县混凝土剪力墙切割常见问题