Otimização de uma função java para gerar arquivo txt

Preciso de um auxílio em relação a essa função abaixo. A estrutura dela se encontra em um arquivo Funcoes.java.
Ela adiciona um espaçamento entre os dados no momento de gerar o arquivo txt, o arquivo txt gerado tem 28 mil linhas de produtos de uma base do Governo.

public static String AdicionaEspaco(String reg, String formato, int tamanho) {
  String result = reg.trim().replace(" ", "");
  String caractere = "";
  
  if (result.length() < tamanho) {
    while (result.length() < tamanho) {
      if (formato.equals("E")) {
        caractere = " ";
        result = caractere + result;
      } else if (formato.equals("D")) {
        caractere = " ";
        result = result + caractere;
      }
    }
  } else {
    result = result.substring(0, tamanho);
  }
  
  return result;
}

Logo abaixo é onde a função acima está sendo aplicada dentro da função que estrutura e gera o arquivo txt.

private void gerar() throws Exception {
  if (podeGerar()) {
    File fileTXT = new File(".\\arquivo\\LC_PHARMA_" + jcb_icms.getSelectedItem() + ".txt");
    fileTXT.delete();
    
    FileWriter arq = new FileWriter(fileTXT, true);
    PrintWriter gravarArq = new PrintWriter(fileTXT, "ISO-8859-1");
    
    listaProduto.clear();
    listaProduto = (ArrayList<Produto>) new ProdutoDAO().listaProdutoBarras("%%");
    
    String escreva;
    double preco_venda = 0;
    double preco_custo = 0;
    double aliq_icms = 0;
    
    ProdutoPrecoDAO precoDao = new ProdutoPrecoDAO();
    
    for (Produto p : listaProduto) {
      ProdutoPreco prodPreco = precoDao.getProdutoPreco(p, listaVersao.get(jcb_versao.getSelectedIndex() - 1));
      
      if (prodPreco.getId_produto() > 0) {
        if (p.getIcms_0().equals("Sim")) {
          preco_custo = prodPreco.getPrecocusto_0();
          preco_venda = prodPreco.getPrecovenda_0();
          aliq_icms = 0;
        } else if (jcb_icms.getSelectedItem().equals("12%")) {
          preco_custo = prodPreco.getPrecocusto_12();
          preco_venda = prodPreco.getPrecovenda_12();
          aliq_icms = 12;
        } else if (jcb_icms.getSelectedItem().equals("17%")) {
          preco_custo = prodPreco.getPrecocusto_17();
          preco_venda = prodPreco.getPrecovenda_17();
          aliq_icms = 17;
        } else if (jcb_icms.getSelectedItem().equals("17,5%")) {
          preco_custo = prodPreco.getPrecocusto_17_5();
          preco_venda = prodPreco.getPrecovenda_17_5();
          aliq_icms = 17.5;
        } else if (jcb_icms.getSelectedItem().equals("18%")) {
          preco_custo = prodPreco.getPrecocusto_18();
          preco_venda = prodPreco.getPrecovenda_18();
          aliq_icms = 18;
        } else if (jcb_icms.getSelectedItem().equals("19%")) {
          preco_custo = prodPreco.getPrecocusto_19();
          preco_venda = prodPreco.getPrecovenda_19();
          aliq_icms = 19;
        } else if (jcb_icms.getSelectedItem().equals("20%")) {
          preco_custo = prodPreco.getPrecocusto_20();
          preco_venda = prodPreco.getPrecovenda_20();
          aliq_icms = 20;
        } else if (jcb_icms.getSelectedItem().equals("21%")) {
          preco_custo = prodPreco.getPrecocusto_21();
          preco_venda = prodPreco.getPrecovenda_21();
          aliq_icms = 21;
        } else if (jcb_icms.getSelectedItem().equals("22%")) {
          preco_custo = prodPreco.getPrecocusto_22();
          preco_venda = prodPreco.getPrecovenda_22();
          aliq_icms = 22;
        } else if (jcb_icms.getSelectedItem().equals("17% (ALC)")) {
          preco_custo = prodPreco.getPrecocusto_17_alc();
          preco_venda = prodPreco.getPrecovenda_17_alc();
          aliq_icms = 17;
        } else if (jcb_icms.getSelectedItem().equals("17,5% (ALC)")) {
          preco_custo = prodPreco.getPrecocusto_17_5_alc();
          preco_venda = prodPreco.getPrecovenda_17_5_alc();
          aliq_icms = 17.5;
        } else if (jcb_icms.getSelectedItem().equals("18% (ALC)")) {
          preco_custo = prodPreco.getPrecocusto_18_alc();
          preco_venda = prodPreco.getPrecovenda_18_alc();
          aliq_icms = 18;
        }
        
        escreva = Funcoes.AdicionaEspaco("" + Funcoes.formatoInteiro4Digitos(listaVersao.get(jcb_versao.getSelectedIndex() - 1).getId()), "D", 6).toUpperCase()
          + Funcoes.AdicionaEspaco(listaVersao.get(jcb_versao.getSelectedIndex() - 1).getData_vigencia().replaceAll("\\D", ""), "D", 10).toUpperCase()
          + Funcoes.AdicionaEspaco(p.getCodigo_ggrem(), "D", 17).toUpperCase()
          + Funcoes.AdicionaEspaco(p.getRegistro(), "D", 15).toUpperCase()
          + Funcoes.AdicionaEspaco(p.getEan1(), "D", 16).toUpperCase()
          + Funcoes.AdicionaEspaco(p.getEan2(), "D", 16).toUpperCase()
          + Funcoes.AdicionaEspaco(p.getEan3(), "D", 16).toUpperCase()
          + Funcoes.AdicionaEspaco("" + p.getId(), "D", 13).toUpperCase()
          + Funcoes.AdicionaEspaco(p.getProduto(), "D", 200).toUpperCase()
          + Funcoes.AdicionaEspaco(p.getSubstancia(), "D", 600).toUpperCase()
          + Funcoes.AdicionaEspaco(p.getApresentacao(), "D", 200).toUpperCase()
          + Funcoes.AdicionaEspaco(p.getClasse_terapeutica(), "D", 200).toUpperCase()
          + Funcoes.AdicionaEspaco(p.getCategoria().getNome() == null ? "" : p.getCategoria().getNome(), "D", 50).toUpperCase()
          + Funcoes.AdicionaEspaco(p.getFabricante().getNome() == null ? "" : p.getFabricante().getNome(), "D", 120).toUpperCase()
          + Funcoes.AdicionaEspaco(p.getTarja(), "D", 100).toUpperCase()
          + Funcoes.AdicionaEspaco(p.getRegime_preco(), "D", 30).toUpperCase()
          + Funcoes.AdicionaEspaco(p.getLista(), "D", 30).toUpperCase()
          + Funcoes.AdicionaEspaco(p.getRestricao_hospitalar(), "D", 5).toUpperCase()
          + Funcoes.AdicionaEspaco(p.getIcms_0(), "D", 5).toUpperCase()
          + Funcoes.AdicionaEspaco("" + aliq_icms, "E", 12)
          + Funcoes.AdicionaEspaco("" + preco_custo, "E", 12)
          + Funcoes.AdicionaEspaco("" + preco_venda, "E", 12)
          + Funcoes.AdicionaEspaco(prodPreco.getAtualizar().equals("S") ? "Sim" : "Nao", "E", 4).toUpperCase();
        
        System.out.println(prodPreco.getId_produto());
        gravarArq.println(Funcoes.removeAcentos(escreva));
      }
    }

    gravarArq.flush();
    gravarArq.close();
    JOptionPane.showMessageDialog(null, "Arquivo gerado com sucesso!");
  }
}

O tempo de geração do arquivo está por volta de 25 a 35 minutos. E ele fica com 46MB quando gerado por completo. Preciso otimizar ou a função de gerar o arquivo ou a que adiciona o espaçamento. Alguém tem alguma idéia. Desde já muito grato!

Vc sabe qto tempo essa consulta demora para ser executada? Talvez ela pode estar sendo o gargalo desse processamento, pois ela é executada de acordo com a quantidade de produtos (O(n)), ou seja, se essa consulta demorar, por exemplo, 1 segundo, faça as contas de acordo com a quantidade de produtos e vc terá uma ideia do tempo de execução.

O uso de concatenação de strings dentro de loops é sempre desaconselhado, porque normalmente é uma operação custosa em termos de performance. Sugiro usar StringBuilder em vez de String.
Ou, em vez de reinventar a roda, usar libs já existentes, como por exemplo StringUtils. Parece-me que o que pretendes é mais ou menos isto:

public static String AdicionaEspaco(String reg, String formato, int tamanho) {
    String result = StringUtils.trim(reg);
    if (formato.equals("E")) {
         return StringUtils.left(StringUtils.leftPad(result, tamanho), tamanho);
    } else  if (formato.equals("D")) {
         return StringUtils.left(StringUtils.rightPad(result, tamanho), tamanho);
    } else {
         return result;
   }

}

Ou então podes nem usar método auxiliar e usar o format da String (apenas um pequeno exemplo:

   escreva = String.format("%-6s%-10s%-17s%-15s...%12d%4s", 
        Funcoes.formatoInteiro4Digitos(listaVersao.get(jcb_versao.getSelectedIndex() - 1).getId()), 
        listaVersao.get(jcb_versao.getSelectedIndex() - 1).getData_vigencia().replaceAll("\\D", ""), 
        p.getCodigo_ggrem(), 
        p.getRegistro(), 
        preco_vend, 
        prodPreco.getAtualizar().equals("S") ? "Sim" : "Nao");
1 curtida