由于使用缓冲区可以选择读取缓冲区的起始位置,因此编码方式对于写入和读取都十分重要,根据所使用的编码方式来计算数据所占的字节数,从而实现正确的读写。具体实现代码如下:
import static java.lang.Math.ceil;
import static java.lang.Math.sqrt;
import static java.lang.Math.min;
import java.nio.file.StandardOpenOption.*;
import java.nio.file.*;
import java.nio.channels.*;
import java.nio.*;
import java.util.*;
import java.io.*;
public class PrimesToFile {
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成方法存根
Path file=Paths.get(System.getProperty("user.home")).resolve("Beginning Java Stuff").resolve("fibonnaci.bin");
if(!Files.exists(file)){
//检测文件是否存在
System.out.println(file+" does not exist. Terminating program");
System.exit(1);
}
final int count=8;
ByteBuffer buf=ByteBuffer.allocate(8*count);//建立缓冲区,分配的单位为字节
LongBuffer values=buf.asLongBuffer();//建立long型视图,long占8字节
byte[] bytes=buf.array(); //将数据缓冲区内的字节数据转化为数组
int totalRead=0;
try{
BufferedInputStream fileIn=new BufferedInputStream(Files.newInputStream(file)); //读取文件并存入缓冲流
int numberRead=0;
while(true){
numberRead=fileIn.read(bytes,0,bytes.length);//依次读取数据
System.out.println("The length is:"+numberRead);
if(numberRead==-1){
break;
}
totalRead+=numberRead/8;//
for(int i=0;i<numberRead/8;++i){
System.out.format("%12d",values.get());
}
System.out.println();
values.flip();
}
System.out.format("%d values read.%n",totalRead);
}catch(IOException e){
System.err.println("Error writing file: "+file);
e.printStackTrace();
}
}
}
读取结果如下: