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

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

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

/**
* 随机读取文件内容
* 
* @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

相关文章
|
Java 测试技术 数据安全/隐私保护
通过yaml文件配置自动化测试程序
通过yaml文件可以将自动化测试环境,测试数据和测试行为分开,请看一下案例
459 4
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
测试技术 语音技术
FunASR英文离线文件转写软件包问题之性能测试详细结果查看如何解决
FunASR英文离线文件转写软件包问题之性能测试详细结果查看如何解决
589 0
|
运维
【运维基础知识】用dos批处理批量替换文件中的某个字符串(本地单元测试通过,部分功能有待优化,欢迎指正)
该脚本用于将C盘test目录下所有以t开头的txt文件中的字符串“123”批量替换为“abc”。通过创建批处理文件并运行,可实现自动化文本替换,适合初学者学习批处理脚本的基础操作与逻辑控制。
1525 56
|
安全 关系型数据库 MySQL
MySQL8使用物理文件恢复MyISAM表测试
MySQL8使用物理文件恢复MyISAM表测试
364 0
|
安全 Linux 网络安全
Kali渗透测试:自动播放文件攻击
Kali渗透测试:自动播放文件攻击
478 0
|
安全 Linux 网络安全
Kali 渗透测试:利用HTA文件进行渗透攻击
Kali 渗透测试:利用HTA文件进行渗透攻击
429 1
|
Java C++
代码文件间重复性测试
本文介绍了如何使用代码相似性检测工具simian来找出代码文件中的重复行,并通过示例指令展示了如何将检测结果输出到指定的文本文件中。
447 2
|
算法 计算机视觉 异构计算
基于FPGA的图像一维FFT变换IFFT逆变换verilog实现,包含tb测试文件和MATLAB辅助验证
```markdown ## FPGA 仿真与 MATLAB 显示 - 图像处理的 FFT/IFFT FPGA 实现在 Vivado 2019.2 中仿真,结果通过 MATLAB 2022a 展示 - 核心代码片段:`Ddddddddddddddd` - 理论:FPGA 实现的一维 FFT/IFFT,加速数字信号处理,适用于高计算需求的图像应用,如压缩、滤波和识别 ```