Opa galera beleza?
Preciso fazer a leitura de um arquivo txt em que cada linha é um cpf ou cnpj, calcular o digito verificador deles e depois escrever em um novo arquivo usando multi Threads em Java para fazer no menor tempo possivel esse processo.
Eu fiz, mas o arquivo está sendo gravada com informações com duplicidade, alguém pode me ajudar?
Alguém pode me ajudar?
Segue código:
package com.example.sistemasdistribuidos;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class SistemasCpf {
private static final String VIRGULA = "\n";
private static BufferedReader reader;
private static String TEMPO= null;
private static String linha = null;
private static FileWriter filew = null;
private static final List<String[]> lista = Collections.synchronizedList(new ArrayList<>());
public static void main(String[] args) throws Exception {
//Abrindo arquivo para leitura
File file = new File(SistemasCpf.class.getResource("/arquivosCpfCnpj/BASEPROJETO.txt").getFile());
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while ((linha = reader.readLine()) != null) {
String[] dadosUsuario = linha.split(VIRGULA);
lista.add(dadosUsuario);
}
try {
filew = new FileWriter(SistemasCpf.class.getResource("/arquivosCpfCnpj/CPFCNPJ.txt").getFile());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
PrintWriter gravarArq = new PrintWriter(filew);
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
//Abrindo arquivo para escrita
long start = System.currentTimeMillis();
for( String[] str : lista) {
synchronized(str) {
String numero = retornaNumero(str);
gravaNoArquivo(numero, gravarArq);
}
}
long tempoFinal = System.currentTimeMillis();
System.out.printf("Primeira Thread: %.3f ms%n", (tempoFinal - start) / 1000d);
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
long start = System.currentTimeMillis();
for( String[] str : lista) {
synchronized(str) {
String numero = retornaNumero(str);
gravaNoArquivo(numero, gravarArq);
}
}
long tempoFinal = System.currentTimeMillis();
System.out.printf("Segunda Thread:%.3f ms%n", (tempoFinal - start) / 1000d);
}
});
t1.start();
t2.start();
t1.join();
t2.join();
filew.close();
}
private static String retornaNumero(String[] str) {
String valida = Arrays.toString(str);
valida = valida.substring(1, valida.length()-1).replace("]", "").replace("[", "").replaceAll("\\s+","");
//Verifica se é Cpf, caso retorne falso é um Cnpj
boolean validaCpf = verificaEhCpf(valida);
String numero;
if(validaCpf) {
VerificadorCpf verificarCPF = new VerificadorCpf();
numero = verificarCPF.obterNumeracaoCPF(valida);
}else {
VerificadorCnpj verificadorCnpj = new VerificadorCnpj();
numero = verificadorCnpj.obterNumeracaoCNPJ(valida);
}
return numero;
}
private static void gravaNoArquivo(String n,PrintWriter gravarArq) {
gravarArq.println(n);
}
static boolean verificaEhCpf(String numero) {
return numero.length() == 9;
}
}