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(); } } } }
相关推荐
`BufferedReader`和`BufferedWriter`同样提供缓冲,以优化性能。`StringReader`和`StringWriter`则方便字符串的读写。 除了字节流和字符流,Java还提供了其他类型的流,如处理文件的`File`类,可以创建、读取、写入...
通过熟练掌握这些概念,开发者可以有效地实现各种IO操作,优化程序性能,并确保数据安全传输。 在提供的文件名"IOTest"中,我们可以假设这是一个包含IO操作相关测试代码的文件,用于验证上述概念的实际应用。通过...
- **字元串流**:`Reader`和`Writer`类及其派生类如`FileReader`、`FileWriter`用于文本文件的读写,`BufferedReader`、`BufferedWriter`提供缓存功能,`PrintWriter`用于格式化输出。 #### 执行绪(Thread) Java...
11.5.1用RandomAccessFile类进行文件读写 11.5.2使用Properties类 11.6小结 第12章多线程开发 12.1认识多线程 12.1.1为什么需要多线程 12.1.2继承Thread类开发多线程 12.1.3实现Runnable接口开发多线程 ...
- 未来趋势包括对云计算的支持、更好的性能优化以及更多的安全特性。 ##### 1.3 JAVA环境的配置 - **1.3.1 JAVA的工作原理与运行系统** - Java代码被编译成字节码,由Java虚拟机(JVM)解释执行。 - JVM提供了跨...