Aprendendo a classe FILE erro de acesso

Bom dia pessoal, estou fazendo um curso pela a UDEMY e estou com dificuldade para fazer o exercício proposto pelo professor que consiste em pegar arquivos .csv e instanciar um produto em uma lista.

código

package application;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Scanner;
import model.entities.Product;

public class Program {
    public static void main(String[] args)
    {
        Locale.setDefault(Locale.US);
        List<Product> list = new ArrayList();
        
        Scanner sc = new Scanner(System.in);
        System.out.print("Enter folder path: ");
        String strPath = sc.nextLine();
        
        File file = new File(strPath);
        String sourceFileStr = file.getParent();
        
        try(BufferedReader br = new BufferedReader(new FileReader(sourceFileStr)))
        {
            String productFile = br.readLine();
            while(productFile != null)
            {
                String[] productInfo = productFile.split(",");
                String name = productInfo[0];
                double price = Double.parseDouble(productInfo[1]);
                int quantity = Integer.parseInt(productInfo[2]);
                
                list.add(new Product(name, price, quantity));
            }
            
        }
        catch (IOException e)
        {
            System.out.println("Error:" + e.getMessage());
        }            
    }    
}

Erro :

run:
Enter folder path: C:\Users\User\Desktop\shop
Error:C:\Users\User\Desktop (Acesso negado)
BUILD SUCCESSFUL (total time: 1 second)

Quando tento ler o arquivo .csv ele lê normalmente através do código:

package test;

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

public class TEST {
    public static void main(String[] args) throws FileNotFoundException
    {
        String path = "C:\\Users\\User\\Desktop\\shop\\iphonex.csv";
        
        try (BufferedReader br = new BufferedReader(new FileReader(path)))
        {
            String line = br.readLine();
            while (line != null)
            {
                System.out.println(line);
                line = br.readLine();
            }
        }        
        catch (IOException e)
        {
            System.out.println("Error: " + e.getMessage());
        }      
    }   
}

O que ocorre é que você está passando o caminho do diretório. Tente passar o caminho do arquivo.

O seu readLine() tem que esta no while, se não vai ler sempre a mesma linha.

E está

Oh foi mal não percebi sua declaração pois normalmente faço assim:

while(line = br.readLine() != null)

Mas no seu primeiro código vc não declarou

Muitos validadores de código identificam essa abordagem como errada.

O que seria um validador de código, não conheço kkk

Existem ferramentas que, a partir de uma configuração (em geral, um arquivo xml), varrem o código fonte do projeto (e o projeto) e identificam elementos que estão em desacordo com as boas práticas de programação (SOLID, KISS, clean code, etc).
Existem vários, uns mais abrangentes, outros menos. Um dos mais conhecidos é o sonarqube.
Essas ferramentas auxiliam no processo de desenvolvimento, uma vez que indicam pontos em que os programadores falham (nomes de classes, atributos, métodos. Quantidade de parâmetros por método, quantidade de linhas num método, quantidade de linhas em uma classe, atribuição de valores nulos, lançamento de exceções e uma infinidade de outras regras que, seguidas a risca, deixam o código mais legível e profissional)

1 curtida

darlan_machado é isso mesmo, muito obrigado.
Meu professor de matemática vivia dizendo leitura e interpretação… Eu preciso melhor isso.

O exercício pedia apenas um arquivo .csv para leitura, eu estava fazendo 3, por isso botei a o diretório não o arquivo .csv.
Para ler os arquivos eu teria que sempre colocar o destino do caminho? não teria como eu passar o diretório e ele pegar todos os arquivos .csv?

Para isso, você precisaria instanciar o diretório como um file e validar se o mesmo é um diretório (invocando o método isDirectory da classe File).
Então, você pega a lista de arquivos dentro dele, através do método listFiles da classe File.

File diretorio = new File("C:\\caminho\\para\\o\\diretorio");
if(diretorio.isDirectory()) {
    File[] arquivos = diretorio.listFiles();
    for(File arquivo : arquivos) {
        System.out.println("Arquivo: " + arquivo.getName());
    }
}