Java中常见的IO读写效率对比
这篇文章主要介绍“Java中常见的IO读写效率对比”,在日常操作中,相信很多人在Java中常见的IO读写效率对比问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中常见的IO读写效率对比”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
Java中的IO的类库非常的庞大,选择性非常的多,当面临一个问题时,往往不知道如何下手!
更具我现在的理解,在效率不是非常重要的情况下,一般情况下可能只需要考虑两种情况,即想按照字节去读取,还是想按照行去读取,而一般情况无论采取什么方式去读取,***的方式都莫过于用Buffered...去包装要是用的类,而如果效率要求比较高则可以考虑是用FileChannel 或者是 file map,其中file Map是读写效率***的一种方式,如果读取的文件非常的大这种方式是***,下面的例子是对常见几种读文件方式的效率比较,通过一个动态代理的模式来统计每个方法的执行时间,测试文件是100多兆的数据文件。
package com.eric.io; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.channels.FileChannel; import com.eric.reflect.ExecuteTimerHandler; public class ReadFileTools implements IReadFileTools { public static final int BUFFSIZE = 180; public static final String root = "E:\\sourcecode\\corejava\\class="lazy" data-src\\com\\eric\\io\\"; public static final boolean printContext = false; public static void main(String[] args) throws Exception { String file = root + "VISA_INPUT_FULL"; IReadFileTools bi = (IReadFileTools) ExecuteTimerHandler.newInstance(new ReadFileTools()); bi.readByBufferReader(file); bi.readByBufferedInputStreamNoArray(file); bi.readByBufferedInputStream(file); bi.readByChannel(file); bi.readByChannelMap(file); bi.readByDataInputStream(file); } public String readByBufferReader(String file) { StringBuilder sb = new StringBuilder(); try { BufferedReader br = new BufferedReader(new FileReader(new File(file))); String line; long count = 0; while ((line = br.readLine()) != null) { if (printContext) { System.out.println(line); } sb.append(line); count += line.length(); } br.close(); } catch (Exception ex) { ex.printStackTrace(); } return sb.toString(); } public void readByDataInputStream(String file) throws Exception { DataInputStream dis = new DataInputStream(new ByteArrayInputStream(new ReadFileTools().readByBufferReader(file).getBytes())); while (dis.available() > 0) { char c = (char) dis.read(); if (printContext) { System.out.println(c); } } } //this method not use byte array to get byte public String readByBufferedInputStreamNoArray(String file) { try { InputStream is = new BufferedInputStream(new FileInputStream(new File(file))); while (is.available() > 0) { char c = (char) is.read(); if (printContext) { System.out.println(c); } } } catch (Exception ex) { ex.printStackTrace(); } return null; } //use byte array to get bytes from file public void readByBufferedInputStream(String file) throws Exception { BufferedInputStream input = new BufferedInputStream(new FileInputStream(file)); byte[] bytes = new byte [BUFFSIZE]; while (input.available() > 0) { input.read(bytes); } } //use file channel to get byte from file public void readByChannel(String file) throws Exception { FileChannel in = new FileInputStream(file).getChannel(); ByteBuffer buffer = ByteBuffer.allocate(BUFFSIZE); while (in.read(buffer) != -1) { buffer.flip(); // Prepare for writing if (printContext) { System.out.println(buffer.getChar()); } buffer.clear(); // Prepare for reading } in.close(); } //use MappedByteBuffer to read byte from file public void readByChannelMap(String file) throws Exception { FileChannel fc = new FileInputStream(new File(file)).getChannel(); CharBuffer cb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size()).asCharBuffer(); char c; while (cb.hasRemaining()) c = cb.get(); if (printContext) { System.out.println(c); } fc.close(); } public void copyFileByChannel(String file, String file2) throws Exception { FileChannel in = new FileInputStream(file).getChannel(); FileChannel out = new FileOutputStream(file2).getChannel(); ByteBuffer buffer = ByteBuffer.allocate(BUFFSIZE); while (in.read(buffer) != -1) { buffer.flip(); // Prepare for writing out.write(buffer); buffer.clear(); // Prepare for reading } } public void test() { System.out.println("test"); } public void copyFile(String source, String dest) throws Exception { BufferedReader br = new BufferedReader(new FileReader(new File(source))); BufferedWriter bw = new BufferedWriter(new FileWriter(new File(dest))); String temp; while ((temp = br.readLine()) != null) { bw.write(temp + "\n"); } } public void storingAndRecoveringData(String file) throws Exception { DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(file))); DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file))); dos.writeBoolean(false); dos.writeByte(10); dos.writeDouble(1213654); dos.writeUTF("aihua"); dos.close(); System.out.println(dis.readBoolean()); System.out.println(dis.readByte()); System.out.println(dis.readDouble()); System.out.println(dis.readUTF()); dis.close(); } public void doCopyFile(String class="lazy" data-src, String dest) throws IOException { File class="lazy" data-srcFile = new File(class="lazy" data-src); File destFile = new File(dest); if (destFile.exists()) { boolean d = destFile.delete(); if (d) { System.out.print("删除成功!"); } else { System.out.print("删除失败!"); } } BufferedInputStream input = new BufferedInputStream(new FileInputStream(class="lazy" data-srcFile)); try { BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(destFile)); try { byte[] buffer = new byte [4096]; int n = 0; while (-1 != (n = input.read(buffer))) { output.write(buffer, 0, n); } System.out.println("Copy Successful::" + dest); } finally { try { if (output != null) { output.close(); } } catch (IOException ioe) { ioe.printStackTrace(); } } } finally { try { if (input != null) { input.close(); } } catch (IOException ioe) { System.out.println("failed class="lazy" data-src file:" + class="lazy" data-src + " reason:" + ioe.getMessage()); } } } }
到此,关于“Java中常见的IO读写效率对比”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341