Hay muchas publicaciones de personas que usan == en lugar de iguales, pero esta no es una de ellas.
Estoy leyendo una lista de códigos de un archivo CSV asegurándome de que sean iguales a un literal de cadena.
Fila de ejemplo de CSV:
Después de leer cada código, recorto y llamo a toUpper() antes de colocarlos dentro de un mapa.
private final Map<String, Code> codeMap = new HashMap<>(); private void loadFile() { BufferedReader reader = null; try { reader = new BufferedReader(new FileReader("src/main/resources/codes.csv")); String line = null; while ((line = reader.readLine()) != null) { String[] details = line.split(","); codeMap.put(details[0].trim().toUpperCase(), new Code(details[0].trim(), details[1].trim(), details[2].trim())); } } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } }También tengo un método para recuperar un código basado en la cadena pasada:
public Tool getCodeByString(String code){ return codeMap.get(code.toUpperCase()); }Después de llenar el mapa, llamo a getCodeByString usando "CHNS" y se devuelve nulo. Miré en el mapa y vi la clave "CHNS" pero se devuelve nulo. Inmediatamente puedo decir que las matrices de bytes son diferentes.
Literal de cadena:
Clave en el mapa:
¿Alguien sabe cómo puedo arreglar esto y hacer que el valor del archivo sea igual al literal?
Parece que está leyendo un archivo UTF-8, con un carácter BOM redundante \uFEFF (bytes -2, -1).
Por lo tanto, debe descartar la lista de materiales y leer el archivo como UTF-8 (para cualquier carácter especial). Sin embargo, como FileReader lee el archivo en la codificación de plataforma predeterminada, use otra lectura.
También está leyendo de un archivo de recursos. Esto se empaquetará en la aplicación (¿jar?), por lo que no debe leerlo como un File de disco.
Files.lines usa por defecto UTF-8.
private void loadFile() { Path path = Paths.get(getClass().getResource("/codes.csv").toURI()); try (Stream<String> lines = Files.lines(path)) { lines.forEach(line -> { String[] details = line.split("\\s*,\\s*", 3); String key = details[0].replace("\uFEFF", ""); // Replace of BOM would only be needed at the file begin. codeMap.put(key.toUpperCase(), new Code(key, details[1], details[2])); }); } catch (IOException e) { e.printStackTrace(); } // Automatic close of lines. } La expresión regular de las franjas split los espacios en blanco antes y después de la coma. También limitó la división a 3 valores, por lo que el último campo puede contener comas como texto.