【问题标题】:To write the value from resultset to text file (.txt file)将结果集中的值写入文本文件(.txt 文件)
【发布时间】:2015-09-20 20:22:58
【问题描述】:

请帮助我处理下面的代码,因为我想将结果集中的值写入 txt 文件

代码

while (rs.next()){
    FileWriter fstream = new FileWriter(file);
    BufferedWriter out = new BufferedWriter(fstream);

    out.write(Integer.toString(rs.getInt("SBL_PRODUCT_ID")) + ", ");
    out.write(Integer.toString(rs.getInt("SBL_TARIFF_ID")) + ", ");
    out.write(rs.getString("PRODUCT_DESCRIPTION") + ", ");
    out.write(rs.getString("SERVICE_TYPE") + ", ");
    out.write(Integer.toString(rs.getInt("MARKET_CLASS")) + ", ");
    out.write(rs.getString("ENTITY_TYPE") + ", ");
    out.newLine();
    /*out.write(System.getProperty("line.separator"));*/

    System.out.println("Completed writing into text file");
    out.close();
}

txt 文件中的必需输出

4087, 98, POSTE SIM, Deal [SoHo Flat Tariff Recurring Charge, Prepaid], /service/telco/SIM, 101, DEAL

4087, 99, POSTE SIM, Deal [SoHo Flat Tariff Recurring Charge, Prepaid], /service/telco/SIM, 101, DEAL

4087, 100, POSTE SIM, Deal [SoHo Flat Tariff Recurring Charge, Prepaid], /service/telco/SIM, 101, DEAL

4087, 101, POSTE SIM, Deal [SoHo Flat Tariff Recurring Charge, Prepaid], /service/telco/SIM, 101, DEAL

我得到的当前输出只是结果集中的最后一个值,即下面的一行

电流输出

4087, 101, POSTE SIM, Deal [SoHo Flat Tariff Recurring Charge, Prepaid], /service/telco/SIM, 101, DEAL

请帮我解决这个问题:(

【问题讨论】:

  • 写完所有内容后打开文件,然后关闭一次
  • 我没听懂你能不能请你提供一个sn-p
  • 您正在打开文件,写入和关闭ResultSet 的每次迭代(对于ResultSet 中的每一行),您不仅没有附加到文件,这是一个很多不必要的开销

标签: java text-files multiple-resultsets


【解决方案1】:

来自 GitHub:https://github.com/OhadR/ohadr.common/blob/master/src/main/java/com/ohadr/common/utils/resultset/ResultSetConverters.java

public static void writeResultSetToWriter(ResultSet resultSet, PrintWriter writer) throws SQLException
{
ResultSetMetaData metadata = resultSet.getMetaData();
int numColumns = metadata.getColumnCount();
int numRows = 0;

while(resultSet.next())             //iterate rows
{
    ++numRows;
    JSONObject obj = new JSONObject();      //extends HashMap
    for (int i = 1; i <= numColumns; ++i)           //iterate columns
    {
        String column_name = metadata.getColumnName(i);
        obj.put(column_name, resultSet.getObject(column_name));
    }
    writer.println(obj.toJSONString());

    if(numRows % 1000 == 0)
        writer.flush();
}

}

【讨论】:

    【解决方案2】:

    每次创建文件写入器时,都会覆盖文件。将其更改为:

    FileWriter fstream = new FileWriter(file);
    BufferedWriter out = new BufferedWriter(fstream);
    while (rs.next()) {            
            out.write(Integer.toString(rs.getInt("SBL_PRODUCT_ID")) + ", ");
            out.write(Integer.toString(rs.getInt("SBL_TARIFF_ID")) + ", ");
            out.write(rs.getString("PRODUCT_DESCRIPTION") + ", ");
            out.write(rs.getString("SERVICE_TYPE") + ", ");
            out.write(Integer.toString(rs.getInt("MARKET_CLASS")) + ", ");
            out.write(rs.getString("ENTITY_TYPE") + ", ");
            out.newLine();
            /*out.write(System.getProperty("line.separator"));*/
    }
    System.out.println("Completed writing into text file");
    out.close();
    

    或者,您可以在 FileWriter 中设置 append 标志:

    FileWriter fstream = new FileWriter(file, true);
    

    虽然这不如只打开一次文件那么有效。

    【讨论】:

    • 没错。正要提出同样的建议。另一种更好的编码方式是@MadProgrammer 建议的使用Java 7 特性try-with-resources
    【解决方案3】:

    打开文件一次,将内容写入其中,然后在所有内容写入后关闭,例如

    try (BufferedWriter out = new BufferedWriter(new FileWriter(file))) {
        while (rs.next()) {
            out.write(Integer.toString(rs.getInt("SBL_PRODUCT_ID")) + ", ");
            out.write(Integer.toString(rs.getInt("SBL_TARIFF_ID")) + ", ");
            out.write(rs.getString("PRODUCT_DESCRIPTION") + ", ");
            out.write(rs.getString("SERVICE_TYPE") + ", ");
            out.write(Integer.toString(rs.getInt("MARKET_CLASS")) + ", ");
            out.write(rs.getString("ENTITY_TYPE") + ", ");
            out.newLine();
        }
        System.out.println("Completed writing into text file");
    }
    

    查看The try-with-resources Statement了解更多详情

    【讨论】:

    • 非常感谢 :) :)
    • 很高兴能帮上忙 ;)
    猜你喜欢
    • 2016-09-07
    • 2016-06-08
    • 1970-01-01
    • 2016-01-08
    • 2013-09-24
    • 2021-10-23
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    相关资源
    最近更新 更多