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

本文涉及的产品
性能测试 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进行规格选择与性能压测。
相关文章
|
9月前
|
Web App开发 Java 测试技术
《手把手教你》系列技巧篇(五十六)-java+ selenium自动化测试-下载文件-上篇(详细教程)
【5月更文挑战第20天】本文介绍了自动化测试中如何实现无弹窗下载文件,主要针对Firefox浏览器。作者指出,通常的下载操作包括点击下载按钮,但这里讨论的是避免下载弹窗直接保存文件的方法。文章详细讲解了通过设置Firefox参数(如`browser.download.dir`、`browser.helperApps.neverAsk.saveToDisk`等)来实现这一功能,并给出了Java Selenium的示例代码,展示了如何创建FirefoxProfile并进行相关设置,以及如何启动浏览器和执行下载操作。
150 0
《手把手教你》系列技巧篇(五十六)-java+ selenium自动化测试-下载文件-上篇(详细教程)
|
2月前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
82 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
4月前
|
运维
【运维基础知识】用dos批处理批量替换文件中的某个字符串(本地单元测试通过,部分功能有待优化,欢迎指正)
该脚本用于将C盘test目录下所有以t开头的txt文件中的字符串“123”批量替换为“abc”。通过创建批处理文件并运行,可实现自动化文本替换,适合初学者学习批处理脚本的基础操作与逻辑控制。
277 56
|
6月前
|
测试技术 语音技术
FunASR英文离线文件转写软件包问题之性能测试详细结果查看如何解决
FunASR英文离线文件转写软件包问题之性能测试详细结果查看如何解决
98 0
|
4月前
|
安全 Linux 网络安全
Kali 渗透测试:利用HTA文件进行渗透攻击
Kali 渗透测试:利用HTA文件进行渗透攻击
70 1
|
5月前
|
Java C++
代码文件间重复性测试
本文介绍了如何使用代码相似性检测工具simian来找出代码文件中的重复行,并通过示例指令展示了如何将检测结果输出到指定的文本文件中。
|
4月前
|
安全 Linux 网络安全
Kali渗透测试:自动播放文件攻击
Kali渗透测试:自动播放文件攻击
54 0
|
6月前
|
JSON Java 测试技术
单元测试问题之使用JSON文件作为参数化测试的输入源如何解决
单元测试问题之使用JSON文件作为参数化测试的输入源如何解决
110 0
|
6月前
|
Docker 容器
FunASR离线文件转写软件包3.0问题之推理效率测试的配置如何解决
FunASR离线文件转写软件包3.0问题之推理效率测试的配置如何解决
54 0
|
8月前
|
算法 计算机视觉 异构计算
基于FPGA的图像一维FFT变换IFFT逆变换verilog实现,包含tb测试文件和MATLAB辅助验证
```markdown ## FPGA 仿真与 MATLAB 显示 - 图像处理的 FFT/IFFT FPGA 实现在 Vivado 2019.2 中仿真,结果通过 MATLAB 2022a 展示 - 核心代码片段:`Ddddddddddddddd` - 理论:FPGA 实现的一维 FFT/IFFT,加速数字信号处理,适用于高计算需求的图像应用,如压缩、滤波和识别 ```