【问题标题】:How to split the large size .txt file data into small portion and insert into database?如何将大尺寸的.txt文件数据分成小部分并插入数据库?
【发布时间】:2014-02-22 14:14:28
【问题描述】:

以下是我读取和拆分文本文件内容的代码。

  try {

        br = new BufferedReader(new FileReader("F:\\Test.txt"));
        final char[] cbuf = new char[2048];
        final int length = br.read(cbuf);

        cbuf[length] = '@';
        String packet = new String(cbuf, 0, length + 1);
        final String[] splitedPacket=packet.split("@");
        for(int i=0;i<splitedPacket.length;i++)
        {
            if(splitedPacket[i].contains("POS"))
            {
                System.out.println(splitedPacket[i]+"@");
                preparedstatement=connection.prepareStatement("insert into inserttextfile([file]) values(?)");
                preparedstatement.setString(1, splitedPacket[i]+"@");
                preparedstatement.executeUpdate();
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (br != null)br.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

它在我的小尺寸 .txt 文件中运行良好,但如果我使用超过 30 MB 的文本文件,我会得到数组索引超出范围的异常。

那么如何拆分和读取这种.txt文件并插入到数据库中呢? (特别期望拆分大文件(例如 5 MB 从 30 MB)并插入数据库) 请在这个问题上指导我。

【问题讨论】:

  • 1.您没有读取整个文件读取规范docs.oracle.com/javase/7/docs/api/java/io/…。不要尝试一次读取所有文件内容。循环读取并插入数据库。使用 Scanner 根据分隔符读取。
  • 记事本文件?你的意思是文本文件?
  • @m0skit0 是 .txt 文件。
  • 你在这里有个好的开始。

标签: java


【解决方案1】:

你不使用 readLine 是很难做到的

    try {
        FileInputStream fis = new FileInputStream("F:\\Test.txt");
        reader = new BufferedReader(new InputStreamReader(fis));          
        String line = reader.readLine();
        while(line != null){

            //process your line here, it's just a String...   

            line = reader.readLine();
        }           

    } catch (FileNotFoundException ex) {
        ...
    } catch (IOException ex) {

【讨论】:

  • 它运作良好。使用它我们可以读取到多少大小。
  • 您可以通过您的 jvm 设置读取很多内容,至少可能 100 兆字节。如果内存不足,请查看如何增加 JVM 内存大小。
【解决方案2】:
 try (Scanner read = new Scanner(new File("/tmp/datafile.txt"));) {
        read.useDelimiter("@");
        while (read.hasNext()) {
            String splitedPacket = read.next();
            System.out.println(splitedPacket);
            // Perform DB Operation
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
  1. 不要读取整个文件。
  2. 在任何给定时间使用扫描仪读取并仅保留一次读取 - 以避免 OOM
  3. 如果可能,将 Db 操作作为批量执行。 如果您在一个事务中运行,请读取 1000 条记录并作为单独的批量插入处理。

【讨论】:

  • 不是问题。我很高兴您的问题得到解决。始终阅读规范。它有很多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-20
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多