【发布时间】:2015-12-28 13:22:36
【问题描述】:
我正在尝试为每个对象分配属性。我无法修改 Sigar 库的 FileSystemUsage 类,所以我不得不创建另一个类来管理属性。
我生成对象的函数如下
private String getDiskUsage() {
try {
List<FileSystem> result = new ArrayList<FileSystem>();
org.hyperic.sigar.FileSystem[] fss = null;
fss = sig.getFileSystemList();
List<Integer> diskUsage = new ArrayList<Integer>();
String ioStat = "";
DiskMembers diskm = new DiskMembers();
for (int i = 0; i<fss.length; i++) {
FileSystem fs = fss[i];
if (fs.getType()==2) {
FileSystemUsage usage = sig.getFileSystemUsage(fs.getDirName());
if (diskm.getlastDiskCheck(i - 1) != 0) {
long diff = (nanoTime() - diskm.getlastDiskCheck(i - 1)) / 1000000;
long diffRead = usage.getDiskReadBytes() - diskm.getLastDiskRead(i - 1);
long diffWrite = usage.getDiskWriteBytes() - diskm.getlastDiskWrite(i - 1);
ioStat = String.format("(%d/%d kB/s)", diffRead / diff, diffWrite / diff);
}
diskm.setLastDiskRead(i, usage.getDiskReadBytes());
diskm.setlastDiskWrite(i, usage.getDiskWriteBytes());
diskm.setlastDiskCheck(i, nanoTime());
diskUsage.add((int) (usage.getUsePercent() * 100));
}
}
return String.format("%d%% %s", (Collections.max(diskUsage)), ioStat);
} catch (SigarException e) {
e.printStackTrace();
}
return "n/a";
}
我为管理每个对象的属性创建的类如下
class DiskMembers{
private long[] lastDiskCheck = new long[5];
private long[] lastDiskRead = new long[5];
private long[] lastDiskWrite = new long[5];
public DiskMembers(){
this.lastDiskCheck[0] = 0;
this.lastDiskRead[0] = 0;
this.lastDiskWrite[0] = 0;
}
public boolean setLastDiskRead(int i, long value){
this.lastDiskRead[i] = value;
return true;
}
public boolean setlastDiskCheck(int i,long value){
this.lastDiskCheck[i] = value;
return true;
}
public boolean setlastDiskWrite(int i,long value){
this.lastDiskWrite[i] = value;
return true;
}
public long getLastDiskRead(int i){
if (i==-1)
return this.lastDiskRead[0];
return this.lastDiskRead[i];
}
public long getlastDiskCheck(int i){
if (i==-1)
return this.lastDiskCheck[0];
return this.lastDiskCheck[i];
}
public long getlastDiskWrite(int i){
if (i==-1)
return this.lastDiskWrite[0];
return this.lastDiskWrite[i];
}
}
问题是我无法将每个对象的属性分开。我的意思是当生成对象使用时,我通过调用 diskm.getlastDiskCheck(i-1) 检查 lastDickCheck 变量。第一次它不会执行这部分代码,因为返回值为零(0)。但在那之后,我每次都会执行它,即使是不同的对象,只要它们的数组是。我想为每个(磁盘)的每个对象“使用”记录“lastdiskcheck”。
如果我更新磁盘 C 的 lastDiskCheck 变量:它也会为磁盘 D 拾取它,我不知道。
我该怎么做?
【问题讨论】:
-
为什么不创建一个 DiskMembers 数组并以这种方式对其进行跟踪?
-
如果我将它添加到循环中。它每次都会创建一个新集,我将无法获取我放入 lastdiskcheck 变量的最后一个条目。我会吗?
-
这些是数组,你是什么意思?可以举个例子吗?
-
那么,你为什么要创建一个由 5 个磁盘组成的阵列?您想为每个对象管理 5 个磁盘吗?确实我不太了解你的目标,告诉我,我想尽力帮助你。
-
不,我不想为每个对象创建五个 5 个磁盘。那是我在做什么吗?我想要的只是检查每个磁盘(C:、D:、E:)并记下它的读/写/检查时间。下次如果执行同一个磁盘,我想检查其最后一次读取/写入/检查时间以计算差异,我将其放入 ioStat 变量中。