Java中常见的IO读写效率对比
这篇文章主要介绍“Java中常见的IO读写效率对比”,在日常操作中,相信很多人在Java中常见的IO读写效率对比问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中常见的IO读写效率对比”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
在网站设计、成都做网站中从网站色彩、结构布局、栏目设置、关键词群组等细微处着手,突出企业的产品/服务/品牌,帮助企业锁定精准用户,提高在线咨询和转化,使成都网站营销成为有效果、有回报的无锡营销推广。创新互联专业成都网站建设10年了,客户满意度97.8%,欢迎成都创新互联客户联系。
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 { /** * * execute readByBufferReader spend 444 million sencond! execute readByBufferedInputStreamNoArray spend 27903 million sencond! execute readByBufferedInputStream spend 192 million sencond! execute readByChannel spend 484 million sencond! execute readByChannelMap spend 42 million sencond! execute readByDataInputStream spend 440 million sencond! * * @param args * @throws Exception */ public static final int BUFFSIZE = 180; public static final String root = "E:\\sourcecode\\corejava\\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); } /* * execute readBuffer spend 421 million sencond! execute readByte spend * 36172 million sencond! */ 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 src, String dest) throws IOException { File srcFile = new File(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(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 src file:" + src + " reason:" + ioe.getMessage()); } } } } /* * * History: * * * * $Log: $ */
到此,关于“Java中常见的IO读写效率对比”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!
网站标题:Java中常见的IO读写效率对比
链接分享:http://hbruida.cn/article/gpoiio.html