2014-01-19 36 views
3

我一直在尝试这段代码,但我不知道输出是不是序列号(SN)。结果只包含没有字母的数字。我想知道,它必须是数字和字母之间的结合。使用java获取计算机中硬盘的真实序列号

下面是代码:

import java.io.File; 
import java.io.FileWriter; 
import java.io.BufferedReader; 
import java.io.InputStreamReader; 

public class DiskUtils { 
    private DiskUtils() { } 

    public static String getSerialNumber(String drive) { 
     String result = ""; 
     try { 
      File file = File.createTempFile("realhowto",".vbs"); 
      file.deleteOnExit(); 
      FileWriter fw = new java.io.FileWriter(file); 

      String vbs = "Set objFSO = CreateObject(\"Scripting.FileSystemObject\")\n" 
         +"Set colDrives = objFSO.Drives\n" 
         +"Set objDrive = colDrives.item(\"" + drive + "\")\n" 
         +"Wscript.Echo objDrive.SerialNumber"; // see note 
      fw.write(vbs); 
      fw.close(); 
      Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath()); 
      BufferedReader input = 
       new BufferedReader 
       (new InputStreamReader(p.getInputStream())); 
      String line; 
      while ((line = input.readLine()) != null) { 
       result += line; 
      } 
      input.close(); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
     return result.trim(); 
    } 

    public static void main(String[] args){ 
     String sn = DiskUtils.getSerialNumber("C"); 
     javax.swing.JOptionPane.showConfirmDialog((java.awt.Component) 
      null, sn, "Serial Number of C:", 
      javax.swing.JOptionPane.DEFAULT_OPTION); 
    } 
} 

然后,我还试图证明真正的SN可能是真实的(包含数字和字母)。 这里是我开始检查硬盘的真正SN教程:

  1. 打开一个命令提示符窗口(开始菜单>所有程序>附件>命令提示符)。
  2. 输入:vol。
  3. 卷序列号是磁盘序列号。

代码和教程之间的结果有很大的不同。 你们知道,哪一个是真的?以及如何证明这一点?

+2

这似乎是Windows Power Shell特定的方法(并且这可能足以满足您的需求),您获得的输出类型是什么类型?为什么不直接执行和解析'vol'命令的结果? –

+0

我想知道JAVA的正确代码如何在计算机上获取硬盘的SN。 – user3198020

回答

1

你可能想尝试沿着这行更多的东西:

import java.io.*; 

public class SerialNumber 
{ 
    public String executeVolCommand() 
    { 
    String NEWLINE = System.getProperty("line.separator"); 
    StringBuffer buffer = new StringBuffer(); 
    try{ 

     Process pb = new ProcessBuilder("cmd","/c", "vol").start(); 
     InputStream in = pb.getInputStream(); 
     BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
     String line; 
     while ((line = br.readLine()) != null) { 
     buffer.append(line + NEWLINE); 
     } 
    } 
    catch(Exception e){e.printStackTrace();} 
    return buffer.toString();  } 
} 

然后,一旦你有了结果,你可以分析它的实际序列号。希望这可以帮助。

+0

谢谢,这真的很有帮助。但是,我仍然想知道哪一个是硬盘的正确SN? – user3198020

+1

由于您没有发布您的脚本文件的内容,我们不能推断它在做什么。此外,vol命令创建的序列号是在驱动器初始格式化时由OS生成的软件。这不是实际的制造商序列号。检出:http://en.wikipedia.org/wiki/Volume_serial_number我读过的其他帖子解释了这一点。我不认为真的有一个确定的方式来获得制造商的序列号。这可能需要进一步调查。 – Alan

0

如果你还想要的答案...

import java.io.*; 
import java.util.*; 

public class SerialNumber { 

public static void main (String[] args) throws Exception { 

     Process p = Runtime.getRuntime().exec ("ioreg -l"); 
     InputStream is = p.getInputStream(); 
     StringBuilder sb = new StringBuilder(); 
     int i = 0; 
     while ((i = is.read()) != -1) if ((char) i != '|' && (char) i != ' ') sb.append ((char) i); 
     InputStream fis = new ByteArrayInputStream (sb.toString().getBytes()); 
     Properties pro = new Properties(); 
     pro.load (fis); 
     System.out.println (pro.get ("\"IOPlatformSerialNumber\"").toString().substring (1, pro.get ("\"IOPlatformSerialNumber\"").toString().length() - 1)); 

    } 

} 

我正在的Mac OSX 10.10

+0

因为这是Java,而前面的答案是为Windows编写的,而且这是为MAC编写的,所以它确实不是很有用。 – Will

+0

@为Mac获取信息非常有用,如果需要某些适用于所有平台的东西,则需要为每个支持的平台提供代码。 – AmanicA

+0

因为OP明显运行Windows,所以对OP来说确实没有什么帮助。 – EJP

0
// InputStream stream = Runtime.getRuntime().exec("wmic diskdrive get name,size,model,SerialNumber ").getInputStream(); 
    List<String> collect; 
    InputStream stream = Runtime.getRuntime().exec("wmic diskdrive get SerialNumber ").getInputStream(); 

    try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream))) { 

    collect = reader.lines().collect(Collectors.toList()); 
     /*while ((line = reader.readLine()) != null) { 
     model += line; 
     }*/ 
    } 

注:BufferedReader类为您提供了几种方式来获得从输入流

的相关信息