Estou em duvida de como fazer o seguinte exercicio:
Um program em Java que leia as informações (nome, e-mail, data de nascimento) de um arquivo de entrada denominado “clientes.txt”, processe os dados verificando se o dia atual (execução do programa) possui aniversariantes. Caso exista aniversariantes envie um e-mail contendo uma mensagem de felicitação ao estilo cartão de aniversário (e-mail HTML com estilização e imagem) após o envio das mensagens utilize um JOptionPane para comunicar o sucesso ao enviar. No caso contrário, utilize do JOptionPane para informa a inexistência de aniversariantes no dia.
Em que formato os clientes estão dentro do txt?
Para enviar o email tem o JavaMail (não sei se tem algo mais novo).
Verificar a data é uma simples comparação.
Exemplo de como estaria no arquivo:
Fernanda fernanda12@gmail.com 12/04/2012
Joaquim joaquim@hotmail.com 09/08/2015
Marcos mmarcos@ig.org 16/11/2014
Tem como me ajuda a ler o arquivo para fazer a comparação de datas?
public static void main(String[] args) {
String x = "Fernanda fernanda12@gmail.com 12/04/2012";
Pattern pa = Pattern.compile("([0-9]{2}\\/[0-9]{2}\\/[0-9]{4})$");
Matcher matcher = pa.matcher(x);
if (matcher.find()) {
String data = matcher.group(1);
pa = Pattern.compile("[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+");
matcher = pa.matcher(x);
if (matcher.find()) {
String email = matcher.group();
String aniversario= "12/04/2012";
if (data.equals(aniversario)) {
//envia email
}
}
}
}
import java.io.BufferedReader;
import java.io.FileReader;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class Principal {
private static final String ARQUIVO = "lista.txt";
public static void main(String[] args) {
try(BufferedReader br = new BufferedReader(new FileReader(ARQUIVO))){
String line;
while((line = br.readLine()) != null){
String[] info = line.split(" ");
if(info[2] != null){
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate aniversario = LocalDate.parse(info[2], fmt);
if(aniversario.getMonth().equals(LocalDate.now().getMonth()) && aniversario.getDayOfMonth() == LocalDate.now().getDayOfMonth()){
System.out.println("Aniversário de " + info[0] + " é hoje!");
}else{
System.out.println(info[0] + " não faz aniversário hoje. [" + aniversario.toString() + "]");
}
}
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
Li o arquivo assim e funcionou a leitura e pedi para mostrar funcionou, falta entender e codificar para buscar a data dentro do arquivo…
package main;
import java.io.FileInputStream;
import java.io.FileReader;
import main.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException {
File arquivo = new File("C:\\Users\\Fer Gomes\\Documents\\NetBeansProjects\\Daniel\\src\\main\\clientes.txt");
//CONTAR TANTO DE LINHA PARA COLOCAR NO FOR
LineNumberReader linha = new LineNumberReader(new InputStreamReader(new FileInputStream("C:\\Users\\Fer Gomes\\Documents\\NetBeansProjects\\Daniel\\src\\main\\clientes.txt")));
String nextLine = null;
FileReader fr = new FileReader("C:\\Users\\Fer Gomes\\Documents\\NetBeansProjects\\Daniel\\src\\main\\clientes.txt");
LineNumberReader lnr = new LineNumberReader(fr);
int linenumber = 0;
while (lnr.readLine() != null) {
linenumber++;
}
lnr.close();
String textoArq = arquivo.read();
System.out.println(textoArq);
int qtdLinha = 0;
int mesA = 0, dia = 0;
int diaA = 0 ;
for (int i = 0; qtdLinha <= linenumber; i++) {
if (dia == diaA) {
//ENVIAR EMAIL AO ANIVERSARIANTE
} else {
//DIZER QUE NÃO EXISTE ANIVERSARIANTES NO DIA
}
final int tamanhoCodigo = 10;
String s = ".com ";
}
Scanner sc = new Scanner("C:\\Users\\Fer Gomes\\Documents\\NetBeansProjects\\Daniel\\src\\main\\clientes.txt");
String linhas = sc.nextLine();
final int tamanhoCodigo = 10;
String bs = "@gmail.com ";
int pos = linhas.indexOf(bs);
String saida = linhas.substring(pos + bs.length(), pos + bs.length() + tamanhoCodigo);
System.out.println(saida);
}
}
Estou construindo o email com imagem em outra classe.
Tenho uma pergunta para dentro do tópico que seria pertinente, porque também era uma dúvida minha quando li essa postagem, porque preciso fazer isso em meu trabalho e queria saber como seria no caso das informações no txt não estarem totalmente ordenados, como faço no código para fazer a busca dessas informações?
No código postei, como você informou o formato da linhas separados por um espaço, a data é o último sempre. Eu dou um split e pego o info[2] que é data e faço a conversão.
Teria como explicar o que é split e como eu faço?
Split é um método da classe String que vai dividir a sua string de acordo com o regex/valor que você passar.
Então, por exemplo, no seu caso cada linha é da seguinte forma:
Fernanda fernanda12@gmail.com 12/04/2012
Cada dado está separado por um espaço. Se você der um split nesta string (linha toda) usando o espaço ele vai te retornar um vetor de String.
Eu sei que na última posição está a data.
Qual seria o formato?
Dá para usar o meu código até a parte do split e depois você busca o quer com Pattern usando regex por exemplo.