Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #11190

Re: append() vs. write()

From Jeff Higgins <jeff@invalid.invalid>
Newsgroups comp.lang.java.programmer
Subject Re: append() vs. write()
Date 2012-01-10 16:48 -0500
Organization A noiseless patient Spider
Message-ID <jeib9l$shf$1@dont-email.me> (permalink)
References <3d2746a6-f57c-4fa1-b547-dfddc23bb6b6@n30g2000yqd.googlegroups.com>

Show all headers | View raw


On 01/10/2012 11:17 AM, Benjamin Trendelkamp-Schroer wrote:
> Hi,
>
> I want to write a method that can write possibly large matrices of
> floating point numbers in scientific notation to human readable ascii
> files. I want to be able to specify the formatting of the floating
> point numbers usins format strings like "%1.8e" or "%2.5f".
>
>  From what I take from the java doc. I can do something like
>
> i) java.io.File file = new java.io.File(pathnameOfMyFile);
>    java.io.FileWriter fileWriter = new java.io.FileWriter(file);
>    java.util.Formatter f = new java.util.Formatter(fileWriter);
>    for(int i ...){
>       for(int j ...){
>          f.format("%1.8e", Matrix.getEntry(i,j))
>          f.format("%s", columnSeparator)    //columnSeparator = "
> " (for example)
>       }
>       f.format("%s", rowSeparator) // rowSeparator="\n" (for example)
>    }
>
> ii) Use a buffered writer which is adviced as being good practice in
> all tutorials since it has a buffered write method. But as far as I
> understand Formatter does only use the format method of the Appendable
> interface and not the bufered write method. If my Matrix gets very
> large (say 10000 rows and columns) I would have to put each row in an
> appropriately formatted String o0r StringBuffer, calling the append
> method on the StringBuffer through the format method of Formatter many
> times and use write to output it to the buffered writer. But this
> string would be quite large + I would have to create that string and
> the Formatter for each new row (using for example
> StringBuffer.toString(), Formatter(StringBuffer)).
>
> I am asking because I am not sure what is the best practice hear. My
> favorite solution would be to have a method that I could just pass a
> Formatter to so that I could use that formatter object to call other
> methods doing the formatting on the level of single entries of my
> matrix without the need to create a lot of formatter objects. But on
> the other hand I would like to make writing out to files as fast as
> possible and do not want to suffer performance penalties from
> repeatedly calling an append() method where it would be advisable to
> make fewer calls to write with string containing more characters.
>
> I am quite new to Java so I would appreciate any help with that and
> ask you to excuse any obvious mistakes and style flaws that I have
> made.
I'll try again.

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Collection;


public class Scratch {

   public static void main(String[] args) throws IOException {

     Writer writer = new PrintWriter(
         new BufferedWriter(
             new FileWriter(args[0])));

     String tableHeader, tableFooter,
     rowHeader, rowFooter, columnSeparator;

     // not intended to compile

     Matrix matrix;
     MatrixRow row;

     writer.append(tableHeader);
     while (matrix.hasRows()) {
       row = matrix.nextRow();
       writer.append(rowHeader);
       while (row.hasNextCell()) {
         // java.io.Writer has an append method that takes a CharSequence
         writer.append(
             getCellFormatter(row.rowIndex, row.columnIndex)
             //DecimalFormat has a format method that returns a 
StringBuilder
             //StringBuilder implements CharSequence
             .format(row.nextCell().doubleValue(),null,null));
         writer.append(columnSeparator);
       }
       writer.append(rowFooter);
     }
     writer.append(tableFooter);
   }
}

/* probably in your Matrix class

DecimalFormat getCellFormatter(int rowIndex, int columnIndex) {
   DecimalFormat formatter =
       (DecimalFormat)DecimalFormat.getInstance();
   // apply a pattern depending upon row and column
   formatter.applyPattern("yourPattern");
   return formatter;
}
*/

Back to comp.lang.java.programmer | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

append() vs. write() Benjamin Trendelkamp-Schroer <benjamin.trendelkampschroer@googlemail.com> - 2012-01-10 08:17 -0800
  Re: append() vs. write() Jeff Higgins <jeff@invalid.invalid> - 2012-01-10 13:14 -0500
  Re: append() vs. write() markspace <-@.> - 2012-01-10 13:30 -0800
  Re: append() vs. write() Jeff Higgins <jeff@invalid.invalid> - 2012-01-10 16:48 -0500
    Re: append() vs. write() Jeff Higgins <jeff@invalid.invalid> - 2012-01-10 17:15 -0500
      Re: append() vs. write() Jeff Higgins <jeff@invalid.invalid> - 2012-01-10 18:35 -0500
        Re: append() vs. write() Jeff Higgins <jeff@invalid.invalid> - 2012-01-10 19:01 -0500
  Re: append() vs. write() Lew <noone@lewscanon.com> - 2012-01-10 18:06 -0800

csiph-web