2014-01-19 67 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類爲您提供了幾種方式來獲得從輸入流

的相關信息
相關問題