Java中常见的IO读写效率对比

发布时间:2021-08-30 17:09:48 作者:chen
来源:亿速云 阅读:228

这篇文章主要介绍“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 {            /**       *        * 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读写效率对比”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

推荐阅读:
  1. php和java对比哪个效率更高
  2. 为什么java的IO流读写中出现乱码问题?

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:Java并发编程中的悲观锁和乐观锁机制

下一篇:Java中对象的等价性对比

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》