1  import java.io.File;
  2  import java.io.FileNotFoundException;
  3  import java.io.PrintWriter;
  4  import java.util.Scanner;
  5  
  6  /**
  7     This program encrypts a file using the Caesar cipher.
  8  */
  9  public class CaesarCipher
 10  {  
 11     public static void main(String[] args) throws FileNotFoundException
 12     {  
 13        final int DEFAULT_KEY = 3;
 14        int key = DEFAULT_KEY;
 15        String inFile = "";
 16        String outFile = "";
 17        int files = 0; // Number of command line arguments that are files
 18  
 19        for (int i = 0; i < args.length; i++)
 20        {  
 21           String arg = args[i];
 22           if (arg.charAt(0) == '-')
 23           {  
 24              // It is a command line option
 25  
 26              char option = arg.charAt(1);
 27              if (option == 'd') { key = -key; }
 28              else { usage(); return; }
 29           }
 30           else
 31           {  
 32              // It is a file name
 33  
 34              files++;
 35              if (files == 1) { inFile = arg; }
 36              else if (files == 2) { outFile = arg; }
 37           }
 38        }
 39        if (files != 2) { usage(); return; }
 40  
 41        Scanner in = new Scanner(new File(inFile));
 42        in.useDelimiter(""); // Process individual characters
 43        PrintWriter out = new PrintWriter(outFile);
 44  
 45        while (in.hasNext())
 46        {
 47           char from = in.next().charAt(0);
 48           char to = encrypt(from, key);
 49           out.print(to);
 50        }
 51        in.close();
 52        out.close();               
 53     }   
 54  
 55     /**
 56        Encrypts upper- and lowercase characters by shifting them
 57        according to a key.
 58        @param ch the letter to be encrypted
 59        @param key the encryption key
 60        @return the encrypted letter      
 61     */
 62     public static char encrypt(char ch, int key)
 63     {
 64        int base = 0;
 65        if ('A' <= ch && ch <= 'Z') { base = 'A'; }
 66        else if ('a' <= ch && ch <= 'z') { base = 'a'; }
 67        else { return ch; } // Not a letter
 68        int offset = ch - base + key;
 69        final int LETTERS = 26; // Number of letters in the Roman alphabet
 70        if (offset > LETTERS) { offset = offset - LETTERS; }
 71        else if (offset < 0) { offset = offset + LETTERS; }
 72        return (char) (base + offset);
 73     }
 74  
 75     /**
 76        Prints a message describing proper usage.
 77     */
 78     public static void usage()
 79     {  
 80        System.out.println("Usage: java CaesarCipher [-d] infile outfile");
 81     }
 82  }