Java priceReader方法功能异常排查及读取文件返回字符串的替代方案咨询
嘿,我一眼就发现你的问题所在了——你的方法返回初始空字符串,核心原因是字符串比较用错了方式!
原代码的问题
在Java里,==用来比较字符串时,判断的是两个字符串对象的内存引用是否相同,而不是它们的内容是否一致。哪怕clotheOrder和clotheCode的文本内容完全一样,只要不是同一个对象实例,clotheOrder == clotheCode就会返回false,导致price永远不会被赋值,最后只能返回初始的空字符串。
修复后的方法
只需要把比较逻辑改成用equals()方法(比较内容)就可以了,如果担心clotheOrder可能为null导致空指针,还可以用clotheCode.equals(clotheOrder)或者Objects.equals(clotheOrder, clotheCode)来避免:
import java.io.File; import java.io.FileNotFoundException; import java.util.Objects; import java.util.Scanner; public static String priceReader(String clotheOrder) { String price = ""; try { File file = new File("src\\application\\clotheprice.txt"); Scanner scan = new Scanner(file); while (scan.hasNext()) { String clotheCode = scan.next(); String clothePrice = scan.next(); String clotheStocks = scan.next(); // 改用equals比较内容,或者用Objects.equals避免空指针 if (Objects.equals(clotheOrder, clotheCode)) { price = clothePrice; // 找到匹配项后可以直接跳出循环,提升效率 break; } } scan.close(); } catch (FileNotFoundException e) { System.out.println("Error occured."); e.printStackTrace(); } return price; }
另外加了个break,找到匹配项后就不用继续遍历文件了,能提升一点效率。
其他读取文件并返回目标字符串的实现方式
如果想换一种写法,这里给你几种常用的原生Java实现:
1. 使用BufferedReader逐行读取
适合处理较大的文件,逐行读取内存占用更低:
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public static String priceReaderWithBufferedReader(String clotheOrder) { String price = ""; String line; try (BufferedReader br = new BufferedReader(new FileReader("src\\application\\clotheprice.txt"))) { while ((line = br.readLine()) != null) { // 按空格分割每行的内容 String[] parts = line.split("\\s+"); if (parts.length >= 3 && Objects.equals(clotheOrder, parts[0])) { price = parts[1]; break; } } } catch (IOException e) { System.out.println("Error occurred."); e.printStackTrace(); } return price; }
2. 使用Java 7+的Files类读取整个文件(适合小文件)
如果你的文件不大,可以一次性把整个文件读入内存,再处理:
import java.nio.file.Files; import java.nio.file.Paths; import java.io.IOException; import java.util.List; public static String priceReaderWithFiles(String clotheOrder) { String price = ""; try { List<String> lines = Files.readAllLines(Paths.get("src\\application\\clotheprice.txt")); for (String line : lines) { String[] parts = line.split("\\s+"); if (parts.length >= 3 && Objects.equals(clotheOrder, parts[0])) { price = parts[1]; break; } } } catch (IOException e) { System.out.println("Error occurred."); e.printStackTrace(); } return price; }
3. 使用Scanner按行读取(更灵活的分隔方式)
如果你的文件每行是一条记录,也可以让Scanner按行读取,再分割处理:
import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; import java.util.Objects; public static String priceReaderWithScannerLine(String clotheOrder) { String price = ""; try (Scanner scan = new Scanner(new File("src\\application\\clotheprice.txt"))) { while (scan.hasNextLine()) { String[] parts = scan.nextLine().split("\\s+"); if (parts.length >= 3 && Objects.equals(clotheOrder, parts[0])) { price = parts[1]; break; } } } catch (FileNotFoundException e) { System.out.println("Error occurred."); e.printStackTrace(); } return price; }
内容的提问来源于stack exchange,提问作者Augustus Moran
相关产品推荐
相关产品推荐

