Carlos Blanco
Carlos Blanco

Reputation: 8762

System.out to a file in java

I'm running an application from inside another one for testing purposes. I want to redirect the output for the tested app to a file, so I can have a log after each test.

Is there a way to redirect the output of an app to a file from the command line in java?

Upvotes: 61

Views: 107881

Answers (6)

nex
nex

Reputation: 685

Or you can use Class FileWriter.

Upvotes: -3

mdma
mdma

Reputation: 57707

You can use the output stream redirector that is supported by the Windows command line, *nix shells , e.g.

java -jar myjar.jar > output.txt

Alternatively, as you are running the app from inside the vm, you could redirect System.out from within java itself. You can use the method

System.setOut(PrintStream ps)

Which replaces the standard output stream, so all subsequent calls to System.out go to the stream you specify. You could do this before running your wrapped application, e.g. calling System.setOut(new PrintStream(new BufferedOutputStream(new FileOutputStream("output.txt"))));

If you are using a wrapper that you can't modify, then create your own wrapper. So you have FEST wrapper -> stream redirector wrapper -> tested app.

For example, you can implement a simple wrapper like this:

public class OutputRedirector
{
   /* args[0] - class to launch, args[1]/args[2] file to direct System.out/System.err to */
   public static void main(String[] args) throws Exception
   {  // error checking omitted for brevity
      System.setOut(outputFile(args(1));
      System.setErr(outputFile(args(2));
      Class app = Class.forName(args[0]);
      Method main = app.getDeclaredMethod("main", new Class[] { (new String[1]).getClass()});
      String[] appArgs = new String[args.length-3];
      System.arraycopy(args, 3, appArgs, 0, appArgs.length);
      main.invoke(null, appArgs);
   }
   protected PrintStream outputFile(String name) {
       return new PrintStream(new BufferedOutputStream(new FileOutputStream(name)), true);
   }
}

You invoke it with 3 additional params - the Main class to run, and the output/error directs.

Upvotes: 85

omkar sirra
omkar sirra

Reputation: 726

    File file = new File("xyz.txt");        
    PrintStream printStreamToFile = new PrintStream(file);
    System.setOut(printStreamToFile);
    System.out.println("Hello I am writing to File xyz.txt");

Upvotes: 1

psu
psu

Reputation: 541

When using this constructor:

new PrintStream(new BufferedOutputStream(new FileOutputStream("file.txt")));

remember to set autoflushing to true, i.e.:

new PrintStream(new BufferedOutputStream(new FileOutputStream("file.txt")), true);

otherwise you may get empty files even after your program finishes.

Upvotes: 54

Jagoliveira
Jagoliveira

Reputation: 515

In order to improve "vijay.shad" response I used the code bellow to direct the file to the Home Directory in Linux or MyDocuments in Windows.

    try {
        System.setOut(new PrintStream(new File(FileSystemView.getFileSystemView()
                .getDefaultDirectory().toString()
                + File.separator + "output-file.txt")));
    } catch (Exception e) {
         e.printStackTrace();
    }

Upvotes: 7

vijay.shad
vijay.shad

Reputation: 2474

Yes you can set your desired file like this.

try {
    System.setOut(new PrintStream(new File("output-file.txt")));
} catch (Exception e) {
     e.printStackTrace();
}

Upvotes: 30

Related Questions