1.nio实现读取大文件,之后分批读取写入数据库

2.nio实现读取大文件,之后分批写入指定文件

  1. package com.ally;
  2. import java.io.File;
  3. import java.io.RandomAccessFile;
  4. import java.nio.ByteBuffer;
  5. import java.nio.channels.FileChannel;
  6. import java.sql.*;
  7. /**
  8. * Created by admin on 2016/6/28.
  9. * 1.nio分批读取sql文件并执行插入数据库
  10. * 2.读取一个文件写入另外文件
  11. */
  12. public class TestNio {
  13. public static void main(String args[]) throws Exception {
  14. System.err.println("begin");
  15. long start = System.currentTimeMillis();
  16. int _5M = 1024 * 1024 * 5;
  17. File fin = new File("D:\\drug_general_info.sql");
  18. FileChannel fcin = new RandomAccessFile(fin, "r").getChannel();
  19. ByteBuffer rBuffer = ByteBuffer.allocate(_5M);
  20. //将文件读取执行到数据库
  21. readFileByLine(_5M, fcin, rBuffer);
  22. //将文件读取并写入另外文件
  23. File fout = new File("D:\\mm.sql");
  24. FileChannel fcout = new RandomAccessFile(fout, "rws").getChannel();
  25. ByteBuffer wBuffer = ByteBuffer.allocateDirect(_5M);
  26. saveOtherFile( _5M,  fcin, rBuffer,  fcout,  wBuffer);
  27. System.err.print((System.currentTimeMillis() - start) / 1000);
  28. }
  29. /**
  30. * 将一个文件内容写入另外一个
  31. * @param bufSize
  32. * @param fcin
  33. * @param rBuffer
  34. * @param fcout
  35. * @param wBuffer
  36. */
  37. public static void saveOtherFile(int bufSize, FileChannel fcin,
  38. ByteBuffer rBuffer, FileChannel fcout, ByteBuffer wBuffer){
  39. Statement pst = null;
  40. String enterStr = "\n";
  41. try {
  42. byte[] bs = new byte[bufSize];
  43. StringBuilder strBuf = new StringBuilder("");
  44. String tempString = null;
  45. while (fcin.read(rBuffer) != -1) {
  46. int rSize = rBuffer.position();
  47. rBuffer.rewind();
  48. rBuffer.get(bs);
  49. rBuffer.clear();
  50. tempString = new String(bs, 0, rSize);
  51. int fromIndex = 0;
  52. int endIndex = 0;
  53. int i = 0;
  54. while ((endIndex = tempString.indexOf(enterStr, fromIndex)) != -1) {
  55. String line = tempString.substring(fromIndex, endIndex);
  56. line = strBuf.toString() + line;
  57. writeFileByLine(fcout, wBuffer, line);
  58. strBuf.delete(0, strBuf.length());
  59. fromIndex = endIndex + 1;
  60. }
  61. }
  62. } catch (Exception e) {
  63. e.printStackTrace();
  64. }
  65. }
  66. /**
  67. * 读文件写入数据库
  68. * @param bufSize
  69. * @param fcin
  70. * @param rBuffer
  71. */
  72. public static void readFileByLine(int bufSize, FileChannel fcin,
  73. ByteBuffer rBuffer) {
  74. Connection conn = null;
  75. Statement pst = null;
  76. String enterStr = "\n";
  77. try {
  78. byte[] bs = new byte[bufSize];
  79. StringBuilder strBuf = new StringBuilder("");
  80. String tempString = null;
  81. Class.forName("com.mysql.jdbc.Driver");
  82. conn = DriverManager.getConnection(
  83. "jdbc:mysql://localhost:3306/doctor?useUnicode=true&characterEncoding=utf-8", "root", "root");
  84. pst = conn.createStatement();
  85. while (fcin.read(rBuffer) != -1) {
  86. int rSize = rBuffer.position();
  87. rBuffer.rewind();
  88. rBuffer.get(bs);
  89. rBuffer.clear();
  90. tempString = new String(bs, 0, rSize);
  91. int fromIndex = 0;
  92. int endIndex = 0;
  93. int i = 0;
  94. while ((endIndex = tempString.indexOf(enterStr, fromIndex)) != -1) {
  95. String line = tempString.substring(fromIndex, endIndex);
  96. line = strBuf.toString() + line;
  97. strBuf.delete(0, strBuf.length());
  98. fromIndex = endIndex + 1;
  99. pst.addBatch(line);
  100. /*  System.out.println("-----------------------");
  101. System.out.println(line);
  102. System.out.println("-----------------------");*/
  103. if (i % 100 == 0) {
  104. System.out.println("执行了:" + i);
  105. if (i == 2700) {
  106. System.out.println("导了:" + i);
  107. }
  108. int[] flag = pst.executeBatch();
  109. System.out.println("结果:" + flag[0]);
  110. }
  111. i += 1;
  112. }
  113. // 执行批量更新
  114. pst.executeBatch();
  115. if (rSize > tempString.length()) {
  116. strBuf.append(tempString.substring(fromIndex,
  117. tempString.length()));
  118. } else {
  119. strBuf.append(tempString.substring(fromIndex, rSize));
  120. }
  121. //  System.out.println(strBuf.toString());
  122. }
  123. } catch (Exception e) {
  124. e.printStackTrace();
  125. } finally {
  126. try {
  127. if (pst != null) {
  128. pst.close();
  129. }
  130. if (conn != null) {
  131. conn.close();
  132. }
  133. } catch (SQLException e) {
  134. e.printStackTrace();
  135. }
  136. }
  137. }
  138. public static void writeFileByLine(FileChannel fcout, ByteBuffer wBuffer,
  139. String line) {
  140. try {
  141. fcout.write(wBuffer.wrap(line.getBytes()), fcout.size());
  142. } catch (Exception e) {
  143. e.printStackTrace();
  144. }
  145. }
  146. }
package com.ally;

import java.io.File;

import java.io.RandomAccessFile;

import java.nio.ByteBuffer;

import java.nio.channels.FileChannel;

import java.sql.*; /**
  • Created by admin on 2016/6/28.
  • 1.nio分批读取sql文件并执行插入数据库
  • 2.读取一个文件写入另外文件

    */

    public class TestNio {

    public static void main(String args[]) throws Exception {

    System.err.println("begin");

    long start = System.currentTimeMillis();

    int _5M = 1024 * 1024 * 5;

    File fin = new File("D:\drug_general_info.sql");

    FileChannel fcin = new RandomAccessFile(fin, "r").getChannel();

    ByteBuffer rBuffer = ByteBuffer.allocate(_5M);

    //将文件读取执行到数据库

    readFileByLine(_5M, fcin, rBuffer);
     //将文件读取并写入另外文件
    File fout = new File("D:\\mm.sql");
    FileChannel fcout = new RandomAccessFile(fout, "rws").getChannel();
    ByteBuffer wBuffer = ByteBuffer.allocateDirect(_5M);
    saveOtherFile( _5M, fcin, rBuffer, fcout, wBuffer);
    System.err.print((System.currentTimeMillis() - start) / 1000);

    }

    /**

    • 将一个文件内容写入另外一个

    • @param bufSize

    • @param fcin

    • @param rBuffer

    • @param fcout

    • @param wBuffer

      */

      public static void saveOtherFile(int bufSize, FileChannel fcin,

      ByteBuffer rBuffer, FileChannel fcout, ByteBuffer wBuffer){

      Statement pst = null;

      String enterStr = "\n";

      try {

      byte[] bs = new byte[bufSize];

      StringBuilder strBuf = new StringBuilder("");

      String tempString = null;

      while (fcin.read(rBuffer) != -1) {

      int rSize = rBuffer.position();

      rBuffer.rewind();

      rBuffer.get(bs);

      rBuffer.clear();

      tempString = new String(bs, 0, rSize);

      int fromIndex = 0;

      int endIndex = 0;

      int i = 0;

      while ((endIndex = tempString.indexOf(enterStr, fromIndex)) != -1) {

      String line = tempString.substring(fromIndex, endIndex);

      line = strBuf.toString() + line;

      writeFileByLine(fcout, wBuffer, line);

      strBuf.delete(0, strBuf.length());

      fromIndex = endIndex + 1;

               }
      }
      } catch (Exception e) {
      e.printStackTrace();
      }

    }

    /**

    • 读文件写入数据库

    • @param bufSize

    • @param fcin

    • @param rBuffer

      */

      public static void readFileByLine(int bufSize, FileChannel fcin,

      ByteBuffer rBuffer) {

      Connection conn = null;

      Statement pst = null;

      String enterStr = "\n";

      try {

      byte[] bs = new byte[bufSize];

      StringBuilder strBuf = new StringBuilder("");

      String tempString = null;

      Class.forName("com.mysql.jdbc.Driver");

      conn = DriverManager.getConnection(

      "jdbc:mysql://localhost:3306/doctor?useUnicode=true&characterEncoding=utf-8", "root", "root");

      pst = conn.createStatement();

      while (fcin.read(rBuffer) != -1) {

           int rSize = rBuffer.position();
      rBuffer.rewind();
      rBuffer.get(bs);
      rBuffer.clear();
      tempString = new String(bs, 0, rSize);
      int fromIndex = 0;
      int endIndex = 0;
      int i = 0;
      while ((endIndex = tempString.indexOf(enterStr, fromIndex)) != -1) {
      String line = tempString.substring(fromIndex, endIndex);
      line = strBuf.toString() + line;
      strBuf.delete(0, strBuf.length());
      fromIndex = endIndex + 1;
      pst.addBatch(line);
      /* System.out.println("-----------------------");
      System.out.println(line);
      System.out.println("-----------------------");*/
      if (i % 100 == 0) {
      System.out.println("执行了:" + i);
      if (i == 2700) {
      System.out.println("导了:" + i);
      }
      int[] flag = pst.executeBatch();
      System.out.println("结果:" + flag[0]);
      }
      i += 1;
      }
      // 执行批量更新
      pst.executeBatch(); if (rSize > tempString.length()) {
      strBuf.append(tempString.substring(fromIndex,
      tempString.length()));
      } else {
      strBuf.append(tempString.substring(fromIndex, rSize));
      }
      // System.out.println(strBuf.toString());
      }

      } catch (Exception e) {

      e.printStackTrace();

      } finally {

      try {

      if (pst != null) {

      pst.close();

      }

      if (conn != null) {

      conn.close();

      }

      } catch (SQLException e) {

      e.printStackTrace();

      }

      }

      }

    public static void writeFileByLine(FileChannel fcout, ByteBuffer wBuffer,

    String line) {

    try {

    fcout.write(wBuffer.wrap(line.getBytes()), fcout.size());

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

    }

nio实现文件读取写入数据库或文件的更多相关文章

  1. PostgreSql那点事(文件读取写入、命令执行的办法)

    • 2013/07/9 作者: admin PostgreSql那点事(文件读取写入.命令执行的办法) 今天无意发现了个PostgreSQL环境,线上学习了下,一般的数据注射(读写数据库)差异不大,不 ...

  2. xml文件读取到数据库

    xml文件读取到数据库   第一步,导包 c3p0,dom4j,jaxen,MySQL-connector 第二步  xml文件,config文件 第三步 javabean 第四步 c3p0的工具类 ...

  3. Excel 读取写入数据库

    // Excel 读取写入数据库 // 3.8版本的poi  4.0 可以不用写  parseCell  这个方法,可以直接赋值 STRING 类型 import org.apache.poi.hss ...

  4. SpringBoot读取Linux服务器某路径下文件\读取项目Resource下文件

    // SpringBoot读取Linux服务器某路径下文件 public String messageToRouted() { File file = null; try { file = Resou ...

  5. (OAF)jdeveloper集成log4j并将日志输出到指定文件并写入数据库

    参考: How to configure Log4j in JDev 11g Ever wanted to use log4j in your adf project ? Well though Or ...

  6. python向config、ini文件读取写入

    config读取操作 cf = configparser.ConfigParser() # 实例化对象 cf.read(filename) # 读取文件 cf.sections() # 读取secti ...

  7. html外部文件读取/写入

    1.文件的读取 外部文件读取控件: <input type="file" id="file_jquery" onchange="file_jqu ...

  8. python学习笔记6-输入输出与文件读取写入

    (1)打印到屏幕:print (2)读取键盘输入:input/raw_input #键盘输入 str = raw_input("Please enter:"); print (&q ...

  9. shell cat 合并文件,合并数据库sql文件

    > 覆盖写入 >> append模式写入 ###################################################################合并数 ...

随机推荐

  1. _00020 妳那伊抹微笑_谁的异常最诡异第一期之 SqlServer RSA premaster secret error

    博文作者:妳那伊抹微笑 博客地址:http://blog.csdn.net/u012185296 博文标题:_00020 妳那伊抹微笑_谁的异常最诡异第一期之 SqlServer RSA premas ...

  2. angularjs 模块化

    <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...

  3. hpuoj--校赛--爬楼梯(模拟)

    问题 E: 感恩节KK专场--爬楼梯 时间限制: 1 Sec  内存限制: 1000 MB 提交: 382  解决: 89 [提交][状态][讨论版] 题目描述 来机房比赛的时候大家都会爬楼梯,但是每 ...

  4. Square roots

    Loops are often used in programs that compute numerical results by starting with an approximate answ ...

  5. 使用regasm注册.net com组件出现不是有效的.net程序集的解决办法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 在电脑上装有VS 2008和VS 2010.使用VS 2010编写了一个C# com组件:MyCom(基于.net f ...

  6. 基于Struts2+MySQL的多表出差明细表单

    下载地址:http://download.csdn.net/detail/qq_33599520/9790629 项目结构: UserAction package com.mstf.action; i ...

  7. windows下MySQL5.6以上版本,如何通过修改配置文件来修改数据库的最大连接数啊?

    并没有my.ini文件,只有一个my-default.ini文件,并且里面并没有max_connections windows下MySQL5.6以上版本,如何通过修改配置文件来修改数据库的最大连接数啊 ...

  8. C# HashSet<T> 简单使用

    一个简单的HashSet<T> 的例子,介绍其简单的方法,深入学习可参考微软:https://msdn.microsoft.com/en-us/library/bb359438(v=vs. ...

  9. 一般处理程序cookie和session+末尾的多选框,下拉框

    登录页面<body><form action="Login.ashx" method="post"><input type=&qu ...

  10. UVa 12661 Funny Car Racing【 dijkstra 】

    题意:给出n个点,m条路,每条路用5个整数表示u,v,a,b,t u表示这条路的起点,v表示终点,a表示打开时间,b表示关闭时间,t表示通过这条道路需要的时间 看的紫书,因为边权不再仅仅是路上的时间, ...