当前位置: 代码迷 >> J2SE >> javaIO传扬多个二进制文件(不大逛论坛,分就这么多了,拜托了!)
  详细解决方案

javaIO传扬多个二进制文件(不大逛论坛,分就这么多了,拜托了!)

热度:74   发布时间:2016-04-23 20:32:13.0
javaIO流传多个二进制文件(不大逛论坛,分就这么多了,拜托了!)
我想问个问题,我想写个同步的小程序,就是把台式机上的某个文件夹内的二进制文件传给笔记本,通过java的socket,怎么做比较规范,因为我感觉用字节流的话不好分别文件名,区分每个文件,有人能给个思路什么的吗,谢谢了

------解决方案--------------------
可以先做一个测试
1.做一个小的媒体文件,用ue或者其他hex工具解析一下
2.然后用inputsteam读出文件,打印二进制,对比下是否一致

如果以上测试没有问题,进行下一步,对大文件制定传输协议,分段传输
1.媒体文件一般都比较大,制定一个分段传输协议,比如,每段数据多大,每段定义一个包头和编号
2.收包时根据协议进行解析,合并为一个文件
------解决方案--------------------


package com.shaw.test;

import java.net.*;
import java.io.*;
import java.util.logging.Logger;

public class TCPServer {

private static final Logger logger = Logger.getLogger(TCPServer.class.getName());

public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(10902);
try {
doAccept(serverSocket.accept());
} finally {
serverSocket.close();
}
}

public static void doAccept(Socket socket) throws IOException {
try {
DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
try {
int fileCount = in.readInt();// 第一次读取文件总数
logger.info("文件数量:" + fileCount);

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

String fileName = in.readUTF();
logger.info("文件名:" + fileName);

long fileLength = in.readLong();
logger.info("文件大小:" + fileLength + "字节");

OutputStream out = new BufferedOutputStream(new FileOutputStream(new File("c:/test/", fileName)));
try {
int len = 0;// 每次读取了多少字节
long count = 0;// 总计读取了多少字节
byte[] buffer = new byte[4096];// 缓冲区定义在外面,可以复用
while (count < fileLength) {
// 这里是重点,注意控制读取的字节数
len = in.read(buffer, 0, (int) Math.min(buffer.length, fileLength - count));
out.write(buffer, 0, len);
count += len;

logger.info("本次读取:" + len + "字节;共读取:" + count + "字节;剩余:" + (fileLength - count) + "字节");
}
out.flush();
} finally {
out.close();
}
}
} finally {
if (in != null) {
in.close();// 包装流在关闭时会同步关闭底层流
}
}

} finally {
if (socket != null && !socket.isClosed()) {
socket.close();
}
}
}
}