`

RandomAccessFile 类读写测试及其性能优化(二)

阅读更多
package io;

import java.io.File;
import java.io.RandomAccessFile;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * RandomAccessFile 类读写测试及其性能优化(二)
 * 
 * 读取 RandomAccessFile 类读写测试及其性能优化(一) 
 * (链接 http://jackyin5918.iteye.com/blog/2022888 )中
 * GenerateIntArray 生成的并保存到文件的数据.
 * 
 * 多线程读取文件和多线程写文件一样没有提升速度.
 * 
 * 疑似RandomAccessFile 读写文件时会阻塞,对文件加锁神马的的,待研究.
 * 
 *
 */
public class GetTheMiddle
{
  private int     count = 1000; // 数组的个数,
  private int     size  = 10;   // 每个数组的元素个数
  private int[][] dataArr;

  public GetTheMiddle()
  {
    dataArr = new int[count][size];
  }

  public GetTheMiddle(int count, int size)
  {
    this.count = count;
    this.size = size;
    this.dataArr = new int[count][size];
  }

  public int[][] getDataArr()
  {
    return dataArr;
  }

  public int[][] readData(File f)
  {
    try
    {
      RandomAccessFile rf = new RandomAccessFile(f, "r");
      for (int i = 0; i < count; i++)
      {
        for (int j = 0; j < size; j++)
        {
          dataArr[i][j] = rf.readInt();
        }
      }
      rf.close();
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }

    return dataArr;
  }
  
  class ReadDataTask implements Runnable
  {

    private File f;
    private int dataIndex;
    
    public ReadDataTask(File f,int dataIndex)
    {
      this.f = f;
      this.dataIndex = dataIndex;
    }
    
    @Override
    public void run()
    {
      try
      {
        RandomAccessFile rf = new RandomAccessFile(f, "r");
        rf.skipBytes(dataIndex * size * 4 );
        
        for (int j = 0; j < size; j++)
        {
          dataArr[dataIndex][j] = rf.readInt();
        }
        rf.close();
      }
      catch (Exception e)
      {
        e.printStackTrace();
      }
    }
    
  }
  
  public int[][] readData_M(File f)
  {
    try
    {
      ExecutorService exec = Executors.newCachedThreadPool();
      for(int i=0;i<count;i++)
      {
        exec.execute(new ReadDataTask(f,i));
      }
      exec.shutdown();
      while(true)
      {
        if(exec.isTerminated()) break;
      }
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
    
    return dataArr;
  }

  public static void main(String[] args)
  {
    int count = 3;
    int size = 4;
    boolean bPrintData = true; // 是否打印生成的数组,当数据量大是不打印,只在小数据量时打印以便测试
    System.out.printf("count = %d, size = %d \n\n", count, size);

    GenerateIntArray generator = new GenerateIntArray(count, size);
    GetTheMiddle gm = new GetTheMiddle(count,size);

    File f;
    try
    {
      f = new File("D:\\D\\test_data.dat");
      generator.refreshDataArr();
      generator.writeData2File_B(f);
      
      System.out.println("正在读取数据,请稍后...");
      long startTmie = System.nanoTime();
      gm.readData(f);
      long totalTime = (System.nanoTime() - startTmie)/ 100000;
      System.out.println("readData(f) 读取数据成功, 耗时:" + totalTime);
      System.out.println();
      
      System.out.println("正在读取数据,请稍后...");
      startTmie = System.nanoTime();
      gm.readData_M(f);
      totalTime = (System.nanoTime() - startTmie)/ 100000;
      System.out.println("readData_M(f) 读取数据成功, 耗时:" + totalTime);
      System.out.println();
      
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
    
    if(bPrintData)
    {
      System.out.println("generator中生成的数据...");
      int[][] intArr = generator.getDataArr();
      for (int i = 0; i < count; i++)
      {
        for (int j = 0; j < size; j++)
        {
          System.out.printf("%d ", intArr[i][j]);
        }
        System.out.println();
      }
      
      System.out.println("读取出来的数组...");
      intArr = gm.getDataArr();
      for (int i = 0; i < count; i++)
      {
        for (int j = 0; j < size; j++)
        {
          System.out.printf("%d ", intArr[i][j]);
        }
        System.out.println();
      }
    }
  }

}

 

分享到:
评论

相关推荐

    四川大学java6课件

    `BufferedReader`和`BufferedWriter`同样提供缓冲,以优化性能。`StringReader`和`StringWriter`则方便字符串的读写。 除了字节流和字符流,Java还提供了其他类型的流,如处理文件的`File`类,可以创建、读取、写入...

    IO操作【极品版】IO操作【极品版】

    通过熟练掌握这些概念,开发者可以有效地实现各种IO操作,优化程序性能,并确保数据安全传输。 在提供的文件名"IOTest"中,我们可以假设这是一个包含IO操作相关测试代码的文件,用于验证上述概念的实际应用。通过...

    java学习笔记(下)

    - **字元串流**:`Reader`和`Writer`类及其派生类如`FileReader`、`FileWriter`用于文本文件的读写,`BufferedReader`、`BufferedWriter`提供缓存功能,`PrintWriter`用于格式化输出。 #### 执行绪(Thread) Java...

    面向对象技术与UML课件及源代码-by 南邮-陈杨

    11.5.1用RandomAccessFile类进行文件读写 11.5.2使用Properties类 11.6小结 第12章多线程开发 12.1认识多线程 12.1.1为什么需要多线程 12.1.2继承Thread类开发多线程 12.1.3实现Runnable接口开发多线程 ...

    JAVA教程.pdf

    - 未来趋势包括对云计算的支持、更好的性能优化以及更多的安全特性。 ##### 1.3 JAVA环境的配置 - **1.3.1 JAVA的工作原理与运行系统** - Java代码被编译成字节码,由Java虚拟机(JVM)解释执行。 - JVM提供了跨...

Global site tag (gtag.js) - Google Analytics