使用 Sigar 获取磁盘列表以在 Java 中免费读取 space
Get a list of disks to read free space in Java, using Sigar
我需要为系统中的所有磁盘或所有分区获取可用的可用磁盘 space,我不介意。 (我不必使用 Sigar,但我已经在项目中将其用于其他一些流程,因此我也可以将其用于此目的)
我正在使用 Sigar API 并得到了这个
public double getFreeHdd() throws SigarException{
FileSystemUsage f= sigar.getFileSystemUsage("/");
return ( f.getAvail());
}
但这只给我系统分区(root),我怎样才能得到所有分区的列表并循环它们以获得它们的空闲 space?
我试过了
FileSystemView fsv = FileSystemView.getFileSystemView();
File[] roots = fsv.getRoots();
for (int i = 0; i < roots.length; i++) {
System.out.println("Root: " + roots[i]);
}
但它只有 returns 根目录
Root: /
谢谢
编辑
看来我可以使用
FileSystem[] fslist = sigar.getFileSystemList();
但是我得到的结果与我从终端获得的结果不匹配。另一方面,在我正在使用的这个系统上,我有 3 个磁盘,总共有 12 个分区,所以我可能会在那里丢失一些东西。将在其他系统上尝试它,以防我能从结果中得到一些有用的东西。
您可以使用 java.nio.file.FileSystems
获取 java.nio.file.FileStorages
的列表,然后查看 usable/available space。每个实例(假设您使用的是 Java 7+):
import java.io.IOException;
import java.nio.file.FileStore;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.util.function.Consumer;
public static void main(String[] args) {
FileSystem fs = FileSystems.getDefault();
fs.getFileStores().forEach(new Consumer<FileStore>() {
@Override
public void accept(FileStore store) {
try {
System.out.println(store.getTotalSpace());
System.out.println(store.getUsableSpace());
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
此外,请记住 FileStore.getUsableSpace()
returns 大小(以字节为单位)。有关详细信息,请参阅文档。
我们广泛使用 SIGAR 进行跨平台监控。这是我们用来获取文件系统列表的代码:
/**
* @return a list of directory path names of file systems that are local or network - not removable media
*/
public static Set<String> getLocalOrNetworkFileSystemDirectoryNames() {
Set<String> ret = new HashSet<String>();
try {
FileSystem[] fileSystemList = getSigarProxy().getFileSystemList();
for (FileSystem fs : fileSystemList) {
if ((fs.getType() == FileSystem.TYPE_LOCAL_DISK) || (fs.getType() == FileSystem.TYPE_NETWORK)) {
ret.add(fs.getDirName());
}
}
}
catch (SigarException e) {
// log or rethrow as appropriate
}
return ret;
}
然后您可以将其用作其他 SIGAR 方法的输入:
FileSystemUsage usageStats = getSigarProxy().getFileSystemUsage(fileSystemDirectoryPath);
getSigarProxy()
只是一个方便的基本方法:
// The Humidor handles thread safety for a single instance of a Sigar object
static final private SigarProxy sigarProxy = Humidor.getInstance().getSigar();
static final protected SigarProxy getSigarProxy() {
return sigarProxy;
}
我需要为系统中的所有磁盘或所有分区获取可用的可用磁盘 space,我不介意。 (我不必使用 Sigar,但我已经在项目中将其用于其他一些流程,因此我也可以将其用于此目的) 我正在使用 Sigar API 并得到了这个
public double getFreeHdd() throws SigarException{
FileSystemUsage f= sigar.getFileSystemUsage("/");
return ( f.getAvail());
}
但这只给我系统分区(root),我怎样才能得到所有分区的列表并循环它们以获得它们的空闲 space? 我试过了
FileSystemView fsv = FileSystemView.getFileSystemView();
File[] roots = fsv.getRoots();
for (int i = 0; i < roots.length; i++) {
System.out.println("Root: " + roots[i]);
}
但它只有 returns 根目录
Root: /
谢谢
编辑
看来我可以使用
FileSystem[] fslist = sigar.getFileSystemList();
但是我得到的结果与我从终端获得的结果不匹配。另一方面,在我正在使用的这个系统上,我有 3 个磁盘,总共有 12 个分区,所以我可能会在那里丢失一些东西。将在其他系统上尝试它,以防我能从结果中得到一些有用的东西。
您可以使用 java.nio.file.FileSystems
获取 java.nio.file.FileStorages
的列表,然后查看 usable/available space。每个实例(假设您使用的是 Java 7+):
import java.io.IOException;
import java.nio.file.FileStore;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.util.function.Consumer;
public static void main(String[] args) {
FileSystem fs = FileSystems.getDefault();
fs.getFileStores().forEach(new Consumer<FileStore>() {
@Override
public void accept(FileStore store) {
try {
System.out.println(store.getTotalSpace());
System.out.println(store.getUsableSpace());
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
此外,请记住 FileStore.getUsableSpace()
returns 大小(以字节为单位)。有关详细信息,请参阅文档。
我们广泛使用 SIGAR 进行跨平台监控。这是我们用来获取文件系统列表的代码:
/**
* @return a list of directory path names of file systems that are local or network - not removable media
*/
public static Set<String> getLocalOrNetworkFileSystemDirectoryNames() {
Set<String> ret = new HashSet<String>();
try {
FileSystem[] fileSystemList = getSigarProxy().getFileSystemList();
for (FileSystem fs : fileSystemList) {
if ((fs.getType() == FileSystem.TYPE_LOCAL_DISK) || (fs.getType() == FileSystem.TYPE_NETWORK)) {
ret.add(fs.getDirName());
}
}
}
catch (SigarException e) {
// log or rethrow as appropriate
}
return ret;
}
然后您可以将其用作其他 SIGAR 方法的输入:
FileSystemUsage usageStats = getSigarProxy().getFileSystemUsage(fileSystemDirectoryPath);
getSigarProxy()
只是一个方便的基本方法:
// The Humidor handles thread safety for a single instance of a Sigar object
static final private SigarProxy sigarProxy = Humidor.getInstance().getSigar();
static final protected SigarProxy getSigarProxy() {
return sigarProxy;
}