如何在Java程序中读取和解释/ proc / acpi / battery / *?

我正在尝试编写一个java函数,从/ proc / acpi / battery / BAT0 / {state info}获取我的电池信息。
虽然只要我的电池没有插上并充满电,我确实有合理的输出,但我注意到有一个问题发生在充满电的情况下,

状态文件中的剩余容量高于info文件中的最后一个满容量值。 这两个输出是/ proc / acpi / battery / BAT0 / info

present: yes design capacity: 7800 mAh last full capacity: 5488 mAh battery technology: rechargeable design voltage: 11100 mV design capacity warning: 780 mAh design capacity low: 236 mAh cycle count: 0 capacity granularity 1: 78 mAh capacity granularity 2: 78 mAh model number: DELL PD6857 serial number: 1857 battery type: LION OEM info: SMP 

的/ proc / ACPI /电池/ BAT0 /状态

 present: yes capacity state: ok charging state: charging present rate: 2668 mA remaining capacity: 4422 mAh present voltage: 12843 mV 

问题是,当我完全充电时,我的剩余容量是7800mAh,这是我的devise容量,但是当从AC中取出时,剩余容量下降,并且我的传输率跳跃,使剩余容量等于或低于我的最后满容量。

问题是如何解决决定权力的问题。

根据这两个文件中的信息,我如何使用java创build一个定时器,以确定电池剩余电量的剩余时间,以及在电池电量耗尽之前剩下的时间。

这里是我在java代码中的函数。

 public static int currentCharge(){ double currentPercent=0; int lastFullCapacityInt=0; int remainingCapacityInt=0; try{ BufferedReader infoIn=new BufferedReader(new InputStreamReader(new FileInputStream(batteryInfo))); BufferedReader stateIn=new BufferedReader(new InputStreamReader(new FileInputStream(batteryState))); //first get "last full capacity" from info file. String lastFullCapacity=""; while((lastFullCapacity=infoIn.readLine())!=null){ if(lastFullCapacity.contains("last full capacity")){ String[] s=lastFullCapacity.split(":"); String p=s[1].trim(); String[] pp=p.split(" "); String ppp=pp[0].trim(); lastFullCapacityInt=Integer.parseInt(ppp); } } infoIn.close(); //get current capacity from state file String remainingCapacity=""; while((remainingCapacity=stateIn.readLine())!=null){ if(remainingCapacity.contains("remaining capacity")){ String[] s=remainingCapacity.split(":"); String p=s[1].trim(); String[] pp=p.split(" "); String ppp=pp[0].trim(); remainingCapacityInt=Integer.parseInt(ppp); } } stateIn.close(); } catch(Exception e){ } currentPercent=(((double)remainingCapacityInt/lastFullCapacityInt)*100); int c=(int)currentPercent; double d=(currentPercent-c)*100; if(((int)d)>50) c+=1; System.out.println(currentPercent); return (c); } 

只是想在电池充满电时添加/ proc / acpi / battery / BAT0 / state文件,这样每个人都可以看到我在说什么。

 present: yes capacity state: ok charging state: charged present rate: 1 mA remaining capacity: 7800 mAh present voltage: 13010 mV 

接下来的读数是从交stream电源取下后约20秒

 present: yes capacity state: ok charging state: discharging present rate: 1993 mA remaining capacity: 5456 mAh present voltage: 12650 mV 

您可能会误读信息文件的内容。 present rateremaining capacity不是以相同的单位来衡量的 – 前者是以毫安为单位的放电率,后者是以毫安小时为单位的容量。 (如果我们采取当前的距离,这相当于每小时英里数)。

因此,在给定排放率和剩余容量的情况下,通过将容量除以速率,可以得到预计的“空时间” 因为这两个值是以毫安小时和毫安测量的,结果是几小时。 使用您的上一个信息文件作为示例,例如:

 capacity = 5456 (mAh) rate = 1993 (mA) time left = 5456 / 1993 = 2.73 (hours) 

至于为什么拔下机器时剩余容量会突然下降,那么您可能是电池电量不足,或者机器的电池电量测量不准确。