好长时间没用java了... 需要在两台电脑上把文件同步,用java实现了个。。。其实用python以及系统自带的命令更容易实现。。。
遇到的问题:
1. java 的byte[] 向 int long 转换,自己写的转换函数,使用 ret = ret << 8 + byte_i 时,会有问题,因为 << 的优先级比低,改成 ret = (ret<<8) + byte_i 依然有问题,因为byte_i是有符号的。。。int 与 byte 进行运算时,byte会向上扩展。。。。我的实现:
ret = (ret <<8) | (0xff & b[i]);
2.考虑如何将字节转换为float及double: Float有一个方法 Float.intBitsToFloat( int i ),同样Double.longBitsToDouble( long i )。
3. socket的 flush 问题:如果不flush,使用write对socket的输出流发送数据之后,有可能数据一直缓冲在本机中。。。
写的较为简单,没有图形界面,且一旦开始执行没法取消,客户端也没有指定(手动或自动判断)需要同步的文件,后续加上其它功能。。。
服务器端代码:
import java.net.*;
import java.io.*;
class Util{
public static byte [] i2b(int i){
byte[] b = new byte[4];
for(int i1=0; i1<4; i1++ ){
int v = ((i>>(8*i1)) & 0xff);
b[3-i1]=(byte)v;
}
return b;
}
public static byte [] i2b(long i){
byte[] b = new byte[8];
for(int i1=0; i1<8; i1++ ){
b[7-i1]=(byte)((i>>(8*i1)) & 0xff);
}
return b;
}
public static void writeInteger(OutputStream os, int val)throws IOException{
byte [] b = i2b(val);
// off=4时,即已经读取了4个字节,跳出.
int off = 0;
os.write(b, 0, b.length );
}
public static void writeFileInfo(OutputStream os, File f)throws IOException{
//文件名:长度,文件内容长度.md5.
//输出文件名,输出文件内容。
byte [] name = f.getName().getBytes();
byte [] name_len = i2b(name.length);
byte [] content_len = i2b( f.length() );
// 文件名长度.
os.write( name_len );
// 文件名.
os.write( name );
// 文件内容长度.
os.write( content_len );
os.flush();
}
public static bool