Como guardar productos nuevos introducidos desde teclado? java

Iniciado por ibai92, 26 Enero 2018, 12:35 PM

0 Miembros y 2 Visitantes están viendo este tema.

ibai92

Buenas estoy empezando con java y tengo que resolver un problema. Pero es el primero que me han puesto y es demasiado dificil para ser la primera vez. Les voy a dejar el problema en cuestion, y el codigo que he llegado a escribir.
La duda que querria que me resolvieran es como hago para que al introducir datos desde el teclado, estos se guarden en determinados atributos. Cuando vean el enunciado lo entenderan.

A por cierto, agradeceria que si no saben como ayudarme al menos me pasaran algun enlace, o dijeran pues mira no lo se. No esta bien preguntar algo y que no te respondan cuando tienes prisa por seguir estudiando otras cosas.


Crea una aplicación en Java que permita almacenar la información de los productos de una empresa. La información que se desea almacenar de cada producto es: el código (entero), la descripción (texto) y el peso (valor real con parte decimal).
El programa ofrecerá cinco opciones: 1. Introducir los productos; 2. Visualizarlos en pantalla; 3. Guardar archivo de texto; 4. Leer archivo; y 5. Salir.

Realiza las siguientes acciones:

1. Crea la clase producto con las propiedades y el constructor que permita inicializar con todos los campos.

2. Crea un método o función que visualice el menú.

3. Crea un método o función por cada opción del menú (introducirProds(), visualizaProds(), guardaProds(), leeProds()).

4. Crea el programa principal que use los métodos anteriores.

El archivo de texto tendrá el siguiente formato:

Debes tener en cuenta los siguientes aspectos:

Supón que se dispone de los siguientes métodos (es decir, se pueden usar aunque no se implementen):

inputInt() // Devuelve un entero introducido por teclado Ej a =inputInt();

inputFloat() // Devuelve un float introducido por teclado Ej b =inputInt();

inputString() // Devuelve un String introducido por teclado Ej str =inputString();

output/outptln(String txt) // Equivalente a System.out.print/println()

Se ofrece la siguiente información para almacenar / leer el fichero:   //Yo use Scanner, al menos para el menu

BufferedWriter bw = new BufferedWriter(new FileWriter(nombreFichero, true));

PrintWriter pw = new PrintWriter(bw);

BufferedReader bw = new BufferedReader(new FileReader(nombreFichero, true));

PrintWriter pw = new PrintWriter(bw);

Para almacenar la información de los productos en memoria, se puede utilizar un array o un ListArray..

Lo que llevo hecho hasta ahora:

import java.util.Scanner;
/**
*
* @author ibai
*/
public class Main {
   static int num;        
   static Scanner sc = new Scanner(System.in);
   
   
   public static void main(String [] args) {
       
           do{                  
               System.out.println("\n1-Introducir nuevo producto.\n2-Visualizar productos.\n3-Guardar archivo de texto."
+ "\n4-Leer archivo.\n5-Salir");
               num= sc.nextInt();
           }while(num < 0 || num > 5);
           
           do{
               switch(num){
                   case 1:                        
                       System.out.println("Ingrese el nombre y el peso del nuevo producto");                            
                       
                       do{
                     
                           
                       }while(num<0 || num>5);
                   break;
               
                   case 2:
                       System.out.println("Estos son los productos existentes");
                       
                       do{
                           
                       }while(num<0 || num>5);
                   break;

                   case 3:
                       System.out.println("Guardando productos desde archivo externo");
                       
                       do{
                           
                       }while(num<0 || num>5);
                   break;

                   case 4:
                       System.out.println("Visualizando productos desde archivo externo");
                       
                       do{
                           
                       }while(num<0 || num>5);
                   break;

                   
               }

           }while(num != 5);      
   }    
}

-----------------------------------------------------------------------Producto

public class Producto extends Main{
   private int codigo=numProds;
   private static int numProds;
   Producto(){
       numProds++;
   }
       
   private String descripcion;
       public String getDescripcion(String desc) {
       return descripcion=desc;
   }
       public void setDescripcion(String desc) {
       this.descripcion = desc;
   }
       
   private float peso;
   public float getPeso(float peso) {
       return peso;
   }
   public void setPeso(float peso) {
       this.peso = peso;
   }
       
}

rub'n

Hola homie,

Resolviste con la misma clase Scanner puedes leer y escribir ficheros, guardar leer

tengo un ejemplo que te va a servir.

Para la próxima cuando quieras introducir código aquí usa Código GeSHi y escoge en este  caso java


rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

ibai92

Valee muchas gracias Rub'n ,  no sabia la manera de poner el codigo sorry.

Entiendo seguire estudiando el Scanner, muchas gracias

El caso es que pretenden que haga el ejercicio sin haber dado muchas cosas de java,como Scanner. Pero me da igual voy a estudiar java y cuando tenga todos los conceptos lo hare como mejor crea.
Vuelvo a poner el codigo con el GeSHi, para verlo yo al menos
Saludos.

Código (java) [Seleccionar]
import java.util.Scanner;
/**
*
* @author ibai
*/
public class Main {
    static int num;       
    static Scanner sc = new Scanner(System.in);
   
   
    public static void main(String [] args) {
       
            do{                 
                System.out.println("\n1-Introducir nuevo producto.\n2-Visualizar productos.\n3-Guardar archivo de texto."
+ "\n4-Leer archivo.\n5-Salir");
                num= sc.nextInt();
            }while(num < 0 || num > 5);
           
            do{
                switch(num){
                    case 1:                       
                        System.out.println("Ingrese el nombre y el peso del nuevo producto");                           
                       
                        do{
                       
                           
                        }while(num<0 || num>5);
                    break;
               
                    case 2:
                        System.out.println("Estos son los productos existentes");
                       
                        do{
                           
                        }while(num<0 || num>5);
                    break;

                    case 3:
                        System.out.println("Guardando productos desde archivo externo");
                       
                        do{
                           
                        }while(num<0 || num>5);
                    break;

                    case 4:
                        System.out.println("Visualizando productos desde archivo externo");
                       
                        do{
                           
                        }while(num<0 || num>5);
                    break;

                   
                }

            }while(num != 5);       
    }   
}


Código (java) [Seleccionar]
public class Producto extends Main{
    private int codigo=numProds;
    private static int numProds;
    Producto(){
        numProds++;
    }
       
    private String descripcion;
        public String getDescripcion(String desc) {
        return descripcion=desc;
    }
        public void setDescripcion(String desc) {
        this.descripcion = desc;
    }
       
    private float peso;
    public float getPeso(float peso) {
        return peso;
    }
    public void setPeso(float peso) {
        this.peso = peso;
    }
       
}

rub'n

#3
Hola homie que talco? bueno si por lo menos veo tu interés, el primer post era el que tenias que actualizar  ;D pero buee  :rolleyes:

mira esto


Código (java) [Seleccionar]

package util;
public interface ShowData {

   static <T> void print(final T s)   {System.out.print(s);}
   static <T> void println(final T s) {System.out.println(s);}
   static <T> void err(final T s)     {System.err.println(s);}
   static <T> void printf(final String format,final T ...s) {
       System.out.printf(format,s);
   }
   }
   default void mostrar(String s) {
       System.out.println(s);
   }
}


Aquí un ejemplo con la interface java.nio.file.Path, es el entry point para trabajar con la Api NIO.2, Un objeto Path representa una ruta jerárquica en el sistema de almacenamiento a un archivo o directorio.


Código (java) [Seleccionar]

package testing;

import util.ShowData;
import javax.swing.*;
import java.io.IOException;
import java.nio.file.*;
import java.util.Scanner;

//La clase Files, no confundir con File de java.io se usa para obtener información sobre archivos y directorios
public class InfoArchivoDirectorio {

   private static final Scanner LEER = new Scanner(System.in);

   public InfoArchivoDirectorio() throws IOException {
       init();
   }
  private void init() throws IOException {
       ShowData.print("Introduce un nombre de directorio o archivo: ");
       String s = LEER.next();

       //create a PathObject
       Path path = Paths.get(s); //Clase Factoria Paths para obtener una referencia a un archivo o directorio

       if(Files.exists(path)) { //si la ruta existe, mostrar salida acerca de ella
           final StringBuilder sb = new StringBuilder();
           sb.append(path.getFileName()).append(" Existe\n");
           sb.append(Files.isDirectory(path) ? "Es un directorio": "No es un directorio" ).append("\n");
           sb.append(path.isAbsolute() ? "Es una ruta absoluta":"NO es una ruta absoluta").append("\n");

           //LinkOption.NOFOLLOW_LINKS para ignorar enlaces simbolicos
           //Files.getLastModifiedTime(path,LinkOption.NOFOLLOW_LINKS);
           sb.append("Ultima modificación: ").append(Files.getLastModifiedTime(path,LinkOption.NOFOLLOW_LINKS)).append("\n");
           sb.append("Tamaño: ").append(Files.size(path)).append(" bytes\n");
           sb.append("Obtener ruta absoluta: ").append(path.toAbsolutePath()).append("\n");
           ShowData.println(sb.toString());

           if(Files.isDirectory(path)) { // listando la salida del directorio
               ShowData.println("Directory contents: ");
               //objeto para iterar a través de contenidos de los directorios
               DirectoryStream<Path> ds = Files.newDirectoryStream(path);
               ds.forEach(ShowData::println);
           }
       } else {
           JOptionPane.showMessageDialog(null,"No existe "+path);
       }
   }
   public static void main(String ...PoC) throws IOException {
       new InfoArchivoDirectorio();
   }
}





Esto es lectura de un archivo de acceso secuencial(En tu caso), existe también de acceso directo o Aleatorio

Código (java) [Seleccionar]

package testing;

import testing.Producto;
import util.ShowData;
import javax.swing.*;
import java.io.FileNotFoundException;
import java.util.Formatter;
import java.util.FormatterClosedException;
import java.util.NoSuchElementException;
import java.util.Scanner;

/*
Archivo de acceso secuencial
*/
public class CreateTextFile {

  private static Scanner leer;
   private static Formatter output; // salida al text del archivo, con formato
   private Producto producto = new Producto();

   public CreateTextFile(final Scanner scanner) {
       this.leer = scanner;
       abrirArchivo();
       agregarItems();
       cerrar();
   }

   private void abrirArchivo() {
       try {                               //path relativo
           output = new Formatter("Producto.txt"); //open de File , la JVM asume que el directorio completo es donde esta aplicación se ejecuta

       } catch (SecurityException ex) {
           ShowData.err("Acceso denegado. terminando...");
           //se origina si el usuario no tiene permisos para escribir aqui
           System.exit(1); //termiando el soft
       } catch (FileNotFoundException e) {
           ShowData.err("Error al abrir, terminando...");
           System.exit(1);
       }
   }

   //add info
   private void agregarItems() {
       int contador = 0;

       ShowData.println("Código - " + "Descripción - " + "Peso ");
       ShowData.print("_");
       while (true) {
           try {
               //seteamos los valores de producto
               producto.setCodigo(leer.nextInt());
               producto.setDescripcion(leer.next());
               producto.setPeso(leer.nextFloat());

               //podemos tambien instanciar asi
               //Producto producto = new Producto(leer.nextInt(),leer.next(),leer.nextFloat());

               output.format("%d %s %.2f%n", producto.getCodigo(), producto.getDescripcion(), producto.getPeso());

               contador ++;
           } catch (FormatterClosedException ex) {
               ShowData.err("Error escribiendo archivo, terminado");
               break;
           } catch (NoSuchElementException ex) {
               ShowData.err("Entrada invalida, intenta de nuevo"); //Solo si datos incorrectos por teclado
               leer.nextLine();// se habilitara el input de nuevo
           }

           ShowData.print("_");

           if (contador > 1) {
               ShowData.print("salir ? ");
               String salir = leer.next();
               if (salir.equalsIgnoreCase("si")) {
                   break;
               } else {
                   contador = 0; //resetemos el contador para pedir 3 productos mas
                   leer.nextLine();
                   ShowData.print("_");
                   continue;
               }
           }
       }

       ShowData.println("Escritura en archivo lista");
       JOptionPane.showMessageDialog(null, "Escritura lista");

   }

   private void cerrar() {
       if (output != null)
           output.close();
   }

   public static void main(String... PoCScanner) throws ClassNotFoundException, UnsupportedLookAndFeelException, InstantiationException, IllegalAccessException {
       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
       new CreateTextFile(new Scanner(System.in));
   }





Luego para leer el archivo Producto.txt haces así

Código (java) [Seleccionar]


import util.ShowData;

import java.io.IOException;
import java.nio.file.Paths;
import java.util.NoSuchElementException;
import java.util.Scanner;

public class LeerArchivo{

   private static Scanner leer;

   public LeerArchivo() {
       abrir();
       leer();
       cerrar();
   }

   private void abrir() {
       try {
           //abrir Archivo Producto.txt , la JVM busca en el mismo directorio donde se
          //ejecuta la app, cuando el path no se indica
           leer = new Scanner(Paths.get("Producto.txt"));  
       }catch (IOException e) {
           ShowData.err("Error al abrir archivo, terminando...");
           System.exit(1);
       }
   }
   //leer info de archivo
   private void leer() {                                                          
       ShowData.printf("%-10s%-12s%10s%n","Codigo","Descripción","Peso");
       try {
           while(leer.hasNext()) {
               //mostrando contenido del archivo
               ShowData.printf("%-10d%-12s%10.2f%n",leer.nextInt(),leer.next(),leer.nextFloat());
           }
       }catch (NoSuchElementException ex) {
           ShowData.err("Archivo con formado de manera incorrecta, terminando...");

       }catch (IllegalStateException ex) {
           ShowData.err("Error leyendo Archivo, terminando...");
       }
   }

   private void cerrar() {
       if(leer != null)
           leer.close();
   }

   public static void main(String ...PoC) throws IOException {
       new LeerArchivo();
   }
}




rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

ibai92

Oye amigo gracias por pasarme ese codigo  :o , dejame echarle un vistazo. Y seguramente tendre bastantes dudas en su ejecucion, ya que veo algunas cosas que aun no he visto.
Saludos

ibai92

#5
Buenas encontre la horna del zapato, justo lo que me pedian hacer en un video de mi curso. Asique avanze bastante. Voy a poner el codigo como muestra de gratitud a la informacion que me facilitaron, seguramente la pondre en practica tambien en la aplicacion. Saludos  ;D

Aunque en realidad el bucle del menu no esta bien hecho y se repite constantemente, por eso no esta del todo terminado algun codigo, estoy en ello y la clase producto no la incluyo porque no tiene nada de especial solo los contructores, getter , setter.
Cuando lo tenga hecho y funcione correctamente lo colgare, editando para que se quede el final. Y por si le puede servir a alguien

Modificacion , bucle funcional:

Código (java) [Seleccionar]

package pruebalibreceac;
/**
*
* @author ibai
*/
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;


public class Main {
   
    static int num;       
    static Scanner sc = new Scanner(System.in);
    static ArrayList<Producto> lproductos = new ArrayList<Producto>(); 
   
    public static void main(String [] args) throws IOException {
       
            do{                 
                System.out.println("\n1-Introducir nuevo producto.\n2-Visualizar productos.\n3-Guardar archivo de texto."
+ "\n4-Leer archivo.\n5-Salir.");
                num= sc.nextInt();
            }while(num < 0 || num > 5);
           
            do{
                switch(num){
                    case 1:                                       
                       
                        System.out.println("Ingrese el nombre y luego el peso del nuevo producto.");
                       
                            creaProducto();
                            if(guardaProducto()){
                                System.out.println("Fichero almacenado correctamente");
                            }
                            else{
                                System.out.println("Error guardando fichero");
                            }
                           
                        do{                           
                            System.out.println("\n1-Introducir nuevo producto.\n2-Visualizar productos.\n3-Guardar archivo de texto."
                            + "\n4-Leer archivo.\n5-Salir");
                            num= sc.nextInt();                           
                        }while(num<0 || num>5);
                       
                    break;                         
                    case 2:
                       
                        System.out.println("Estos son los productos existentes.");
                       
                        muestraContenido("C:\\Users\\ibai\\Documents\\NetBeansProjects\\Programa1\\pruebaLibre\\Productos.txt");
                       
                        do{     
                            System.out.println("\n1-Introducir nuevo producto.\n2-Visualizar productos.\n3-Guardar archivo de texto."
                            + "\n4-Leer archivo.\n5-Salir");
                            num= sc.nextInt();                         
                        }while(num<0 || num>5);
                       
                    break;
                    case 3:
                       
                        System.out.println("Guardando productos desde archivo externo.");
                       
                        do{   
                          System.out.println("\n1-Introducir nuevo producto.\n2-Visualizar productos.\n3-Guardar archivo de texto."
                            + "\n4-Leer archivo.\n5-Salir");
                            num= sc.nextInt();
                        }while(num<0 || num>5);
                       
                    break;
                    case 4:
                       
                        System.out.println("Visualizando productos desde archivo externo.");
                       
                        do{   
                            System.out.println("\n1-Introducir nuevo producto.\n2-Visualizar productos.\n3-Guardar archivo de texto."
                            + "\n4-Leer archivo.\n5-Salir");
                            num= sc.nextInt();
                        }while(num<0 || num>5);
                       
                    break;                   
                }
            }while(num != 5);       
    }
   
    private static void creaProducto(){                 //case 1
        Scanner sca = new Scanner(System.in);
       
        Producto p1 = new Producto(1,"Arroz", (float) 30.00);
        Producto p2 = new Producto(2,"Maíz", (float) 56.89);
        Producto p3 = new Producto();   
       
        p3.setDescripcion(sca.nextLine());
        p3.setPeso(sca.nextFloat());
       
                    //Añadir setter de p3 introducido por teclado
        lproductos.add(p1);
        lproductos.add(p2);
        lproductos.add(p3);   
       
        lproductos.add(new Producto());
    }
   
    private static boolean guardaProducto(){           //case 1
        boolean ok = false;
        try{
            String nombreFichero = "Productos.txt";
            BufferedWriter bw = new BufferedWriter(new FileWriter(nombreFichero));
            PrintWriter pw = new PrintWriter(bw);
           
            Iterator it = lproductos.iterator();
            while(it.hasNext()){
                Producto p = (Producto) it.next();
                pw.println(p.getCodigo());
                pw.println(p.getDescripcion());
                pw.println(p.getPeso());
            }
            pw.close();
            ok = true;
        }   
        catch(Exception e){
            System.out.println("Error: "+ e.getMessage());
        }
        return (ok);
    }
                                                            //case 2
    public static void muestraContenido(String archivo) throws FileNotFoundException, IOException {
        String nombreFichero;
        FileReader f = new FileReader(archivo);
        BufferedReader b = new BufferedReader(f);
        while((nombreFichero = b.readLine())!=null) {
            System.out.println(nombreFichero);
        }
        b.close();
    }
}

ibai92

Buenas no queria abrir un nuevo tema para una pregunta parecida. La verdad el codigo que subi esta bastante mal y nose en que forma modificarlo en el post para que se entienda.
Estoy teniendo un problema para escribir los productos en un archivo txt, solo escribe el primero que introduzco y no se si es porque me falta alguna variable por sacar de alguna funcion, o por que es mejor con otra funcion, pero .write() no me sirve.  Nose si el array tengo que ponerlo en la clase principal o en producto. Que nose si estoy escribiendo bien el codigo para acceder a lo que yo quiero desde cualquier funcion.

La funcion es guardaProd();

Código (java) [Seleccionar]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.*;
import java.util.Scanner;



public class Main {
    static int num;       
    static Scanner sc = new Scanner(System.in);
    static Producto[] listProd= new Producto[100];

    static Producto p = new Producto();
    static int nProd = 0;
   
        public static void main(String[] args) throws IOException {
           funcionSwitch();
        }   
        public static void funcionMenu(){
            do{
                System.out.println("Teclee la opción que desee." + "\n1-Introducir nuevo producto.\n2-Visualizar productos."
        + "\n3-Guardar en archivo de texto.\n4-Leer archivo de texto con productos guardados.\n5-Salir.");
                num= sc.nextInt();
            }while(num < 0 || num > 5);       
        }   
        public static void funcionSwitch() throws IOException{

            funcionMenu();

            do{
                switch(num){
                    case 1:

                       introducirProds();
                       funcionMenu();

                    break;                         
                    case 2:

                        visualizarProds();
                        funcionMenu();

                    break; 
                    case 3:
                        guardaProds();
                        funcionMenu();

                    break;
                    case 4:

                        leeProds();
                        funcionMenu();

                    break;                   
                }
            }while(num != 5);
        }


        public static void introducirProds(){   

            int cierraWhile = 0;
                while(nProd<listProd.length && cierraWhile != 1){
                    Producto P = new Producto();

                    System.out.println("Introduzca las variables del nuevo producto.");
                    System.out.println("Código:");      P.setCodigo(sc.nextInt());
                    System.out.println("Nombre:");      P.setDescripcion(sc.next());
                    System.out.println("Peso:");        P.setPeso(sc.nextFloat());

                    System.out.println("¿Quiere dejar de introducir productos? teclee: 1 = si ,0 = no.");
                    cierraWhile = sc.nextInt();

                    listProd[nProd]= P ;   
                    nProd++;

                    if(nProd==listProd.length){
                        System.out.println("Almacenamiento lleno.");}
                }
        }    //Case 1
        public static void visualizarProds(){
            System.out.println("Productos introducidos en esta sesión: ");
                for(int i=0;i<nProd;i++)
                    System.out.println("Producto "+ listProd[i].getDescripcion() +"; con código: "
                        + listProd[i].getCodigo()+"; y peso: "+ listProd[i].getPeso()+" .");
        }   //Case 2
        public static void guardaProds() throws IOException{
            System.out.println("Guardando los productos en: Productos.txt");
           
            File nombreFichero = new File("Productos.txt");
            FileWriter fw = new FileWriter(nombreFichero,true);       
            BufferedWriter bw = new BufferedWriter(fw);       
            PrintWriter pw = new PrintWriter(bw);
           
            listProd[nProd] = p;      //Antes no tenia esto y solo escribia el primer producto, con esto escribe: 0 , "desconocido" y 0.0.
           
                for (int nProd = 0; nProd < listProd.length; nProd++) {
                    pw.println(p.getCodigo());//Y al no estar p, estas lineas se escribirian pw.println(listProd.getCodigo()); para que el programa escriba...
                    pw.println(p.getDescripcion());                                                      //...al menos el primer producto introducido
                    pw.println(p.getPeso());
                   
                        pw.close();
                }
        }            //Case 3
        public static void leeProds(){
            System.out.println("Estoy dentro del case 4");
           
        }                                 //Case 4
   
}


clase producto

Código (java) [Seleccionar]

public class Producto {
    private int codigo;
    private String descripcion;
    private float peso;
   
   
    public Producto(int codigo, String descripcion, float peso) {
        this.codigo = codigo;
        this.descripcion = descripcion;
        this.peso = peso;
    }   
    public Producto(){
        this.codigo=0;
        this.descripcion="Desconocido";
        this.peso=0;
    }

    public int getCodigo() {
        return codigo;
    }
    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }

    public String getDescripcion() {
        return descripcion;
    }
    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public float getPeso() {
        return peso;
    }
    public void setPeso(float peso) {
        this.peso = peso;
    }
   
}

Un saludo y gracias

ibai92

Por favor sabrian decirme alguna pista para que nProd, en la funcion guardarProd(), le indique al programa el numero de elementos en la matriz  listProd[] ??

En la funcion introducirProd() es un contador que incrementa cada vez que se añade un producto en la sesion. Y nProd en la funcion visualizaProd() si se relaciona con introducirProd(), pero no en guardaProd()...

Tan solo una pistta, he probado muchas cosas ya y no quiero entregar el ejercicio despues de aver llegado hasta aqui sin tener todas las funciones.
Saludos y gracias