java读取文件的几种方式性能比较
//普通输入流读取文件内容 public static long checksumInputStream(Path filename) { try(InputStream in= Files.newInputStream(filename)) { CRC32 crc=new CRC32(); int c; while ((c=in.read())!=-1) { crc.update(c); } return crc.getValue(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return 0; } } //带有缓冲读取文件 public static long checkSumBufferedInputStream(Path filename) { try(InputStream in=new BufferedInputStream(Files.newInputStream(filename))) { CRC32 crc=new CRC32(); int c; while ((c=in.read())!=-1) { crc.update(c); } return crc.getValue(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return 0; } //随机读取文件 public static long checksumRandomAccessFile(Path filename) { try(RandomAccessFile file=new RandomAccessFile(filename.toFile(), "r")) { long length=file.length(); CRC32 crc=new CRC32(); for (int i = 0; i < length; i++) { file.seek(i); int c=file.readByte(); crc.update(c); } return crc.getValue(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return 0; } //通过磁盘映射读取文件 public static long checksumMappedFile(Path filename) { try(FileChannel channel=FileChannel.open(filename)) { CRC32 crc=new CRC32(); int length=(int)channel.size(); MappedByteBuffer buffer= channel.map(FileChannel.MapMode.READ_ONLY, 0, length); for (int i = 0; i <length; i++) { int c=buffer.get(i); crc.update(c); } return crc.getValue(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return 0; }
普通输入流:68513ms
带缓冲的方式:116ms
随机访问读取:81203ms
磁盘映射读取方式:102ms