Archivos

Hola a todos espero que estén bien primero que nada.
Bueno pues como aveces tienes que copiar y pegar correos, que le tienes que quitar la coma y así me surgió hacer este programa.
Cosiste en esto:
Tengo todos estos emails:

 <jonathan@hotmail.com>, <ab.san@hotmail.com>, <astillo@villacero.com.mx>, adriana suarez <adriana.suarez@gmodelo.com.mx>,  

Y quiero que queden asi:
jonathan@hotmail.com
ab.san@hotmail.com
astillo@villacero.com.mx

Este es mi código:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.*;

public class Emails {
         
         public void obtenerEmails(){
                 

              File archivo = null;
              FileReader fr = null;
              BufferedReader br = null;
                 try {
                    String Correo;

                archivo = new File ("F:\\mail.txt");
                 fr = new FileReader (archivo);
                 br = new BufferedReader(fr);
                String str;
                while ((str = br.readLine()) != null) {
                                int posX = str.indexOf("<");
                                int posXX =str.indexOf(">");
                                System.out.print(posX+","+posXX);
                                System.out.print(str);
                               
                                Correo = str.substring(posX+1,posXX);
                                System.out.println(Correo);
                     }br.close();
                } catch (IOException e) { }
          }
         
         public static void main(String []args) throws IOException{
                 Emails obj=new Emails();                
                 obj.obtenerEmails();
                 
                 
                 
         }
}

Pero ahi un problema solamente me guarda el primer email que es :
jonathan@hotmail.com

Habia pensado meter todo lo del archivo en un Array y de ahi irme en posiciones.
Si alguien me puede decir alguna mejor solución se lo agradecería.

Saludos.

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

prueba unitaria

Separación de tareas, pruebas unitarias, etc... separa tu código: debes tener una rutina a la que le pasas una cadena con todos los mails y te devuelve una lista de cadenas con los puros correos, sin nombres. Eso lo puedes probar pasándole una cadena sin importar de dónde venga.

Aparte haces un método que lea la cadena del archivo. Esa la pruebas comprobando que se lea el contenido que estás esperando (lo que sabes que viene en un archivo de prueba).

En cuanto al código que obtiene las direcciones... yo haría algo así:

int p0 = str.indexOf('<');
int p1 = 0;
if (p0 >= 0) {
  p1 = str.indexOf('>', p0); //buscar a partir de p0, no desde el principio de la cadena
  if (p1 > p0) {
    String correo = str.substring(p0+1, p1);
  }
} else {
  p1 = 0;
}
int pc = str.indexOf(',', p1); //buscar la primera coma después de la primera dirección, o del inicio de la cadena
if (pc > p1) {
  //seguir parseando, todo este codigo deberia ir en un loop
} else {
  //ya terminamos
}
Imagen de rodrigo salado anaya

Jejeje solo por pasar el rato :P

Hola @JaimeItlzc, pues solo por pasar el ratito libre en el trabajo te dejo una mini mini versión toda chafa y nada funcional de como no lo aria yo jejeje, pero bueno para fines de repaso sirve:

public static void main(String[] args) {
        for (String correo : "<jonathan@hotmail.com>, <ab.san@hotmail.com>, <astillo@villacero.com.mx>, adriana suarez <adriana.suarez@gmodelo.com.mx>,  ".split(",")) {
            if (correo.contains("<") && correo.contains(">")) {
                System.out.println(correo.substring(correo.indexOf("<") + 1, correo.indexOf(">")));
            }
        }
    }
run:
jonathan@hotmail.com
ab.san@hotmail.com
astillo@villacero.com.mx
adriana.suarez@gmodelo.com.mx
Imagen de JaimeItlzc

Osea en un bucle

Osea en un bucle como  while()

while(condicion){
int pc = str.indexOf(',', p1); //buscar la primera coma después de la primera dirección, o del inicio de la cadena
if (pc > p1) {
  //seguir parseando, todo este codigo deberia ir en un loop
} else {
  //ya terminamos
  }
}

Asi o me equivoco?
Gracias.

Imagen de rodrigo salado anaya

Algo así aria yo.

Pues así aria yo para resolver tu duda:

public class Main {

    /**
     * @param args the command line arguments
     */

    public static void main(String[] args) throws FileNotFoundException, IOException {
        String filePath = "C:/Documents and Settings/rodrigo/Mis documentos/NetBeansProjects/mail-editor/mail.txt";
        String fileString = readFile(filePath);
        printCorreosEditados(fileString);
    }

    /**
     *  Imprime los correos editados (sin '<' '>' ',' ESPACIOS_BLANCOS)
     * @param correosString String que contiene los correos
     */

    static void printCorreosEditados(String correosString) {
        String correos[] = correosString.split(",");
        for (String correo : correos) {
            if (correo.contains("<") && correo.contains(">")) {
                String correoEditado = correo.substring(correo.indexOf("<") + 1, correo.indexOf(">"));
                System.out.println(correoEditado.trim());
            }

        }
    }

    /**
     * Regresa un String con el contenido del archivo
     * Tomado de stackoverflow.com:
     * Tema: how-to-create-a-java-string-from-the-contents-of-a-file
     * @param path el path del archivo con los correos.
     */

    static String readFile(String path) throws IOException {
        FileInputStream stream = new FileInputStream(new File(path));
        try {
            FileChannel fc = stream.getChannel();
            MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
            return Charset.defaultCharset().decode(bb).toString();
        } finally {
            stream.close();
        }
    }
}

run:
jonathan@hotmail.com
ab.san@hotmail.com
astillo@villacero.com.mx
adriana.suarez@gmodelo.com.mx

EDIT: Al imprimir el correo editado en el método printCorreosEditados, conviene poner un trim(), para evitar los saltos de linea no deseados.

System.out.println(correoEditado);
por
System.out.println(correoEditado.trim());

Un saludo a @OscarRyz y un dia me explicas a detalle como jelgorios funciona el metodo readFile; ¿Por qué Orcar? a pus por que el hizo la pregunta en stackoverflow jejejeje pero en relidad esto es para otro hilo y la pregunta a quien la sepa =).

Imagen de JaimeItlzc

Gracias ezamudio y rodrigo salado anaya.

Mira rodrigo asi quedo agarrando los correos de un fichero.

import java.io.*;

public class Emails {
 public void obtenerMails(){
              File archivo = null;
              FileReader fr = null;
              BufferedReader br = null;
                 try {
                 archivo = new File ("F:\\mail.txt");
                 fr = new FileReader (archivo);
                 br = new BufferedReader(fr);
                String str;
                while ((str = br.readLine()) != null) {
                    for (String correo : str.split(",")) {
                        if (correo.contains("<") && correo.contains(">")) {
                            System.out.println(correo.substring(correo.indexOf("<") + 1, correo.indexOf(">")));
                        }
                    }
             }br.close();
                } catch (IOException e) { }
          }
         
         public static void main(String []args) throws IOException{
                 Emails obj=new Emails();                
                 obj.obtenerMails();
                 
         }
}

En un rato pongo la propuesta de @Ezamudio
Gracias.

Imagen de rodrigo salado anaya

@JaimeItlzc ejemmm

Quehubolas Jaime, pues si en un dado caso ponen contenido en el archivo de correos como:

 <jonathan@hotmail.com>,
 <ab.san@hotmail.com
 
 >,
 
 <astillo@villacero.com.mx>,
 adriana suarez <adriana.suarez@gmodelo.com.mx>,

y usas este método tuyo: http://www.javamexico.org/blogs/jaimeitlzc/archivos#comment-12227

se trunca la salida, algo como:

run:
jonathan@hotmail.com
astillo@villacero.com.mx
adriana.suarez@gmodelo.com.mx


ammm, por otro lado revisa bien el código del tu while, para que quede algo como:
checa que reemplace el correo por str vale : ).

Imagen de JaimeItlzc

Split()

Si le quito el metodo split(",") solo me regresa un solo correo que es el primero. :S
Un saludoo..

Si OscarRyz Explicanos :P

Imagen de charlymex

String tokenizer

yo lo hubiese hecho con el StringTokenizer... digo... cuestión de gustos...

Imagen de rodrigo salado anaya

split(",")

Si lo siento Jaime no tengo un jdk a la mano pero me falto código por poner... : S

Mas generico

Si en hay un salto de linea y no se lee la coma o si se olvidaron de poner una coma podriamos centrarnos en un elemento que siempre aparece en un email ,la arroba.

for(String correo : correos.split("[<> ]"))
                if(correo.contains("@"))
                        System.out.println(correo.trim());

Con expresiones regulares

Puedes utilizar expresiones regulares. En este programa el contenido del archivo se pasa a una cadena en la cual se hace la búsqueda de la expresión regular.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Remplazador {

     /* Ejemplo de invocacion: java Remplazador correos.txt > correos2.txt */

    public static void main(String[] args) throws IOException {
        BufferedReader reader=null;
        try{
            reader=new BufferedReader(new FileReader(args[0]));
            StringBuilder builder=new StringBuilder();
            String line;
            while((line=reader.readLine()) != null){
                builder.append(line);
            }
            Pattern regexp=Pattern.compile("[^,]*<([^>]+)>,?");
            Matcher matcher = regexp.matcher(builder);
            while(matcher.find()){
                System.out.println(matcher.group(1));
            }
            reader.close();
            reader=null;
        }finally{
            if(reader != null){
                reader.close();
            }
        }
    }
   
}

Si utilizas expresiones regulares, no es necesario hacer un programa ya que muchos editores las soportan (Notepad++, Pspad, etc.). Yo utilizo el editor de Netbeans para hacer transformaciones de texto como el de este ejemplo.

CSV

¿Porqúe no utilizas Comma Separated Values?...Es bien simple en donde tienes: "correo de alguien < calguien@de.com >", "correo de otro alguien < cotroalguien@de.com >", "correo de alguien mas < calguienmas@de.com >", cada cosa es una cadena antes y después de una coma, lo podemos ver a bajo nivel cómo un arreglo. De ahí (después de procesar un csv) a split y de ahí a quitar los "<" y ">". Es la que se me ocurre.

En otro caso de no tener ningún archivo, mi recomendación serían las expresiones regulares o de nuevo el split. Pero me decantaría más por las expresiones regulares.

Liga de CSV para Java aquí.