Hola, el error que me ha saltado al ejecutar es: java.lang.ArrayIndexOutOfBoundsException: 0 at Vigenere.main(Vigenere.java:280)
Eso corresponde a esta parte del código:
switch(op){
case 1:
System.out.println("Introduzca el nombre del archico que contenga el mensaje a cifrar: ");
try{
lector= new BufferedReader(new FileReader (args[0]));
escritor= new PrintWriter(new FileWriter (args[1]));
Lo que me extraña aquí es lo siguiente: args[0] y args[1] son parámetros que se le pasan al método main a la hora de invocar la ejecución del programa, es decir, que cuando el programa empieza a ejecutarse ya existen esos datos.
Sin embargo tú estás indicando "Introduzca el nombre del archico que contenga el mensaje a cifrar: "
Si el nombre de archivo lo quieres pasar como parámetro de ejecución del programa no tendrías que pedirlo después, o si lo quieres pedir para que se introduzca por teclado no tendría sentido usar args[0] ni args[1]
Si quieres que se introduzca por teclado el nombre de archivo, tienes que tener en cuenta que si el usuario introduce "datos.txt", ese archivo deberá estar en la misma carpeta donde tienes el código del programa. Si no es así tendrías que poner la ruta completa, por ejemplo C:/Users/Jose/Desktop/datos.txt
Para que sea el usuario quien introduzca el nombre del archivo puedes usar la clase Scanner, aquí tienes un ejemplo de cómo se usa:
http://aprenderaprogramar.com/index.php?option=com_content&view=article&id=627:pensar-en-objetos-una-entrada-de-teclado-o-consola-en-java-como-objeto-con-campos-y-metodos-cu00661b&catid=68:curso-aprender-programacion-java-desde-cero&Itemid=188Aunque antes de introducir eso yo haría una prueba sencilla: usa un código del tipo FileReader fr = new FileReader("datos.txt"); para crear el FileReader y lo mismo para el FileWriter, prueba el programa así, y si te funciona todo bien luego introduce la entrada de la ruta del fichero a través del teclado.
Saludos