在java中有一种方法可以判断文件所在的物理计算机是什么吗?

时间:2015-07-07 02:51:46

标签: java file-io

我有一个由我们公司的多个人运营的日食RCP产品。所有PC都运行某些版本的Windows。我们可以访问不同人已映射到不同驱动器号的共享PC。这意味着可以以许多不同的方式引用相同的文件,这取决于运行程序的PC。 E.g。

  • \ communalPC \共享\ foo.txt的
  • Y:\共享\ foo.txt的
  • Z:\共享\ foo.txt的

我想以编程方式检查通用PC上是否有任意文件。有没有一种强大的方法在java中执行此操作?

我们目前的解决方案有点黑客由于人们映射到不同的驱动器号,更改驱动器号,不便携等等,它不健壮。

private static boolean isOnCommunalPc(File file) {
    if(file.getAbsolutePath().toLowerCase().startsWith("\\\\communalPC")) {
        return true;
    }

    if(file.getAbsolutePath().toLowerCase().startsWith("y:")){
        return true;
    }

    if(file.getAbsolutePath().toLowerCase().startsWith("z:")){
       return true;
    }

    return false;
}

1 个答案:

答案 0 :(得分:3)

Java无法区分文件所在的机器,因为Windows将该层从JVM中抽象出来。但是,您可以明确表达您的联系。

您是否有理由在公共电脑上没有ftp或http服务器(甚至是自定义Java服务器!),并通过主机名或IP访问它?这样,用户映射网络驱动器的位置并不重要,您通过静态地址连接。

使用Java访问远程文件非常简单:

URL remoteUrl = new URL(String.format("%s/%s", hostName, fileName));
InputStream remoteInputStream remoteUrl.openConnection().getInputStream();
//copyStreamToFile(remoteInputStream, new File(destinationPath), false);

如果您希望文件对于您不希望更改的库或代码是本地文件,则可以:

void copyStreamToFile(InputStream in, File outputFile, boolean doDeleteOnExit) {
    //Clean up file after VM exit, if needed.
    if(doDeleteOnExit)
        outputFile.deleteOnExit();
    FileOutputStream outputStream = new FileOutputStream(outputFile);
    ReadableByteChannel inputChannel = Channels.newChannel(in);
    WritableByteChannel outputChannel = Channels.newChannel(outputStream);
    ChannelTools.fastChannelCopy(inputChannel, outputChannel);
    inputChannel.close();
    outputChannel.close()
}

编辑使用JCIFS通过Samba访问远程文件非常简单:

domain = ""; //Your domain, only set if needed.
NtlmPasswordAuthentication npa = new NtlmPasswordAuthentication(domain, userName, password);
SmbFile remoteFile =  new SmbFile(String.format("smb://%s/%s", hostName, fileName), npa);
//copyStreamToFile(new SmbFileInputStream(remoteFile), new File(destinationPath), false)

这可能是最实用的解决方案,因为它需要Windows服务器上的最少工作量。这将插入Windows中的现有服务器框架,而不是安装更多。