为了账号安全,请及时绑定邮箱和手机立即绑定

Java 属性类错误

Java 属性类错误

临摹微笑 2022-12-28 14:12:08
我有这段代码。// On a threadtry {    WatchService watcher = FileSystems.getDefault().newWatchService();    Path directory = Paths.get("properties");    WatchKey watchKey = directory.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY);    while (true) {        for (WatchEvent<?> event : watchKey.pollEvents()) {            Path changed = (Path) event.context();            if (changed.toString().equals("radar.properties")) {                System.out.println("read call:");                readProperties();            }        }        if (!watchKey.reset()) {            break;        }    }} catch (IOException e) {    FCSLogger.LOGGER.log(Level.SEVERE, "Exception while setting up WatchService", e);}// Method called by the above codeprivate void readProperties() {    try {        InputStream input = new FileInputStream(Paths.get("properties", "radar.properties").toString());        Properties prop = new Properties();        prop.load(input);        updateRate = Integer.parseInt(prop.getProperty("updateRate"));        System.out.println(updateRate);        input.close();    } catch (IOException e) {        e.printStackTrace();    }}它在第一次调用时返回正确的结果,然后阻塞整个线程。我已经隔离了这个方法中的错误,因为当没有调用这个方法时,其他一切都完美无缺。我想知道我在这里做错了什么。控制台输出快照:// First change of file:read call:10read call:10// Second change of file:read call:// I keep changing but nothing happens:
查看完整描述

1 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

它可能是readPropertiesthrows NumberFormatException,并导致您的观察线程退出。


您可以包装调用readProperties并捕获异常;这样至少观察者会在出现异常情况时继续观察。


你应该使用take, 以便观察线程阻塞。您当前的解决方案导致 100% 的 CPU 使用率。


请参阅下面修改后的代码。我添加了一个编写器线程来更新文件,并且(不出所料?)readProperties可能会失败,因为我们在写入文件时正在访问该文件。一个可能的输出是:


....

property=5000

property=null

java.lang.NumberFormatException: null

  at java.base/java.lang.Integer.parseInt(Integer.java:614)

  at java.base/java.lang.Integer.parseInt(Integer.java:770)

  at cl.ClientPoll.readProperties(ClientPoll.java:26)

  at cl.ClientPoll.run(ClientPoll.java:46)

property=6000

property=7000

....

因此在观看时,您可以: 跳过错误并继续;或使用其他API,使正在写入的文件在写入时被锁定。


示例代码


package cl;


import java.io.File;

import java.io.FileInputStream;

import java.io.FileWriter;

import java.io.IOException;

import java.io.InputStream;

import java.nio.file.FileSystems;

import java.nio.file.Path;

import java.nio.file.Paths;

import java.nio.file.StandardWatchEventKinds;

import java.nio.file.WatchEvent;

import java.nio.file.WatchKey;

import java.nio.file.WatchService;

import java.util.Properties;


public class ClientPoll extends Thread {

  private void readProperties() {

    try {

      Path path = Paths.get("radar.properties");

      InputStream input =new FileInputStream(path.toString());

      Properties prop = new Properties();

      prop.load(input);

      String property = prop.getProperty("updateRate");

      System.out.println("property="+property);

      int updateRate = Integer.parseInt(property);

//      System.out.println(updateRate);

      input.close();

    } catch (IOException e) {

      e.printStackTrace(System.out);

    }

  }


  @Override

  public void run() {

    try {

      WatchService watcher = FileSystems.getDefault().newWatchService();

      Path directory = Paths.get(".");

      WatchKey watchKey = directory.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY);

      while (true) {

        WatchKey wk = watcher.take();

        for (WatchEvent<?> event : wk.pollEvents()) {

          Path changed = (Path) event.context();

          if (changed.toString().equals("radar.properties")) {

            try {

              readProperties();

            } catch (Exception e) {

              e.printStackTrace(System.out);

            }

          }

        }

        if (!watchKey.reset()) {

          break;

        }

      }

    } catch (IOException e) {

      e.printStackTrace(System.out);

    } catch (InterruptedException e) {

      e.printStackTrace();

    }

  }


  public static void main(String[] args) {

    new ClientPoll().start();

    new Writer().start();

  }

}


class Writer extends Thread {

  @Override

  public void run() {

    try {

      for (int i=0;i<10;i++) {

        File f = new File("radar.properties");

        FileWriter fw = new FileWriter(f);

        fw.write("updateRate="+i*1000);

        fw.close();

        sleep(1000L);

      }

    } catch (Exception e) {

      e.printStackTrace(System.out);

    }

    System.out.println("exit");

    System.exit(0);

  }

}



查看完整回答
反对 回复 2022-12-28
  • 1 回答
  • 0 关注
  • 73 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信