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

本文涉及的产品
性能测试 PTS,5000VUM额度
简介: 几种读取文件方式的性能测试

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

/**
* 随机读取文件内容
* 
* @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进行规格选择与性能压测。
相关文章
|
2月前
|
机器学习/深度学习 算法 异构计算
m基于FPGA的多通道FIR滤波器verilog实现,包含testbench测试文件
本文介绍了使用VIVADO 2019.2仿真的多通道FIR滤波器设计。展示了系统RTL结构图,并简述了FIR滤波器的基本理论,包括单通道和多通道的概念、常见结构及设计方法,如窗函数法、频率采样法、优化算法和机器学习方法。此外,还提供了Verilog核心程序代码,用于实现4通道滤波器模块,包含时钟、复位信号及输入输出接口的定义。
81 7
|
2月前
|
Web App开发 Java 测试技术
《手把手教你》系列技巧篇(五十六)-java+ selenium自动化测试-下载文件-上篇(详细教程)
【5月更文挑战第20天】本文介绍了自动化测试中如何实现无弹窗下载文件,主要针对Firefox浏览器。作者指出,通常的下载操作包括点击下载按钮,但这里讨论的是避免下载弹窗直接保存文件的方法。文章详细讲解了通过设置Firefox参数(如`browser.download.dir`、`browser.helperApps.neverAsk.saveToDisk`等)来实现这一功能,并给出了Java Selenium的示例代码,展示了如何创建FirefoxProfile并进行相关设置,以及如何启动浏览器和执行下载操作。
36 0
《手把手教你》系列技巧篇(五十六)-java+ selenium自动化测试-下载文件-上篇(详细教程)
|
8天前
|
算法 计算机视觉 异构计算
基于FPGA的图像一维FFT变换IFFT逆变换verilog实现,包含tb测试文件和MATLAB辅助验证
```markdown ## FPGA 仿真与 MATLAB 显示 - 图像处理的 FFT/IFFT FPGA 实现在 Vivado 2019.2 中仿真,结果通过 MATLAB 2022a 展示 - 核心代码片段:`Ddddddddddddddd` - 理论:FPGA 实现的一维 FFT/IFFT,加速数字信号处理,适用于高计算需求的图像应用,如压缩、滤波和识别 ```
|
2天前
|
数据库
获取本地某文件中的以.jpg文件的名字,并导入数据库的测试代码
获取本地某文件中的以.jpg文件的名字,并导入数据库的测试代码
|
3天前
|
JSON 数据格式
Content type ‘text/plain;charset=UTF-8‘ not supported,这里要把测试文件转为json格式
Content type ‘text/plain;charset=UTF-8‘ not supported,这里要把测试文件转为json格式
|
29天前
|
XML Java 测试技术
《手把手教你》系列技巧篇(六十七)-java+ selenium自动化测试 - 读写excel文件 - 中篇(详细教程)
【6月更文挑战第8天】本文介绍了Java中操作Excel的工具,包括POI和JXL。POI支持处理Office 2003及以下的OLE2格式(.xls)和2007以上的OOXML格式(.xlsx)。而JXL只能处理2003版本的Excel文件。文章详细讲解了如何下载和使用JXL库,并给出了一个简单的Java代码示例,展示如何读取2003版Excel文件中的数据。在实际项目中,由于JXL对新版本Excel的支持限制,通常推荐使用POI。
38 5
|
28天前
|
Java 测试技术 Apache
《手把手教你》系列技巧篇(六十八)-java+ selenium自动化测试 - 读写excel文件 - 下篇(详细教程)
【6月更文挑战第9天】本文介绍了如何使用Java处理Excel文件中的不同数据类型,包括日期、数字、布尔值和标签(常规字符串)。文章提供了两个示例,分别使用JXL库和Apache POI库来读取Excel文件。
22 1
|
1月前
|
算法 计算机视觉 异构计算
基于FPGA的图像直方图均衡化处理verilog实现,包含tb测试文件和MATLAB辅助验证
摘要: 在FPGA上实现了图像直方图均衡化算法,通过MATLAB2022a与Vivado2019.2进行仿真和验证。核心程序涉及灰度直方图计算、累积分布及映射变换。算法旨在提升图像全局对比度,尤其适合低对比度图像。FPGA利用可编程增益器和查表技术加速硬件处理,实现像素灰度的均匀重分布,提升视觉效果。![image preview](https://ucc.alicdn.com/pic/developer-ecology/3tnl7rfrqv6tw_a075525027db4afbb9c0529921fd0152.png)
|
1月前
|
Java 测试技术 Apache
《手把手教你》系列技巧篇(六十六)-java+ selenium自动化测试 - 读写excel文件 - 上篇(详细教程)
【6月更文挑战第7天】本文介绍了在Java自动化测试中如何操作Excel数据。文章提到了当测试数据存储在Excel文件时,可以使用Apache的POI库来读写Excel。POI提供了对OLE2(.xls)和OOXML(.xlsx)格式的支持,比JXL库功能更全面。文章还详细讲解了如何下载和添加POI库到项目中,以及准备测试用的Excel文件。最后,给出了一个简单的Java代码示例,演示如何读取Excel文件的内容。
31 1
|
2月前
|
前端开发 PHP 对象存储
如何用Postman测试文件或图片上传
本文介绍了在某些小项目中,如何使用传统方式将文件上传到与应用程序同一服务器上的方法,而不是使用大平台的对象存储。
54 3