Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Homework Help: Weird File Output behavior in java

  1. Nov 16, 2011 #1
    1. The problem statement, all variables and given/known data
    I've implemented RSA and just need to print some stats and write to files.


    2. Relevant equations
    My solution works fine when I provide an input file, however, if I let it read from standard input there is no output written to either of my output files. Reading works regardless. I really have no idea what is going on here. I'm not really familiar with java IO so i figure I must be doing something wrong here.


    3. The attempt at a solution

    Code (Text):
    public static void main(String args[]) {
            String message = new String();
            String outFile = "out.txt"; // Default output file.
            // If no arguments are provided then standard input is used to collect input.
            if(args.length == 0) {
                System.out.println("No input file provided, using standard input: ");
                Scanner stdIn = new Scanner(System.in);
                message = stdIn.nextLine();
            }
            // If one or 2 arguments are provided the first is assumed to be an input text file.
            if(args.length == 1 || args.length == 2) {
                FileInputStream fin;       
                String line;
                try {
                    // Opening file
                    System.out.println("Opening file " + args[0] + " ...");
                    fin = new FileInputStream (args[0]);
                    BufferedReader reader = new BufferedReader(new InputStreamReader(fin));
                    line = reader.readLine();
                    System.out.println("Reading from file... ");
                    // Getting data from file
                    while(line != null) {
                        message += line;
                        line = reader.readLine();
                    }
                    // Closing file
                    fin.close();
                }
                // Unable to read file, using Standard Input instead.
                catch (IOException e) {
                    System.err.println ("Unable to read from file, \"" + args[0] + "\" , using standard input instead: ");
                    Scanner stdIn = new Scanner(System.in);
                    message = stdIn.nextLine();
                }
            }
            // The second parameter is assumed to be an output text file to store the cipherText output.
            if(args.length == 2) {
                outFile = args[1];
            }
            // Invalid usage, exiting.
            if(args.length > 2) {
                System.out.println("Too many arguments. Usage: RSA [inputFilename] [outputFilename]\nEnd.");
                return;
            }
            // Init RSA
            SecureRandom random = new SecureRandom();
            RSA test = new RSA(NBITS, NBITS, random);
            System.out.println("Checking if computed RSA values are secure...");
            // Check is RSA values are secure
            if(test.isSecure()) {
                System.out.println("RSA values are secure continuing with Encryption...");
                System.out.println("Encrypting " + message.length() + " bytes of data...");
                long startEncrypt = System.currentTimeMillis();
                // Encrypt message
                BigInteger[] out = test.encryptString(message);
                long endEncrypt = System.currentTimeMillis();
                System.out.println("Encryption completed in " + (endEncrypt - startEncrypt) + " ms.");
                //Write CipherText to file.
                try {
                    FileWriter fout;   
                    // Opening file
                    System.out.println("Opening file \"" + outFile + "\" ...");
                    fout = new FileWriter(outFile);
                    BufferedWriter writer = new BufferedWriter(fout);
                   
                    System.out.println("Writing ciphertext to file = \"" + outFile + "\".");
                    // Parsing through ciphertext blocks
                    for(int i = 0; i < out.length; i++) {
                        //System.out.println("Writing: " + out[i].toString());
                        writer.write(out[i].toString());
                    }
                    // Closing file
                    fout.close();  
                    System.out.println("Finished writing to \"" + outFile + "\".");
                }
                // Error opening output file
                catch (IOException e) {
                    System.err.println ("Unable to open file \"" + outFile  + "\"Ciphertext will not be written.");
                }
                System.out.println("Decrypting " + message.length() + " bytes of data...");
                long startDecrypt = System.currentTimeMillis();
                // Decrypt message
                String plainText = test.decryptString(out);
                long endDecrypt = System.currentTimeMillis();
                System.out.println("Decryption completed in " + (endDecrypt - startDecrypt) + " ms.");
                // Write plainText to file
                try {
                    FileWriter foutf;  
                    // Opening file
                    System.out.println("Opening file \"" + "plainTextOut.txt" + "\" to ensure encyption/decryption occured without error.");
                    foutf = new FileWriter("plainTextOut.txt");
                    BufferedWriter writer = new BufferedWriter(foutf);
                   
                    System.out.println("Writing plainText to file \"" + "plainTextOut.txt" + "\".");
                    // Write plaintext to file.
                    //System.out.println("Writing: " + plainText);
                    writer.write(plainText);
                    // Closing file
                    foutf.close(); 
                    System.out.println("Finished writing to \"" + "plainTextOut.txt" + "\".");
                }
                // Error opening output file
                catch (IOException e) {
                    System.err.println ("Unable to open file \"" + "plaintTextOut.txt."  + "\"Plaintext will not be written.");
                }
            }
            else
                System.out.println("RSA values are not secure, please try again.");
        }
     
    Probably worth noting that output to files only works on Eclipse. When I tried to run it on my schools linux server output doesn't work even if I provide it an input file..
     
    Last edited: Nov 16, 2011
  2. jcsd
  3. Nov 16, 2011 #2
    Nevermind. I resolved this issue. Apparently you need to call the BufferedWriter's flush() member. Strange that it was working in certain scenarios though.
     
Share this great discussion with others via Reddit, Google+, Twitter, or Facebook