FileChannel
public class TestFileChannel {
/**
* 复制文件
* @param srcfile
* @param destFile
* @throws IOException
*/
public void copyFile(File srcfile,File destFile ) throws IOException{
FileChannel srcfileChannel = new FileInputStream(srcfile).getChannel();
FileChannel destfileChannel = new FileOutputStream(destFile).getChannel();
srcfileChannel.transferTo(0, srcfileChannel.size(), destfileChannel);
srcfileChannel.close();
destfileChannel.close();
}
/**
* 文件尾部追加另一文件内容
* @param srcfile
* @param destFile
* @throws IOException
*/
public void appendFile(File srcfile,File destFile ) throws IOException{
FileChannel srcfileChannel = new FileInputStream(srcfile).getChannel();
FileChannel destfileChannel = new FileOutputStream(destFile,true).getChannel();
destfileChannel.write(ByteBuffer.wrap("\r\n".getBytes()));
destfileChannel.transferFrom(srcfileChannel, destfileChannel.size(), srcfileChannel.size());
srcfileChannel.close();
destfileChannel.close();
}
/**
* 固定文件格式内容写入
* 文件格式:
* 1. 性名:类型:String,长度:50
* 2. 年龄:类型:int ,长度 :4
* 3. 身高: 类型:flaot ,长度:4
* 4. 性别: 类型:byte,长度:1
* 5. 简介长度: 类型:int,长度:4
* 6. 简介:类型 String,长度:不确定,由简介长度指定
* @param file
* @throws IOException
*/
public void writeFile(File file) throws IOException{
FileChannel fileChannel = new FileOutputStream(file).getChannel();
String name="yanlei";//max size=50;
int age=30;
float stature = 1.65f;
byte sex = 1;
String introduction="good main";
ByteBuffer nameByteBuffer = ByteBuffer.allocate(50);
nameByteBuffer.put(name.getBytes());
nameByteBuffer.rewind();//limit=capacity,position=0
byte [] introBytes = introduction.getBytes();
int length = 4+4+1+4+introBytes.length;//age.length+stature.length+sex.length+一个int(introduction占用字节数)+introduction.length
ByteBuffer otherByteBuffer = ByteBuffer.allocate(length);
otherByteBuffer.putInt(age);
otherByteBuffer.putFloat(stature);
otherByteBuffer.put(sex);
otherByteBuffer.putInt(introBytes.length);
otherByteBuffer.put(introBytes);
otherByteBuffer.rewind();//limit=capacity,position=0
fileChannel.write(new ByteBuffer[]{nameByteBuffer,otherByteBuffer});
fileChannel.close();
}
/**
* 固定文件格式内容读取
* 文件格式:
* 1. 性名:类型:String,长度:50
* 2. 年龄:类型:int ,长度 :4
* 3. 身高: 类型:flaot ,长度:4
* 4. 性别: 类型:byte,长度:1
* 5. 简介长度: 类型:int,长度:4
* 6. 简介:类型 String,长度:不确定,由简介长度指定
* @param file
* @throws IOException
*/
public void readFile(File file) throws Exception{
FileChannel fileChannel = new FileInputStream(file).getChannel();
ByteBuffer nameByteBuffer = ByteBuffer.allocate(50);
fileChannel.read(nameByteBuffer);
String name = new String(delete0(nameByteBuffer.array()));
int otherLength = 4+4+1+4;
ByteBuffer otherByteBuffer = ByteBuffer.allocate(otherLength);
fileChannel.read(otherByteBuffer);
otherByteBuffer.flip();
int age = otherByteBuffer.getInt();
float stature = otherByteBuffer.getFloat();
byte sex = otherByteBuffer.get();
int introLength = otherByteBuffer.getInt();
ByteBuffer introByteBuffer = ByteBuffer.allocate(introLength);
fileChannel.read(introByteBuffer);
String introduction = new String(introByteBuffer.array());
System.out.println("name="+name+",age="+age+",stature="+stature+",sex="+sex+",introduction="+introduction);
//输出name=yanlei,age=30,stature=1.65,sex=1,introduction=good main
}
private byte [] delete0(byte [] data){
if(data != null){
int i=data.length-1;
for(;i>=0;i--){
if(data[i]!= 0){
break;
}
}
return Arrays.copyOf(data, i+1);
}
return null;
}
public static void main(String []args ){
try{
TestFileChannel test = new TestFileChannel();
test.copyFile(new File("test.txt"), new File("destFile.txt"));
test.appendFile(new File("test.txt"), new File("destFile.txt"));
test.writeFile(new File("persion.txt"));
test.readFile(new File("persion.txt"));
}catch(Exception e){
e.printStackTrace();
}
}
}
writeFile 方法生成的文件内容: