]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - basic/runtime/org.argeo.basic.nodeps/src/main/java/org/argeo/util/CsvWriter.java
Update license headers
[lgpl/argeo-commons.git] / basic / runtime / org.argeo.basic.nodeps / src / main / java / org / argeo / util / CsvWriter.java
index 85356e4fed07c4f24e9f980698a983c85d1a17d9..b3f383883970a09ebee6feb624ae6f60cc4f216a 100644 (file)
@@ -1,8 +1,25 @@
+/*
+ * Copyright (C) 2007-2012 Mathieu Baudier
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package org.argeo.util;
 
 import java.io.IOException;
 import java.io.OutputStream;
-import java.io.PrintWriter;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
 import java.util.Iterator;
 import java.util.List;
 
@@ -10,21 +27,33 @@ import org.argeo.ArgeoException;
 
 /** Write in CSV format. */
 public class CsvWriter {
-       private final PrintWriter out;
+       private final Writer out;
 
        private char separator = ',';
        private char quote = '\"';
 
        /**
-        * Creates a CSV writer. The header will be written immediately to the
-        * stream.
+        * Creates a CSV writer.
         * 
         * @param out
         *            the stream to write to. Caller is responsible for closing it.
         */
        public CsvWriter(OutputStream out) {
-               super();
-               this.out = new PrintWriter(out);
+               this.out = new OutputStreamWriter(out);
+       }
+
+       /**
+        * Creates a CSV writer.
+        * 
+        * @param out
+        *            the stream to write to. Caller is responsible for closing it.
+        */
+       public CsvWriter(OutputStream out, String encoding) {
+               try {
+                       this.out = new OutputStreamWriter(out, encoding);
+               } catch (UnsupportedEncodingException e) {
+                       throw new ArgeoException("Cannot initialize CSV writer", e);
+               }
        }
 
        /**
@@ -38,9 +67,9 @@ public class CsvWriter {
                        while (it.hasNext()) {
                                writeToken(it.next().toString());
                                if (it.hasNext())
-                                       out.print(separator);
+                                       out.write(separator);
                        }
-                       out.print('\n');
+                       out.write('\n');
                        out.flush();
                } catch (IOException e) {
                        throw new ArgeoException("Could not write " + tokens, e);
@@ -55,11 +84,16 @@ public class CsvWriter {
        public void writeLine(Object[] tokens) {
                try {
                        for (int i = 0; i < tokens.length; i++) {
-                               writeToken(tokens[i].toString());
+                               if (tokens[i] == null) {
+                                       // TODO configure how to deal with null
+                                       writeToken("");
+                               } else {
+                                       writeToken(tokens[i].toString());
+                               }
                                if (i != (tokens.length - 1))
-                                       out.print(separator);
+                                       out.write(separator);
                        }
-                       out.print('\n');
+                       out.write('\n');
                        out.flush();
                } catch (IOException e) {
                        throw new ArgeoException("Could not write " + tokens, e);
@@ -70,6 +104,7 @@ public class CsvWriter {
                // +2 for possible quotes, another +2 assuming there would be an already
                // quoted string where quotes needs to be duplicated
                // another +2 for safety
+               // we don't want to increase buffer size while writing
                StringBuffer buf = new StringBuffer(token.length() + 6);
                char[] arr = token.toCharArray();
                boolean shouldQuote = false;
@@ -92,10 +127,10 @@ public class CsvWriter {
                }
 
                if (shouldQuote == true)
-                       out.print(quote);
-               out.print(buf.toString());
+                       out.write(quote);
+               out.write(buf.toString());
                if (shouldQuote == true)
-                       out.print(quote);
+                       out.write(quote);
        }
 
        public void setSeparator(char separator) {