Ayudaaaaaa

Iniciado por supersergio88, 27 Mayo 2011, 09:57 AM

0 Miembros y 1 Visitante están viendo este tema.

supersergio88

Hola, estoy haciendo una aplicacion en java de intercambio de ficheros y con un menu, con varias clases.Pero me salta un error : (Is a directory)
  at java.io.FileOutputStream.open(Native Method)
  at java.io.FileOutputStream.<init>(FileOutputStream.java:209)
  at java.io.FileOutputStream.<init>(FileOutputStream.java:99)

no entiendo porque les dejo aqui mi codigo a ver si me pueden ayudar please

clase Cliente:
Código (java) [Seleccionar]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;


public class Cliente {
  private static Socket socket;
  public static void main(String[] args) throws IOException, ClassNotFoundException {
       if(args.length != 2){
           System.out.println("Debe especificar el host y el puerto del servidor");
           System.exit(-1);
       }
       String hostServidor = args[0];
       int puertoServidor = Integer.parseInt(args[1]);
             
       try{
           socket = new Socket(hostServidor, puertoServidor);
           System.out.println("El cliente se ha conectado con exito al servidor " + hostServidor + ":" + puertoServidor);
       }catch(IOException e){
           e.printStackTrace();
       }
     
  }
     
  //el inputstreamreader coge un chorro de bytes y lo transforma a characteres
         InputStreamReader isr = new InputStreamReader(System.in);
  //el bufferedReder pasa de los characteres a lineas,tiene metodos readline() que lee lineas por ejemplo
          BufferedReader in = new BufferedReader(isr);
  // lo mismo es que si hiciera: BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
                 
    public void menuPrincipal(Socket sock) throws IOException, ClassNotFoundException{
             boolean repetir;
               char op = 0;
                repetir=true;
               while(repetir){
  //si quisiera (pero es ilogico ya que el metodo que voy a llamar esta en la misma clase),
  //me podria crear un objeto MenuPersona menuPersona = new MenuPersona(); fuera del metodo
  //para que no me lo pise, y luego llamarlo en lugar de Menu(); llamar a MenuPersona.Menu()
                    Menup();
                   op = in.readLine().charAt(0);
                   switch(op){
        case '1' :
              System.out.println("--Monstramos lista el directorio local del cliente--");
             
                       repetir=true;
                    break;
                   
        case '2':
                System.out.println("--Monstramos lista el directorio remoto del servidor--");
                      VerFicheros vf = new VerFicheros();
                      vf.VerFichero();
                     repetir=true;
                   break;
                 
        case '3':
             System.out.println("--envíamos un fichero especificado(del directorio local al remoto)--");
                EnviarFichero ef = new EnviarFichero();
                ef.EscribirFichero(sock);
                ef.EnvioFicherosAServidor(socket);
               
               
               repetir=true;
             break;
           
        case '4':
             System.out.println("--recibe un fichero especificado(del riectorio remoto al local)--");

               repetir=true;
             break;
       


         
        case '5':
              System.out.println("salir cerrando la conexión con el servidor y terminando el proceso cliente");
                 repetir = false;
              System.out.println("Adios");
            return;
                   }
          }
         
             }

   
private static void Menup() {
  System.out.println("||================================== MENU PRINCIPAL ==================================||");
  System.out.println("|| ---------------------- ¡¡¡¡Hola!!! Elige una opcion por favor ---------------------||");
  System.out.println("|| ----------------------                                       --------------------- ||");
  System.out.println("||  1.- 'lc': lista el directorio local del cliente                                   ||");
  System.out.println("||  2.- 'lr': lista el directorio remoto del servidor                                 ||");
  System.out.println("||  3.-'s': envía un fichero especificado(del directorio local al remoto)             ||");
  System.out.println("||  4.-'r': recibe un fichero especificado(del riectorio remoto al local)             ||" );
  System.out.println("||  5.-'q': salir cerrando la conexión con el servidor y terminando el proceso cliente||");
  System.out.println("||====================================================================================||");
  System.out.println("||====================================================================================||");  
        }

}


Clase Servidor:

Código (java) [Seleccionar]

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Servidor{
private final static int puerto = 0;


public  static void main(String[] args){
   try{
       ServerSocket serverSocket = new ServerSocket(puerto);
       System.out.println("El Servidor se ata al puerto " + serverSocket.getLocalPort());
       while(true){
           Socket conn = serverSocket.accept();
           Procesador p = new Procesador(conn);
           p.start();
       }

   } catch(IOException e){
       e.printStackTrace();
   }
}

}


Clase Procesador(para los hilos):

Código (java) [Seleccionar]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;

public class Procesador extends Thread{

   private static Socket conn;
 
   public Procesador(Socket conn){
       this.conn = conn;
   }

   public synchronized void run(){
          System.out.println("La direccion IP del cliente es: " + conn.getLocalAddress() + " y su puerto es " + conn.getPort());

           Cliente cliente = new Cliente();
           try {
              cliente.menuPrincipal(conn);
           } catch (IOException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
           } catch (ClassNotFoundException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
           }

}
}



Clase VerFicheros(para ver listado de ficheros):


Código (java) [Seleccionar]

import java.io.File;

public class VerFicheros {

  //
  public void VerFichero() {

/**Lo primero que haremos será obtener una referencia al directorio que queremos listar.
*Utilizaremos, en este caso, la clase File para almacenar la referencia.*/
     File dir = new File("c:\\");
     
/**Uno de los métodos de la clase File es .list().
* Mediante este método recuperaremos los ficheros que componen el directorio especificado.
*  Lo que nos devuelve es un array de cadenas.*/        
     String[] ficheros = dir.list();
       
       
     if (ficheros == null)
        System.out.println("No hay ficheros en el directorio especificado");
     else {
        for (int x=0;x<ficheros.length;x++){
           System.out.println(ficheros);

        }
     }

  }

}


Clase EnviarFicheros(la uso para enviar):

Código (java) [Seleccionar]

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;


public class EnviarFichero {
  public void EnvioFicherosAServidor(Socket sock){

      try{
         Scanner s=new Scanner(System.in);
         System.out.println("Ingrese el path del archivo a enviar: " );
         String path=s.nextLine();
      PrintStream envio=new PrintStream(sock.getOutputStream());
      //String path = "C:\\hola.txt";
      System.out.println(path);
      FileInputStream origen=new FileInputStream(path);
      byte[] buffer = new byte[1024];
      int len;
      while((len=origen.read(buffer))>0){
      envio.write(buffer,0,len);
      }
      }catch(IOException e){
      e.printStackTrace();
      }
     
}
 
  public void EscribirFichero(Socket socket) throws IOException{
     try{
        Scanner s=new Scanner(System.in);
        System.out.println("Ingrese el path donde desea escribir el archivo: " );
        String path=s.nextLine();
        InputStream llegada = socket.getInputStream();
        //String path = "C:\\Java";
         System.out.println(path);
        FileOutputStream destino=new FileOutputStream(path);
        byte[] buffer = new byte[1024];
        int len;
        while((len=llegada.read(buffer))>0){
        destino.write(buffer,0,len);
        }
        }catch(IOException e){
           e.printStackTrace();
           }
  }
  }



Pongo entre \\ como pongo yo el path si esta mal como lo pongo corregirme porfavor, les agradezco que testen mi codigo y si le salta algun error de que meten mal el directorio al darle a la opcion de enviar, la opcion 3

barbieturico

En realidad no probé el código, pero por el path que pones supongo que estás programando en Windows, si es así, la forma que tienes de poner las "barras" (\\) es correcta. Es decir path="C:\\fichero.txt"
¿Cuando descomentas las líneas en las que pones el path a pelo tampoco te funciona?

Por el error que te tira parece que estuvieras intentando seleccionar un directorio en lugar de un fichero en alguna parte del código. Para mí que esa traza que tenías del path es lo que más te puede ayudar.