Java使用FileReader判断文件为空时方法未定义问题求解
问题根因
- 调用
length()报错是因为FileReader类本身未定义该方法,该方法属于java.io.File类,用于获取文件的字节长度。 - 空文件判断逻辑写在
while (myFile.hasNext())循环内永远不可能执行:空文件时hasNext()会直接返回false,循环体不会触发。
修正方案
提前通过File类判断文件是否为空,将判断逻辑移到循环外部,修正后代码如下:
import java.io.File; import java.io.FileReader; import java.io.FileNotFoundException; import java.util.Scanner; // 你的其他相关import // 假设landings集合已提前初始化 List<Landing> landings = new ArrayList<>(); File dataFile = new File("LandingsData.txt"); FileReader fr = null; try { // 先判断文件是否为空 if (dataFile.length() == 0) { System.out.println("Starting with an empty system"); return; // 无需继续执行后续读取逻辑 } fr = new FileReader(dataFile); } catch (FileNotFoundException e) { System.out.println("File not found"); return; } Scanner myFile = new Scanner(fr); myFile.useDelimiter(",|\n"); while (myFile.hasNext()) { String line = myFile.next(); if (line.equals("sl")) { StrongLanding sl = new StrongLanding(); sl.setLandingId(Integer.parseInt(myFile.next())); sl.setLandingDesc(myFile.next()); sl.setNumLandings(Integer.parseInt(myFile.next())); sl.setCost(Double.parseDouble(myFile.next())); landings.add(sl); } else if (line.equals("ul")) { UltimateLanding ul = new UltimateLanding(); ul.setLandingId(Integer.parseInt(myFile.next())); ul.setLandingDesc(myFile.next()); ul.setNumLandings(Integer.parseInt(myFile.next())); ul.setCost(Double.parseDouble(myFile.next())); landings.add(ul); } } // 读取结束后关闭流避免资源泄漏 myFile.close(); try { fr.close(); } catch (IOException e) { e.printStackTrace(); }
补充说明
如果需要兼容「文件有内容但全是空白字符、无有效业务数据」的场景,可以去掉提前判断文件长度的逻辑,在循环结束后判断landings集合是否为空即可:
// 循环读取逻辑结束后新增 if (landings.isEmpty()) { System.out.println("Starting with an empty system"); }
内容的提问来源于stack exchange,提问作者JakeStillone
相关产品推荐
相关产品推荐

