我可以优化此代码吗?

use*_*977 0 java csv optimization jdbc

我正在尝试从表中检索数据并将每行转换为CSV格式

s12,james,24,1232,Salaried

下面的代码完成了这项工作,但需要很长时间,行表超过1,00,000.

请告知优化技术:

 while(rset1.next()!=false) {
                         sr=sr+"\n";
                        for(int j=1;j<=rsMetaData.getColumnCount();j++)
                        {
                            if(j< 5)
                            {
                         sr=sr+rset1.getString(j).toString()+",";
                            }
                            else
                          sr=sr+rset1.getString(j).toString();
                        }

                       }
Run Code Online (Sandbox Code Playgroud)

/ SR

Ste*_*ker 15

两种方法,按优先顺序排列:

流输出

PrintWriter csvOut = ... // Construct a write from an outputstream, say to a file
while (rs.next())
    csvOut.println(...) // Write a single line
Run Code Online (Sandbox Code Playgroud)

(请注意,您应该确保缓存Writer/OutputStream,尽管默认情况下有很多)

使用StringBuilder

StringBuilder sb = new StringBuilder();
while (rs.next())
    sb.append(...) // Write a single line
Run Code Online (Sandbox Code Playgroud)

这里的想法是在循环中附加字符串是一个坏主意.想象一下,你有一个字符串.在Java中,字符串是不可变的.这意味着要附加到字符串,您必须复制整个字符串,然后将更多内容写入结尾.由于您一次添加一些内容,因此您将拥有许多字符串副本,这些副本并不是真正有用.

如果您正在写入文件,那么直接使用流或Writer进行编写是最有效的.否则,您可以使用StringBuilder,它可以更有效地将许多小字符串附加到一起.

  • @gregcase:如果你正在构建一个半gig的String对象,那么你真的应该尝试使用流式方法. (2认同)

tre*_*ace 5

我不是Java专家,但我认为在条件检查中使用像getColumnCount()这样的东西总是不好的做法.这是因为在每个循环之后,它运行该函数以查看列数是多少,而不是仅仅引用静态数字.相反,设置一个等于该数字的变量,并使用该变量与j进行比较.