Gerar arquivo txt dos dados armazenados em variáveis

import java.text.DecimalFormat;

import java.util.Locale;
import java.util.Scanner;

public class CalculaIrrfPF {

static final Double ALIQUOTA_INSS_PARTE_SEGURADO = 11.0;
static final Double VALOR_MAXIMO_CONTRIB_INSS_SEGURADO = 713.09; //Teto do INSS
static final Double MENOR_RETENCAO_IR = 10.0;

public static void main(String[] args) {
	
	Locale.setDefault(Locale.US);
			
	Scanner sc = new Scanner(System.in);		
	
	System.out.println("Informe o valor do Pagamento: ");
	Double valorPagamento = sc.nextDouble();
	
	if(valorPagamento <= 0) {
		System.err.println("Valor Inválido");
		System.exit(1);
	}

	Double retencaoInss = valorPagamento * (ALIQUOTA_INSS_PARTE_SEGURADO/100);
			
	/* Abaixo o teste para verificar se a retenção ultrapassou o teto, caso tenha ultrapassado, o valor da retenção
	 * torna-se o teto */
	if(retencaoInss > VALOR_MAXIMO_CONTRIB_INSS_SEGURADO) {
		retencaoInss = VALOR_MAXIMO_CONTRIB_INSS_SEGURADO;
	}
	
	Double baseCalculoIrrf = valorPagamento - retencaoInss;
	Double aliquotaIrrf = 0.0;
	Double deducaoIrrf = 0.0;
	
	//Condições abaixo verificam a faixa do IR para definir aliquota e dedução.
	if(baseCalculoIrrf < 1903.98) {
		aliquotaIrrf = 0.0;
		deducaoIrrf = 0.0;
	} else if(baseCalculoIrrf >= 1903.99 && baseCalculoIrrf < 2826.65) {
		aliquotaIrrf = 7.5;
		deducaoIrrf = 142.80;
	}else if(baseCalculoIrrf >= 2826.66 && baseCalculoIrrf < 3751.05) {
		aliquotaIrrf = 15.0;
		deducaoIrrf = 354.80;
	}else if(baseCalculoIrrf >= 3751.06 && baseCalculoIrrf < 4664.68) {
		aliquotaIrrf = 22.5;
		deducaoIrrf = 636.13;
	}else if(baseCalculoIrrf > 4664.69) {
		aliquotaIrrf = 27.5;
		deducaoIrrf = 869.36;
	}
	
	Double valorIrBruto = baseCalculoIrrf *(aliquotaIrrf/100);
	Double valorIrDeduzido = valorIrBruto - deducaoIrrf;
	
	//Valor mínimo para retenção de IR R$10,00
	if(valorIrDeduzido <= MENOR_RETENCAO_IR) {
		valorIrDeduzido = 0.0;
	}
	
	Double valorPagamentoLiquido = baseCalculoIrrf - valorIrDeduzido;
	
	DecimalFormat df = new DecimalFormat("#.##");
	
	System.out.println("Valor Bruto do Pagamento: R$ " + df.format(valorPagamento));
	System.out.println("Desconto de INSS (11%): R$ " + df.format(retencaoInss));
	System.out.println("Base de Cálculo IR: R$ " + baseCalculoIrrf);
	System.out.println("Aliquota IR (%): R$ " + df.format(aliquotaIrrf));
	System.out.println("Valor IR Bruto: R$ " + df.format(valorIrBruto));
	System.out.println("Dedução do IR: R$ " + df.format(deducaoIrrf));
	System.out.println("Imposto de Renda Devido: R$ " + df.format(valorIrDeduzido));
	System.out.println("Valor Líquido à Receber: R$ " + df.format(valorPagamentoLiquido));
	
		
	sc.close();
}

}

Boa tarde Pessoal!

Estou iniciando em lógica de programação com Java. Ainda não estou na parte de OO.

Fiz o seguinte algoritmo para calculo de INSS e IR de pagamentos a pessoa física, unindo o estudo a minha rotina, diariamente preciso fazer este cálculo, então porque não :smile: ?

Gostaria de exportar as informações que estão sendo impressas no console para um arquivo txt.

Tentei algumas vezes com exemplos da internet mas sem sucesso, sempre muitos erros.
O que posso utilizar para que possa obter o arquivo txt com os dados?

Caso tenham sugestão de melhorias para o código podem colocar por gentileza, desde que não seja utilizando Orientação a Objeto neste momento.

Obrigado.

Fiz umas alterações aqui:

import java.io.*;
import java.text.DecimalFormat;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import java.util.Scanner;

public class CalculaIrrfPF {

    static PrintStream OUT = System.out;
    static boolean GENERATE_FILE = true;
    static final String OUT_DIR = "" // Aqui você coloca o diretório que você quer que os arquivos sejam gerados, ex: C:\Users\SEU_USER\Downloads;

    static final Double ALIQUOTA_INSS_PARTE_SEGURADO = 11.0;
    static final Double VALOR_MAXIMO_CONTRIB_INSS_SEGURADO = 713.09; //Teto do INSS
    static final Double MENOR_RETENCAO_IR = 10.0;

    public static void main(String[] args) throws FileNotFoundException {
        Locale.setDefault(Locale.US);
        Scanner sc = new Scanner(System.in);

        System.out.println("Informe o valor do Pagamento: ");
        double valorPagamento = sc.nextDouble();

        if (valorPagamento <= 0) {
            System.err.println("Valor Inválido");
            System.exit(1);
        }

        double retencaoInss = valorPagamento * (ALIQUOTA_INSS_PARTE_SEGURADO / 100);

        /* Abaixo o teste para verificar se a retenção ultrapassou o teto, caso tenha ultrapassado, o valor da retenção
         * torna-se o teto */
        if (retencaoInss > VALOR_MAXIMO_CONTRIB_INSS_SEGURADO) {
            retencaoInss = VALOR_MAXIMO_CONTRIB_INSS_SEGURADO;
        }

        double baseCalculoIrrf = valorPagamento - retencaoInss;
        double aliquotaIrrf = 0.0;
        double deducaoIrrf = 0.0;

        //Condições abaixo verificam a faixa do IR para definir aliquota e dedução.
        if (baseCalculoIrrf < 1903.98) {
            aliquotaIrrf = 0.0;
            deducaoIrrf = 0.0;
        } else if (baseCalculoIrrf < 2826.65) {
            aliquotaIrrf = 7.5;
            deducaoIrrf = 142.80;
        } else if (baseCalculoIrrf < 3751.05) {
            aliquotaIrrf = 15.0;
            deducaoIrrf = 354.80;
        } else if (baseCalculoIrrf < 4664.68) {
            aliquotaIrrf = 22.5;
            deducaoIrrf = 636.13;
        } else if (baseCalculoIrrf > 4664.69) {
            aliquotaIrrf = 27.5;
            deducaoIrrf = 869.36;
        }

        double valorIrBruto = baseCalculoIrrf * (aliquotaIrrf / 100);
        double valorIrDeduzido = valorIrBruto - deducaoIrrf;

        //Valor mínimo para retenção de IR R$10,00
        if (valorIrDeduzido <= MENOR_RETENCAO_IR) {
            valorIrDeduzido = 0.0;
        }

        double valorPagamentoLiquido = baseCalculoIrrf - valorIrDeduzido;

        printInfo(valorPagamento, retencaoInss, baseCalculoIrrf, aliquotaIrrf, valorIrBruto, deducaoIrrf,
                valorIrDeduzido, valorPagamentoLiquido);

        if (GENERATE_FILE) {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy-hh-mm-ss");
            OUT = new PrintStream(new File(OUT_DIR + "\\IrrfPF-" + LocalDateTime.now().format(formatter)) + ".txt");

            printInfo(valorPagamento, retencaoInss, baseCalculoIrrf, aliquotaIrrf, valorIrBruto, deducaoIrrf,
                    valorIrDeduzido, valorPagamentoLiquido);
        }


        System.out.println("Programa encerrado!");
        OUT.close();
        sc.close();
    }

    private static void printInfo(double valorPagamento, double retencaoInss, double baseCalculoIrrf,
                                  double aliquotaIrrf, double valorIrBruto, double deducaoIrrf,
                                  double valorIrDeduzido, double valorPagamentoLiquido) {

        DecimalFormat df = new DecimalFormat("#.##");

        OUT.println("Valor Bruto do Pagamento: R$ " + df.format(valorPagamento));
        OUT.println("Desconto de INSS (11%): R$ " + df.format(retencaoInss));
        OUT.println("Base de Cálculo IR: R$ " + baseCalculoIrrf);
        OUT.println("Aliquota IR (%): R$ " + df.format(aliquotaIrrf));
        OUT.println("Valor IR Bruto: R$ " + df.format(valorIrBruto));
        OUT.println("Dedução do IR: R$ " + df.format(deducaoIrrf));
        OUT.println("Imposto de Renda Devido: R$ " + df.format(valorIrDeduzido));
        OUT.println("Valor Líquido à Receber: R$ " + df.format(valorPagamentoLiquido));
    }

}

As alterações que fiz foram as seguintes:

  1. Removi uma lógica que não era necessária, no caso, as primeiras condições do else if:
if (baseCalculoIrrf < 1903.98) {
// Entra aqui caso o valor de baseCalculoIrrf seja menor que 1903.98, caso contrário, seguirá para a próxima instrução.
	aliquotaIrrf = 0.0;
	deducaoIrrf = 0.0;
} else if (baseCalculoIrrf >= 1903.99 && baseCalculoIrrf < 2826.65) {
/* Entra aqui se o valor de baseCalculoIrrf  for maior ou igual à 1903.99  e menor que 2826.65.  
A questão é, se não entrou no primeiro if, logo o valor de baseCalculoIrrf é igual ou maior que 1903.99, logo a primeira verificação não é necessária. */
       aliquotaIrrf = 7.5;
       deducaoIrrf = 142.80;
}
...
  1. Usei a classe PrintStream tanto para mostrar o resultado no console, quanto gravá-los em um arquivo. O Java já usa a PrintStream para mostrar texto na tela, então não foi muito díficil fazer a alteração.

  2. Criei o método printInfo, para não haver repitação de código.

Caso queria dar uma estudada no pacote Java IO, aqui algumas aulas que ensinam em português e gratuitamente.

1 curtida
import java.io.File;

import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.text.DecimalFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import java.util.Scanner;

public class CalculaIrrfPF {

static PrintStream OUT = System.out;
static boolean GENERATE_FILE = true;
static final String OUT_DIR = "C:\\Users\\moises.oliveira\\Desktop";

static final Double ALIQUOTA_INSS_PARTE_SEGURADO = 11.0;
static final Double VALOR_MAXIMO_CONTRIB_INSS_SEGURADO = 713.09; //Teto do INSS
static final Double MENOR_RETENCAO_IR = 10.0;

public static void main(String[] args) throws FileNotFoundException {
	
	Locale.setDefault(Locale.US);
			
	Scanner sc = new Scanner(System.in);		
	
	System.out.println("Informe o valor do Pagamento: ");
	Double valorPagamento = sc.nextDouble();
	
	if(valorPagamento <= 0) {
		System.err.println("Valor Inválido");
		System.exit(1);
	}

	Double retencaoInss = valorPagamento * (ALIQUOTA_INSS_PARTE_SEGURADO/100);
			
	/* Abaixo o teste para verificar se a retenção ultrapassou o teto, caso tenha ultrapassado, o valor da retenção
	 * torna-se o teto */
	if(retencaoInss > VALOR_MAXIMO_CONTRIB_INSS_SEGURADO) {
		retencaoInss = VALOR_MAXIMO_CONTRIB_INSS_SEGURADO;
	}
	
	Double baseCalculoIrrf = valorPagamento - retencaoInss;
	Double aliquotaIrrf = 0.0;
	Double deducaoIrrf = 0.0;
	
	//Condições abaixo verificam a faixa do IR para definir aliquota e dedução.
	if(baseCalculoIrrf < 1903.98) {
		aliquotaIrrf = 0.0;
		deducaoIrrf = 0.0;
	} else if(baseCalculoIrrf < 2826.65) {
		aliquotaIrrf = 7.5;
		deducaoIrrf = 142.80;
	}else if(baseCalculoIrrf < 3751.05) {
		aliquotaIrrf = 15.0;
		deducaoIrrf = 354.80;
	}else if(baseCalculoIrrf < 4664.68) {
		aliquotaIrrf = 22.5;
		deducaoIrrf = 636.13;
	}else if(baseCalculoIrrf > 4664.69) {
		aliquotaIrrf = 27.5;
		deducaoIrrf = 869.36;
	}
	
	Double valorIrBruto = baseCalculoIrrf *(aliquotaIrrf/100);
	Double valorIrDeduzido = valorIrBruto - deducaoIrrf;
	
	//Valor mínimo para retenção de IR R$10,00
	if(valorIrDeduzido <= MENOR_RETENCAO_IR) {
		valorIrDeduzido = 0.0;
	}
	
	Double valorPagamentoLiquido = baseCalculoIrrf - valorIrDeduzido;
	
	DecimalFormat df = new DecimalFormat("#.##");
	
	OUT.println("Valor Bruto do Pagamento: R$ " + df.format(valorPagamento));
	OUT.println("Desconto de INSS (11%): R$ " + df.format(retencaoInss));
	OUT.println("Base de Cálculo IR: R$ " + baseCalculoIrrf);
	OUT.println("Aliquota IR (%): R$ " + df.format(aliquotaIrrf));
	OUT.println("Valor IR Bruto: R$ " + df.format(valorIrBruto));
	OUT.println("Dedução do IR: R$ " + df.format(deducaoIrrf));
	OUT.println("Imposto de Renda Devido: R$ " + df.format(valorIrDeduzido));
	OUT.println("Valor Líquido à Receber: R$ " + df.format(valorPagamentoLiquido));
	
	if (GENERATE_FILE) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy-hh-mm-ss");
        OUT = new PrintStream(new File(OUT_DIR + "\\IrrfPF-" + LocalDateTime.now().format(formatter)) + ".txt");

        OUT.println("Valor Bruto do Pagamento: R$ " + df.format(valorPagamento));
		OUT.println("Desconto de INSS (11%): R$ " + df.format(retencaoInss));
		OUT.println("Base de Cálculo IR: R$ " + baseCalculoIrrf);
		OUT.println("Aliquota IR (%): R$ " + df.format(aliquotaIrrf));
		OUT.println("Valor IR Bruto: R$ " + df.format(valorIrBruto));
		OUT.println("Dedução do IR: R$ " + df.format(deducaoIrrf));
		OUT.println("Imposto de Renda Devido: R$ " + df.format(valorIrDeduzido));
		OUT.println("Valor Líquido à Receber: R$ " + df.format(valorPagamentoLiquido));
    }


    System.out.println("Programa encerrado!");
    OUT.close();
    sc.close();

// System.out.println("Valor Bruto do Pagamento: R$ " + df.format(valorPagamento));
// System.out.println("Desconto de INSS (11%): R$ " + df.format(retencaoInss));
// System.out.println("Base de Cálculo IR: R$ " + baseCalculoIrrf);
// System.out.println("Aliquota IR (%): R$ " + df.format(aliquotaIrrf));
// System.out.println("Valor IR Bruto: R$ " + df.format(valorIrBruto));
// System.out.println("Dedução do IR: R$ " + df.format(deducaoIrrf));
// System.out.println("Imposto de Renda Devido: R$ " + df.format(valorIrDeduzido));
// System.out.println("Valor Líquido à Receber: R$ " + df.format(valorPagamentoLiquido));

	sc.close();
}

}

Como não vi ainda a questão de métodos, fiz a alteração seguinte, com a repetição do trecho.

Quanto as suas alterações, vamos ver o que entendi…

1.Removi uma lógica que não era necessária, no caso, as primeiras condições do else if :
Entendido, conforme vai passando pelo if, o teste que ficou para trás já está validado, acaba ficando o mesmo teste duas vezes da forma que fiz, correto?

2.Usei a classe PrintStream tanto para mostrar o resultado no console, quanto gravá-los em um arquivo. O Java já usa a PrintStream para mostrar texto na tela, então não foi muito díficil fazer a alteração.

Quanto a PrintStream vou assistir o vídeo recomendado, apenas copiei, colei e alterei.

3.Criei o método printInfo, para não haver repitação de código.
Como ainda não vi POO, retirei o método mesmo havendo a repetição do trecho.

Está rodando o código, funcionou.

Obrigado pela ajuda e pelo link do vídeo. Vou ver para entender a criação dos arquivos de texto.

1 curtida

Exatamente.

Entendo, mas métodos não fazem parte de POO.

1 curtida

Pensei que fazia parte. Obrigado pela força!