使用openStream()与PrintWriter读取网站数字写入txt文件为空求助
我完全懂你现在的困扰——跟着书本代码尝试读取网站上的数字求和,再写入到txt文件里,但输出文件始终是空的。结合你给出的代码片段和这类场景的常见问题,我整理了几个最可能的原因和对应的解决办法:
Scanner没正确从HTML页面中提取数字
math.com的页面是HTML结构,直接用默认的Scanner读取的话,会拿到一堆HTML标签、普通文本,默认的分隔符根本没法精准识别出数字。比如你如果直接用input.nextInt(),很可能因为数字被其他内容包裹,根本没读到任何数字,求和结果为0,或者直接抛出异常导致后续写入步骤没执行。
解决办法:先把页面内容完整读取成字符串,再用正则表达式提取所有数字:// 读取页面内容为字符串 String pageContent = new String(pageLocation.openStream().readAllBytes(), StandardCharsets.UTF_8); // 匹配所有数字 Pattern numPattern = Pattern.compile("\\d+"); Matcher numMatcher = numPattern.matcher(pageContent); int total = 0; while (numMatcher.find()) { total += Integer.parseInt(numMatcher.group()); }PrintWriter未刷新或关闭
PrintWriter是带缓冲区的,如果写完内容后没有调用flush()手动刷新,或者没有关闭流,缓冲区里的内容可能不会被写入到文件中,尤其是程序直接结束的话,缓冲内容会直接丢失。
解决办法:要么手动刷新+关闭,要么用try-with-resources语法自动管理流(更推荐,避免遗漏关闭):// 手动关闭的写法 PrintWriter writer = new PrintWriter("sum_result.txt"); writer.println("数字总和:" + total); writer.flush(); // 强制把缓冲内容写入文件 writer.close(); // 关闭流释放资源 // try-with-resources自动关闭的写法(更安全) try (PrintWriter autoWriter = new PrintWriter("sum_result.txt")) { autoWriter.println("数字总和:" + total); } catch (IOException e) { e.printStackTrace(); }网站内容读取失败(网络/协议问题)
你用的是http://www.math.com/,现在很多网站已经强制跳转HTTPS了,用HTTP请求可能会拿到重定向页面的内容,根本没有你要的数字;另外如果网络连接失败、网站返回错误码,openStream()会抛出IOException,而你的代码直接throws IOException,程序会直接终止,根本走不到写入步骤。
解决办法:- 把URL改成
https://www.math.com/试试; - 给读取逻辑加上异常捕获,排查是否读取失败:
try (InputStream stream = pageLocation.openStream()) { // 这里写读取、提取数字的逻辑 } catch (IOException e) { System.out.println("读取网站内容出错:" + e.getMessage()); e.printStackTrace(); }- 把URL改成
代码逻辑未执行到写入步骤
比如Scanner读取时陷入死循环,或者判断条件错误,导致求和完成后根本没走到写入代码的部分。可以在关键位置加调试输出,比如打印总和total的值,看看是否有正确计算出结果,再确认写入代码是否被执行。
内容的提问来源于stack exchange,提问作者mrcookepeer

