几种读取文件方式的性能测试

简介: 几种读取文件方式的性能测试

这些天一直在对文件进行读写操作,为了性能,换了好几种方式,我下面贴出来:

/**
* 随机读取文件内容
* 
* @param fileName
*/
public static String readFileByRandomAccess(String path) {
  StringBuffer sb = new StringBuffer();
  RandomAccessFile randomFile = null;
  try {
    // 打开一个随机访问文件流,按只读方式
    randomFile = new RandomAccessFile(path, "rw");
    byte[] bytes = new byte[1024];
    int byteread = 0;
    while ((byteread = randomFile.read(bytes)) != -1) {
      // System.out.write(bytes, 0, byteread);
      sb.append(new String(bytes, 0, byteread));
    }
  } catch (IOException e) {
    e.printStackTrace();
  } finally {
    if (randomFile != null) {
      try {
        randomFile.close();
      } catch (IOException e1) {
      }
    }
  }
  return sb.toString();
}


/**
* 以行为单位读取文件,常用于读面向行的格式化文件
* 
* @param fileName
*/
public static String readFileByLines(String path) {
  StringBuffer sb = new StringBuffer();
  BufferedReader reader = null;
  try {
    reader = new BufferedReader(new FileReader(path));
    String tempString = null;
    while ((tempString = reader.readLine()) != null) {
    sb.append(tempString).append(System.getProperty("line.separator"));// 显示行号
    }
  } catch (IOException e) {
    e.printStackTrace();
  } finally {
    try {
      if (reader != null) {
        reader.close();
      }
    } catch (IOException e) {
      System.err.println("流关闭失败");
    }
  }
  return sb.toString();
}


/**
* 使用Java.nio ByteBuffer字节将一个文件输出
* 
* @param filePath
*/
public static String readFileByBybeBuffer(String path) {
  StringBuffer sb = new StringBuffer();
  FileInputStream in = null;
  FileOutputStream out = null;
  try {
    // 获取源文件和目标文件的输入输出流
    in = new FileInputStream(path);
    // 获取输入输出通道
    FileChannel fcIn = in.getChannel();
    ByteBuffer buffer = ByteBuffer.allocate(1024);
    CharBuffer charBuffer = null;
    Charset charset = Charset.forName("UTF-8");
    CharsetDecoder decoder = charset.newDecoder();
    while (true) {
      // clear方法重设缓冲区,使它可以接受读入的数据
      buffer.clear();
      // 从输入通道中将数据读到缓冲区
      int r = fcIn.read(buffer);
      if (r == -1) {
        break;
      }
      charBuffer = decoder.decode(buffer);
      // flip方法让缓冲区可以将新读入的数据写入另一个通道
      buffer.flip();
      sb.append(charBuffer.toString());
    }
  } catch (Exception e) {
    e.printStackTrace();
  } finally {
    try {
      if (in != null && out != null) {
        in.close();
        out.close();
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  //System.out.println(sb.toString());
  return sb.toString();
}


/**
* 通过scanner的方式读取文件
* 
* @param fileName
* @return
*/
public static String readByScanner(String path) {
  StringBuffer sb = new StringBuffer();
  Scanner s = null;
  try {
    File f = new File(path);
      s = new Scanner(f);
      while (s.hasNext()) {
      sb.append(s.next());
    }
  } catch (FileNotFoundException e) {
    e.printStackTrace();
  } finally {
    if(s!=null)s.close();
  }
  return sb.toString();
}


我们来测试下:

String fileName="Z:\\flume\\flume\\conf\\ErrLog";
long t1=OperateUtil.getTime();
OperateUtil.readByScanner(fileName);
long t2=OperateUtil.getTime();
OperateUtil.readFileByBybeBuffer(fileName);
long t3=OperateUtil.getTime();
OperateUtil.readFileByLines(fileName);
long t4=OperateUtil.getTime();
OperateUtil.readFileByRandomAccess(fileName);
long t5=OperateUtil.getTime();
    
System.out.println("readByScanner:"+(t2-t1));
System.out.println("readFileByBybeBuffer:"+(t3-t2));
System.out.println("readFileByLines:"+(t4-t3));
System.out.println("readFileByRandomAccess:"+(t5-t4));
ErrLog的文件大小是65M。


下面看下测试结果:

readByScanner:6180
readFileByBybeBuffer:171
readFileByLines:468
readFileByRandomAccess:531


经过多次测试,依旧发现readFileByBybeBuffer这个方式的效率更好,使用的是NIO

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
相关文章
|
6天前
|
机器学习/深度学习 算法 异构计算
m基于FPGA的多通道FIR滤波器verilog实现,包含testbench测试文件
本文介绍了使用VIVADO 2019.2仿真的多通道FIR滤波器设计。展示了系统RTL结构图,并简述了FIR滤波器的基本理论,包括单通道和多通道的概念、常见结构及设计方法,如窗函数法、频率采样法、优化算法和机器学习方法。此外,还提供了Verilog核心程序代码,用于实现4通道滤波器模块,包含时钟、复位信号及输入输出接口的定义。
21 7
|
2月前
|
存储 缓存 算法
基于FPGA的图像双边滤波实现,包括tb测试文件和MATLAB辅助验证
基于FPGA的图像双边滤波实现,包括tb测试文件和MATLAB辅助验证
|
1月前
|
传感器 算法 计算机视觉
基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容是关于一个基于肤色模型和中值滤波的手部检测算法的描述,包括算法的运行效果图和所使用的软件版本(matlab2022a, vivado2019.2)。算法分为肤色分割和中值滤波两步,其中肤色模型在YCbCr色彩空间定义,中值滤波用于去除噪声。提供了一段核心程序代码,用于处理图像数据并在FPGA上实现。最终,检测结果输出到"hand.txt"文件。
|
1月前
|
算法 异构计算
m基于FPGA的电子钟verilog实现,可设置闹钟,包含testbench测试文件
该文介绍了基于FPGA的电子钟设计,利用Vivado2019.2平台进行开发并展示测试结果。电子钟设计采用Verilog硬件描述语言,核心包括振荡器、分频器和计数器。时间显示为2个十进制格式,闹钟功能通过存储器和比较器实现,当当前时间等于设定时间时触发。文中给出了Verilog核心程序示例,展示了时钟信号、设置信号及输出的交互。
28 2
|
3月前
|
算法 异构计算
基于FPGA的图像高斯滤波实现,包括tb测试文件和MATLAB辅助验证
基于FPGA的图像高斯滤波实现,包括tb测试文件和MATLAB辅助验证
|
3月前
|
算法 异构计算 索引
m基于FPGA的Hamming汉明编译码verilog实现,包含testbench测试文件,不使用IP核
m基于FPGA的Hamming汉明编译码verilog实现,包含testbench测试文件,不使用IP核
42 1
|
3月前
|
SQL Java 数据库连接
Mybatis之Mybatis简介、搭建Mybatis相关步骤(开发环境、maven、核心配置文件、mapper接口、映射文件、junit测试、log4j日志)
【1月更文挑战第2天】 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)
203 3
Mybatis之Mybatis简介、搭建Mybatis相关步骤(开发环境、maven、核心配置文件、mapper接口、映射文件、junit测试、log4j日志)
|
1月前
|
算法 异构计算
m基于FPGA的RS+卷积级联编译码实现,RS用IP核实现,卷积用verilog实现,包含testbench测试文件
m基于FPGA的RS+卷积级联编译码实现,RS用IP核实现,卷积用verilog实现,包含testbench测试文件
15 0
|
2天前
|
算法 计算机视觉 异构计算
基于FPGA的图像累积直方图verilog实现,包含tb测试文件和MATLAB辅助验证
该内容展示了FPGA实现图像累积直方图的算法。使用Vivado2019.2和matlab2022a,通过FPGA的并行处理能力优化图像处理。算法基于像素值累加分布,计算图像中像素值小于等于特定值的像素个数。核心代码为`test_image`模块,读取二进制图像文件并传递给`im_hist`单元,生成直方图和累积直方图。
|
11天前
|
SQL 存储 分布式计算
Hive【基础知识 02-2】【Hive CLI 命令行工具使用】【详细举例-包含测试脚本文件】
【4月更文挑战第7天】Hive【基础知识 02-2】【Hive CLI 命令行工具使用】【详细举例-包含测试脚本文件】
16 0

热门文章

最新文章