Back to site

Чытайце зменныя асяроддзя з дадатку

УВАГА: JDK1.5 або лепш забяспечвае просты спосаб для дасягнення гэтай мэты, убачыць гэта HowTo.

JDK да 1,4
Пачатак JVM з "D-" выключальнік прайсці уласцівасцяў прыкладанняў і чытаць іх з System.getProperty () метад.

 SET MyVar = Прывітанне, свет
SET myothervar = нічога
Java-Dmyvar = "%% MyVar"-Dmyothervar = "%% myothervar" MyClass
Затым у MyClass
 String MyVar = System.getProperty ("MyVar");
String myothervar = System.getProperty ("myothervar");

Калі вы не ведаеце загадзя, імя зменнай, перадаваныя JVM, то няма 100% Java спосаб атрымаць іх.


Адзін падыход (не самы просты), заключаецца ў выкарыстанні выкліку JNI для вымання зменных гл. у гэтым HowTo.


Больш за нізкім узроўнем тэхналогій дарэчы, для запуску адпаведных выклік аперацыйнай сістэмы і захопу выхад. Наступны фрагмент ставіць усё зменныя асяроддзя ў класе ўласцівасці і адлюстравання значэння зменных TEMP.

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

public class ReadEnv {
 public static Properties getEnvVars() throws Throwable {
  Process p = null;
  Properties envVars = new Properties();
  Runtime r = Runtime.getRuntime();
  String OS = System.getProperty("os.name").toLowerCase();
  // System.out.println(OS);
  if (OS.indexOf("windows 9") > -1) {
    p = r.exec( "command.com /c set" );
    }
  else if ( (OS.indexOf("nt") > -1)
         || (OS.indexOf("windows 2000") > -1 )
         || (OS.indexOf("windows xp") > -1) ) {
    // thanks to JuanFran for the xp fix!
    p = r.exec( "cmd.exe /c set" );
    }
  else {
    // our last hope, we assume Unix (thanks to H. Ware for the fix)
    p = r.exec( "env" );
    }
  BufferedReader br = new BufferedReader
     ( new InputStreamReader( p.getInputStream() ) );
  String line;
  while( (line = br.readLine()) != null ) {
   int idx = line.indexOf( '=' );
   String key = line.substring( 0, idx );
   String value = line.substring( idx+1 );
   envVars.setProperty( key, value );
   // System.out.println( key + " = " + value );
   }
  return envVars;
  }

  public static void main(String args[]) {
   try {
     Properties p = ReadEnv.getEnvVars();
     System.out.println("the current value of TEMP is : " +
        p.getProperty("TEMP"));
     }
   catch (Throwable e) {
     e.printStackTrace();
     }
   }
}
дзякуючы w.rijnders для w2k выправіць.
Абнаўленне з Ван Лі:

Я знайшоў, што, на Windows 2003 Server, значэнне ўласцівасці для "os.name" на самай справе "Windows 2003". Так што альбо, што павінен быць дададзены ў кучу тэстаў або проста адпачыць параўнання радкоў няшмат:

  
else if ( (OS.indexOf("nt") > -1)
  || (OS.indexOf("windows 2000") > -1 )
  || (OS.indexOf("windows 2003") > -1 )  / / OK / / але з улікам асаблівага 2003
  || (OS.indexOf("windows xp") > -1) ) {
 
  

else if ( (OS.indexOf("nt") > -1)
  || (OS.indexOf("windows 20") > -1 ) / / Лепш, / / ​​так як ніякая іншая АС будзе / / вяртае "Windows"
  || (OS.indexOf("windows xp") > -1) ) {
Я пачаў з "Windows 200", але думкі "Што, чорт вазьмі" і зрабіў гэта "Windows 20", каб падоўжыць яго longivity. Вы можа падштурхнуць яго далей і выкарыстоўваць "вокны 2", я мяркую. Адзінае, каб не ўпусціць, каб не перасякацца з "Windows 9."

У Windows, папярэдне JDK 01/02 JVM мае праблемы з чытаннем у выхадны паток непасрэдна з набору камандаў, ён ніколі не вяртаецца. Вось 2 спосабу абысці гэта паводзіны.

Па-першае, замест выкліку непасрэдна набор каманд, мы выкарыстоўваем BAT файлаў, пасля каманды SET мы друкуем вядомыя радкі. Тады, у Java, калі мы чытаем гэтай вядомай радкі, мы выходзім з цыклу.

[env.bat]
@set
@echo **end

[java]
...
  if (OS.indexOf("windows") > -1) {
    p = r.exec( "env.bat" );
    }
...

  while( (line = br.readLine()) != null ) {
   if (line.indexOf("**end")>-1) break;
   int idx = line.indexOf( '=' );
   String key = line.substring( 0, idx );
   String value = line.substring( idx+1 );
   hash.put( key, value );
   System.out.println( key + " = " + value );
   }

Іншае рашэнне накіраваць вынік выканання каманды SET ў файл, а затым прачытаць файл з Java.
...
if (OS.indexOf("windows 9") > -1) {
    p = r.exec( "command.com /c set > envvar.txt" );
    }
else if ( (OS.indexOf("nt") > -1)
       || (OS.indexOf("windows 2000") > -1
       || (OS.indexOf("windows xp") > -1) ) {
    // thanks to JuanFran for the xp fix!
    p = r.exec( "cmd.exe /c set > envvar.txt" );
    }
...

// then read back the file
Properties p = new Properties();
      p.load(new FileInputStream("envvar.txt"));
Дзякуючы JP Daviau

// UNIX
public Properties getEnvironment() throws java.io.IOException {
    Properties env = new Properties();
    env.load(Runtime.getRuntime().exec("env").getInputStream());
    return env;
    }

Properties env = getEnvironment();
String myEnvVar = env.get("MYENV_VAR");

Каб прачытаць толькі адну зменную:

// NT version, adaptation for other OS is left as an exercise...
Process p = Runtime.getRuntime().exec("cmd.exe /c echo %MYVAR%");
BufferedReader br = new BufferedReader
     ( new InputStreamReader( p.getInputStream() ) );
String myvar = br.readLine();
System.out.println(myvar);

Java-Уласцівасці сістэмы ўтрымоўвае некаторую карысную інфармацыю аб навакольным асяроддзі, напрыклад, TEMP і зменныя асяроддзя PATH (на Windows).
public class ShowSome {
  public static void main(String args[]){
    System.out.println("TEMP : " 
      + System.getProperty("java.io.tmpdir"));
    System.out.println("PATH : " 
      + System.getProperty("java.library.path"));
    System.out.println("CLASSPATH : " 
      + System.getProperty("java.class.path"));
    System.out.println("SYSTEM DIR : " +
       System.getProperty("user.home")); // ex. c:\windows on Win9x
    System.out.println("CURRENT DIR: "  
      + System.getProperty("user.dir"));
    }
  }
Вось некаторыя парады ад Н. харчовы пра шлях на розных АС.

Шлях не зусім тое ж самае, як шлях да бібліятэкі. У Unix, яны зусім розныя --- бібліятэкі звычайна маюць свае ўласныя каталогі.

System.out.println("the current value of PATH is:  {" +
    p.getProperty("PATH")+"}");

System.out.println("LIBPATH:  {" +
   System.getProperty("java.library.path")+"}");
gives
the current value of PATH is:
{/home/hware/bin:/usr/local/bin:/usr/xpg4/bin:/opt/SUNWspro/bin:
 /usr/ucb:/bin:/usr/bin:/home/hware/linux-bin:/usr/openwin/bin/:
 /usr/local/games:/usr/ccs/lib/:/usr/new:/usr/sbin/:/sbin/:
 /usr/openwin/lib:/usr/X11/bin:/usr/bin/X11/:/usr/local/bin/X11:
 /usr/bin/pbmplus:/usr/etc/:/usr/dt/bin/:/usr/lib:
 /usr/lib/nis:/usr/share/bin:/usr/share/bin/X11:
 /home/hware/work/cdk/main/cdk/../bin:.}
LIBPATH:
{/usr/lib/j2re1.3/lib/i386:/usr/lib/j2re1.3/lib/i386/native_threads:
/usr/lib/j2re1.3/lib/i386/client:/usr/lib/j2sdk1.3/lib/i386:/usr/lib:/lib}

на маім Linux Workstation. (Java дадаў ўсіх тых, за выключэннем / Lib і / USR / Lib). Але гэтыя дзве лініі не тое ж самае на акне альбо:

Гэтая сістэма Windows NT

the current value of PATH is:
{d:\OrbixWeb3.2\bin;D:\jdk1.3\bin;c:\depot\cdk\main\cdk\bin;c:\depot\
cdk\main\cdk\..\bin;d:\OrbixWeb3.2\bin;D:\Program
Files\IBM\GSK\lib;H:\pvcs65\VM\win32\bin;c:\cygnus
\cygwin-b20\H-i586-cygwin32\bin;d:\cfn\bin;D:\orant\bin;
C:\WINNT\system32;C:\WINNT;
d:\Program Files\Symantec\pcAnywhere;
C:\Program Files\Executive Software\DiskeeperServer\;}
LIBPATH:
{D:\jdk1.3\bin;.;C:\WINNT\System32;C:\WINNT;D:\jdk1.3\bin;
c:\depot\cdk\main\cdk\bin;c:\depot\cdk\main\cdk\..\bin;
d:\OrbixWeb3.2\bin;D:\Program Files\IBM\GSK\lib;
H:\pvcs65\VM\win32\bin;c:\cygnus\cygwin-b20\H-i586-cygwin32\bin;d:\cfn\bin;
D:\orant\bin;C:\WINNT\system32;
C:\WINNT;C:\Program Files\Dell\OpenManage\ResolutionAssistant\Common\bin;
d:\Program Files\Symantec\pcAnywhere;
C:\Program Files\Executive Software\DiskeeperServer\;}
Java з'яўляецца папярэднічаючы сам! Гэта бянтэжыла мяне --- і зламаў Exec ад мурашкі.Popular Links
Published (Last edited): Apr 8 , source: http://www.rgagnon.com/javadetails/java-0150.html