⑴ 誰能給我舉個例子RandomAccessFile類
RandomAccessFile類用處還是很大的,讀寫文件非常方便,指針又可以任意移動,這里有個寫入和讀取的例子供你參考,你可以直接拷貝去編譯和運行,慢慢體會一下:
import java.io.IOException;
import java.io.File;
import java.io.RandomAccessFile;
class RandomFileTest
{
public static void main(String[] args) throws Exception
{
Student s1=new Student(1, "zhangsan", 90.5);
Student s2=new Student(2, "lisi", 98.5);
Student s3=new Student(3, "wangwu", 96.5);
File userDir=new File(System.getProperties().getProperty("user.dir"));
File tempFile=File.createTempFile("~student", ".tmp", userDir);
tempFile.deleteOnExit();
RandomAccessFile raf=new RandomAccessFile(tempFile, "rw");
s1.write(raf);
s2.write(raf);
s3.write(raf);
raf.seek(0);
Student s=new Student();
for(long i=0;i<raf.length();i=raf.getFilePointer())
{
s.read(raf);
System.out.println("[lenth:"+raf.length()+",i="+i+"] " + s);
}
raf.close();
Thread.sleep(5000);
}
}
class Student
{
int num;
String name;
double score;
public Student()
{
}
public Student(int num, String name, double score)
{
this.num=num;
this.name=name;
this.score=score;
}
public void write(RandomAccessFile raf) throws IOException
{
raf.writeInt(num);
raf.writeUTF(name);
raf.writeDouble(score);
}
public void read(RandomAccessFile raf) throws IOException
{
num=raf.readInt();
name=raf.readUTF();
score=raf.readDouble();
}
public String toString()
{
return "num="+num+",name="+name+",score="+score;
}
}
⑵ jsp中session有哪些方法,都怎麼用
Jsp的session是使用bean的一個生存期限,一般為page,session意思是在這個用戶沒有離開網站之前一直有效,如果無法判斷用戶何時離開,一般依據系統設定,tomcat中設定為30分鍾.
我們使用seesion功能,可以達到多個jsp程序從操作同一個java bean, 那麼這個java bean可以作為我們傳統意義上的"全局變數池".(在java中我們可以使用static靜態化一個變數和方法,使用singleton唯一化對象.)
在項目實踐中,我們Jsp程序中很多參數需要從資料庫中讀取,有的參數實際讀取一次就可以,如果設計成每個用戶每產生一個頁面都要讀取資料庫,很顯然,資料庫的負載很大,同時也浪費時間,雖然可能有資料庫連接池優化,但是盡量少使用資料庫是我們編程的原則.
比如,我們的test.jsp 和test1.jsp都需要得到一個參數userdir,這個userdir是從資料庫中得知,使用session將大大優化性能,程序如下:
設計一個javabean 存儲userdir.
public class UserEnv {
private String userdir = "";
private String userurl = "";
public UserEnv(){
//構建方法初始化userdir,可以從資料庫中讀取,這里簡單給值ppp
userdir="pppp";
System.out.println("init userdir, one time");
}
public String getUserdir() throws Exception{
return userdir;
}
}
test1.jsp程序:
this is test1.jsp:
test2.jsp程序:
this is test2.jsp:
無論用戶先調用test1.jsp還是test2.jsp, java bean UserEnv總是先初始化一次, 由於這個bean存在周期是seesion,因此該用戶第二次以後只要在seesion有效期內再調用,myenv.getUserdir()將直接從bean內存中讀取變數,不必再初始化.這樣提高速度,又減少資料庫訪問量.
這樣,我們就有了一個jsp程序之間共享變數或方法 的實現辦法
⑶ JAVA中如何讀取src下所有的properties文件
最常用讀取properties文件的方法
InputStream in = getClass().getResourceAsStream("資源Name");這種方式要求properties文件和當前類在同一文件夾下面。如果在不同的包中,必須使用:
InputStream ins = this.getClass().getResourceAsStream("/cn/zhao/properties/testPropertiesPath2.properties");
Java中獲取路徑方法
獲取路徑的一個簡單實現
反射方式獲取properties文件的三種方式
1 反射方式獲取properties文件最常用方法以及思考:
Java讀取properties文件的方法比較多,網上最多的文章是"Java讀取properties文件的六種方法",但在Java應用中,最常用還是通過java.lang.Class類的getResourceAsStream(String name) 方法來實現,但眾多讀取properties文件的代碼中,都會這么做:
InputStream in = getClass().getResourceAsStream("資源Name");
這裡面有個問題,就是getClass()調用的時候默認省略了this,this是不能在static(靜態)方法或者static塊中使用的,原因是static類型的方法或者代碼塊是屬於類本身的,不屬於某個對象,而this本身就代表當前對象,而靜態方法或者塊調用的時候是不用初始化對象的。
問題是:假如不想讓某個類有對象,那麼會將此類的默認構造方法設為私有,當然也不會寫別的共有的構造方法。並且我這個類是工具類,都是靜態的方法和變數,要在靜態塊或者靜態方法中獲取properties文件,這個方法就行不通了。
其實這個類就不是這么用的,他僅僅是需要獲取一個Class對象就可以了,那就容易了,
取所有類的父類Object,用Object.class比用正在寫類自身方便安全,下面給出一個例子,以方便交流。
import java.util.Properties;
import java.io.InputStream;
import java.io.IOException;
/**
* 讀取Properties文件的例子
* File: TestProperties.java
* User: leimin
* Date: 2008-2-15 18:38:40
*/
public final class TestProperties {
private static String param1;
private static String param2;
static {
Properties prop = new Properties();
InputStream in = Object. class .getResourceAsStream( "/test.properties" );
try {
prop.load(in);
param1 = prop.getProperty( "initYears1" ).trim();
param2 = prop.getProperty( "initYears2" ).trim();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 私有構造方法,不需要創建對象
*/
private TestProperties() {
}
public static String getParam1() {
return param1;
}
public static String getParam2() {
return param2;
}
public static void main(String args[]){
System.out.println(getParam1());
System.out.println(getParam2());
}
}
運行結果:
151
152
當然,把Object.class換成int.class也行。
另外,如果是static方法或塊中讀取Properties文件,還有一種最保險的方法,就是這個類的本身名字來直接獲取Class對象,比如本例中可寫成TestProperties.class,這樣做是最保險的方法。
2 獲取路徑的方式:
File fileB = new File( this .getClass().getResource( "" ).getPath());
System. out .println( "fileB path: " + fileB);
2.2獲取當前類所在的工程名:
System. out .println("user.dir path: " + System. getProperty ("user.dir"))<span style="background-color: white;">3 獲取路徑的一個簡單的Java實現</span>
/**
*獲取項目的相對路徑下文件的絕對路徑
*
* @param parentDir
*目標文件的父目錄,例如說,工程的目錄下,有lib與bin和conf目錄,那麼程序運行於lib or
* bin,那麼需要的配置文件卻是conf裡面,則需要找到該配置文件的絕對路徑
* @param fileName
*文件名
* @return一個絕對路徑
*/
public static String getPath(String parentDir, String fileName) {
String path = null;
String userdir = System.getProperty("user.dir");
String userdirName = new File(userdir).getName();
if (userdirName.equalsIgnoreCase("lib")
|| userdirName.equalsIgnoreCase("bin")) {
File newf = new File(userdir);
File newp = new File(newf.getParent());
if (fileName.trim().equals("")) {
path = newp.getPath() + File.separator + parentDir;
} else {
path = newp.getPath() + File.separator + parentDir
+ File.separator + fileName;
}
} else {
if (fileName.trim().equals("")) {
path = userdir + File.separator + parentDir;
} else {
path = userdir + File.separator + parentDir + File.separator
+ fileName;
}
}
return path;
}
4 利用反射的方式獲取路徑:
InputStream ips1 = Enumeration . class .getClassLoader() .getResourceAsStream( "cn/zhao/enumStudy/testPropertiesPath1.properties" );
InputStream ips2 = Enumeration . class .getResourceAsStream( "testPropertiesPath1.properties" );
InputStream ips3 = Enumeration . class .getResourceAsStream( "properties/testPropertiesPath2.properties" );
⑷ Java安裝後JDK/bin目錄下的許多exe文件有什麼用途。
javac:編譯器,將Java源代碼換成位元組代
java:Java解釋器,直接從類文件執行Java應用程序代碼
appletviewer(小程序瀏覽器):一種執行HTML文件上的Java小程序類的Java瀏覽器
javadoc:根據Java源代碼及其說明語句生成的HTML文檔
jdb:Java調試器,可以逐行地執行程序、設置斷點和檢查變數
javah:產生可以調用Java過程的C過程,或建立能被Java程序調用的C過程的頭文件
Javap:Java反匯編器,顯示編譯類文件中的可訪問功能和數據,同時顯示位元組代碼含義
jar:多用途的存檔及壓縮工具,是個java應用程序,可將多個文件合並為單個JAR歸檔文件。
htmlConverter——命令轉換工具。
native2ascii——將含有不是Unicode或Latinl字元的的文件轉換為Unicode編碼字元的文件。
serialver——返回serialverUID。語法:serialver [show] 命令選項show是用來顯示一個簡單的界面。輸入完整的類名按Enter鍵或"顯示"按鈕,可顯示serialverUID。
補充詳細:
javac.exe
用法:javac <選項> <源文件>
可能的選項包括:
-g 生成所有調試信息
-g:none 生成無調試信息
-g:{lines,vars,source} 生成只有部分調試信息
-O 優化;可能妨礙調試或者增大類文件
-nowarn 生成無警告
-verbose 輸出關於編譯器正在做的信息
-deprecation 輸出使用了不鼓勵使用的API的源程序位置
-classpath <路徑> 指定用戶類文件的位置
-sourcepath <路徑> 指定輸入源文件的位置
-bootclasspath <路徑> 覆蓋自舉類文件的位置
-extdirs <目錄(多個)> 覆蓋安裝的擴展類的位置
-d <目錄> 指定輸出類文件的位置
-encoding <編碼> 指定源文件中所用的字元集編碼
-target <版本> 生成指定虛擬機版本的類文件
-help Print a synopsis of standard options
appletviewer.exe
用法:appletviewer <options> url
其中,<options> 包括:
-debug 在 Java 調試器中啟動 applet 小程序查看器
-encoding <encoding> 指定由 HTML 文件使用的字元編碼
-J<runtime flag> 向 Java 解釋器傳遞參數
-J 選項不是標准選項,如有更改,不另行通知。
====================
jar.exe
用法:jar {ctxu}[vfm0M] [jar-文件] [manifest-文件] [-C 目錄] 文件名 ...
選項:
-c 創建新的存檔
-t 列出存檔內容的列表
-x 展開存檔中的命名的(或所有的〕文件
-u 更新已存在的存檔
-v 生成詳細輸出到標准輸出上
-f 指定存檔文件名
-m 包含來自標明文件的標明信息
-0 只存儲方式;未用ZIP壓縮格式
-M 不產生所有項的清單(manifest〕文件
-i 為指定的jar文件產生索引信息
-C 改變到指定的目錄,並且包含下列文件:
如果一個文件名是一個目錄,它將被遞歸處理。
清單(manifest〕文件名和存檔文件名都需要被指定,按'm' 和 'f'標志指定的相同順序。
示例1:將兩個class文件存檔到一個名為 'classes.jar' 的存檔文件中:
jar cvf classes.jar Foo.class Bar.class
示例2:用一個存在的清單(manifest)文件 'mymanifest' 將 foo/ 目錄下的所有
文件存檔到一個名為 'classes.jar' 的存檔文件中:
jar cvfm classes.jar mymanifest -C foo/ .
javadoc.exe
用法:javadoc [options] [packagenames] [sourcefiles] [classnames] [@files]
-overview <file> 讀取 HTML 格式的概述文檔
-public 僅顯示 public 類和成員
-protected 顯示 protected/public 類和成員(預設)
-package 顯示 package/protected/public 類和成員
-private 顯示所有類和成員
-help 顯示命令行選項
-doclet <class> 通過候選 doclet 生成輸出
-docletpath <path> 指定 doclet 類文件的查找位置
-sourcepath <pathlist> 指定源文件的查找位置
-classpath <pathlist> 指定用戶類文件的查找位置
-exclude <pkglist> Specify a list of packages to exclude
-subpackages <subpkglist> Specify subpackages to recursively load
-breakiterator Compute 1st sentence with BreakIterator
-bootclasspath <pathlist> 覆蓋自舉類載入器所載入的類文件的位置
-source <release> Provide source compatibility with specified release
-extdirs <dirlist> 覆蓋已安裝的擴展的位置
-verbose 有關 Javadoc 所做工作的輸出信息
-locale <name> 所用的 Locale,例如 en_US 或 en_US_WIN
-encoding <name> 源文件編碼名稱
-J<flag> 將 <flag> 直接傳給運行時系統
由標准 doclet 提供:
-d <directory> 輸出文件的目標目錄
-use 創建類和包的用法頁
-version 包含 @version 段
-author 包含 @author 段
-docfilessubdirs Recursively doc-file subdirectories
-splitindex 將索引分為每個字母對應一個文件
-windowtitle <text> 文檔的瀏覽器窗口標題
-doctitle <html-code> 包含包索引頁(首頁)的標題
-header <html-code> 包含每一頁的頁眉文本
-footer <html-code> 包含每一頁的頁腳文本
-bottom <html-code> 包含每一頁的頁底文本
-link <url> Create links to javadoc output at <url>
-linkoffline <url> <url2> Link to docs at <url> using package list at <url2>
-excludedocfilessubdir <name1>:.. Exclude any doc-files subdirectories with given name.
-group <name> <p1>:<p2>.. Group specified packages together in overview page
-nocomment Supress description and tags, generate only declarations.
-nodeprecated 不包含 @deprecated 信息
-noqualifier <name1>:<name2>:... Exclude the list of qualifiers from the output.
-nosince Do not include @since information
-nodeprecatedlist 不生成不鼓勵使用的列表
-notree 不生成類層次
-noindex 不生成索引
-nohelp 不生成幫助鏈接
-nonavbar 不生成導航欄
-quiet Do not display status messages to screen
-serialwarn Generate warning about @serial tag
-tag <name>:<locations>:<header> Specify single argument custom tags
-taglet The fully qualified name of Taglet to register
-tagletpath The path to Taglets
-charset <charset> Charset for cross-platform viewing of generated documentation.
-helpfile <file> 包含幫助鏈接功能鏈接到目標的文件
-linksource Generate source in HTML
-stylesheetfile <path> 改變所生成文檔的樣式的文件
-docencoding <name> 輸出編碼名稱
javah.exe
用法:javah [options] <classes>
其中 [options] 包括:
-help 列印該幫助信息
-classpath <path> 類的載入路徑
-bootclasspath <path> 自舉類的載入路徑
-d <dir> 輸出目錄
-o <file> 輸出文件(僅能使用 -d 或 -o 之一)
-jni 生成 JNI 風格的頭文件(預設)
-old 生成 JDK1.0 風格的頭文件
-stubs 生成 stubs 文件
-version 列印版本信息
-verbose 輸出有關本命令所做工作的信息
-force 始終寫輸出文件
指定 <classes> 時必須使用全名(例如 java.lang.Object)。
javaw.exe
====================
HtmlConverter.exe
用法:HtmlConverter [-option1 value1 [-option2 value2 [...]]] [-simulate] [filespecs]
其中,選項包括:
-source: 獲取源文件的路徑。 預設值: <userdir>
-dest: 寫入已轉換文件的路徑。 預設值: <userdir>
-backup: 寫備份文件的路徑。 預設值: <dirname>_BAK
-f: 強制覆寫備份文件。
-subdirs: 應處理子目錄中的文件。
-template: 模板文件的路徑。 如果不確定,請使用預設值。
-log: 寫日誌的路徑。 如果沒有提供,則不會寫入任何日誌。
-progress: 轉換時顯示進度。 預設值: true
-simulate: 在沒有進行轉換時顯示特定於轉換的信息。
-latest: 使用最新的 JRE 支持發行版 mimetype。
-gui: 顯示轉換程序的圖形用戶界面。
filespecs: 用空格分開的文件說明列表。 預設值: "*.html *.htm" (需要引號)
orbd.exe
用法:orbd <選項>
其中,<選項> 包括:
-port 啟動 ORBD 的激活埠,預設值為 1049 (可選)
-defaultdb ORBD 文件的目錄,預設值為 "./orb.db" (可選)
-serverid ORBD 的伺服器標識符,預設值為 1 (可選)
-ORBInitialPort 初始埠(必需)
-ORBInitialHost 初始主機名稱(必需)
====================
policytool.exe
用法:policytool [選項]
[-file <file>] 規則文件位置
====================
rmic.exe
用法:rmic <選項> <類名>
其中 <選項> 包括:
-keep 不刪除中間生成的源文件
-keepgenerated (同 "-keep")
-v1.1 為 1.1 stub 協議版本創建 stubs/skeleton
-vcompat (預設)創建與 1.1 和
1.2 stub 協議版本兼容的 stubs/skeleton
-v1.2 僅為 1.2 stub 協議版本創建 stubs
-iiop 為 IIOP 創建 stubs。當使用該選項時,<選項>還應包括:
-always 總創建 stubs (即使在它們同時出現時〕
-alwaysgenerate (同 "-always")
-nolocalstubs 不創建為同一進程優化的 stubs
-idl 創建 IDL。當使用該選項時,<選項>還應包括:
-noValueMethods 不生成值類型的方法
-always 總創建 IDL (即使在它們同時出現時〕
-alwaysgenerate (同 "-always")
-g 一般調試信息
-depend 以遞歸方式重編譯過期的文件
-nowarn 不警告
-nowrite 不將編譯過的類寫入到文件系統
-verbose 輸出有關編譯器所做工作的信息
-classpath <path> 指定輸入源和類文件的查找位置
-sourcepath <path> 指定用戶源文件的查找位置
-bootclasspath <path> 覆蓋自舉類文件的位置
-extdirs <path> 覆蓋安裝擴展類的位置
-d <directory> 指定所生成類文件的放置位置
-J<runtime flag> 將參數傳給 java 解釋程序
====================
rmid.exe
用法:rmid <option>
其中,<option> 包括:
-port <option> 指定供 rmid 使用的埠
-log <directory> 指定 rmid 將日誌寫入的目錄
-stop 停止當前的 rmid 調用(對指定埠)
-C<runtime 標記> 向每個子進程傳遞參數(激活組)
-J<runtime 標記> 向 java 解釋程序傳遞參數
====================
rmiregistry.exe
用法: rmiregistry <選項> <埠>
其中,<選項> 包括:
-J<runtime 標記> 將參數傳遞到 java 解釋程序
====================
serialver.exe
用法:serialver [-classpath classpath] [-show] [classname...]
====================
servertool.exe
歡迎使用 Java IDL 伺服器工具
請在提示處輸入命令
servertool > help
可用命令:
-------------------
register - 注冊一個可激活的伺服器
unregister - 取消伺服器注冊
getserverid - 返回應用程序名稱的伺服器標識符
list - 列舉所有已注冊伺服器
listappnames - 列舉當前定義的應用程序名稱
listactive - 列舉當前活動的伺服器
locate - 將已注冊伺服器定位在特定類型的埠
locateperorb - 為已注冊伺服器的特定對象請求代理程序定位埠。
orblist - 對象請求代理程序 (orb) 名稱及其映射列表
shutdown - 關閉一個已注冊伺服器
startup - 啟動一個已注冊伺服器
help - 取得幫助
quit - 退出此工具
====================
rmic
功能說明:
rmic 為遠程對象生成 stub 和 skeleton。
語法:
rmic [ options ] package-qualified-class-name(s)
補充說明:
rmic 編譯器根據編譯後的 Java 類(含有遠程對象實現)名,為遠程對象生成 stub 和 skeleton(遠程對象是指實現 java.rmi.Remote 介面的對象)。在 rmic 命令中所給的類必須是經 javac 命令成功編譯且是完全包限定的類。
命令選項
-classpath[路徑] 指定 rmic 用於查詢類的路徑。如果設置了該選項,它將覆蓋預設值或 CLASSPATH 環境變數。目錄用冒號分隔。
-d[目錄] 指定類層次的根目錄。此選項可用來指定 stub 和 skeleton 文件的目標目錄。
-depend 使編譯器考慮重新編譯從其它類引用的類。 一般來說,它只重新編譯從源代碼引用的遺漏或過期的類。
-g 允許生成調試表格。調試表格含有行號和局部變數的有關信息,即 Java 調試工具所使用的信息。預設情況下,只生成行號。
-J 與 -D 選項聯用,它將緊跟其後的選項( -J 與 -D 之間無空格)傳給 java 解釋器。
-keepgenerated 為 stub 和 skeleton 文件保留所生成的 .java 源文件,並將這些源文件寫到與 .class 文件相同的目錄中,如果要指定目錄,則使用 -d 選項。
-nowarn 關閉警告。如果使用該選項,則編譯器不輸出任何警告信息。
-show 顯示 rmic 編譯器的 GUI(圖形用戶界面)。輸入一個或多個包限定類名(以空格分隔),並按回車鍵或「顯示」按鈕,創建 stub 和 skeleton。
-vcompat (預設值)創建與 JDK 1.1 和 1.2 stub 協議版本都兼容的 stub 和 skeleton。
-verbose 使編譯器和鏈接器輸出關於正在編譯哪些類和正在載入哪些類文件的信息。
-v1.1 創建 JDK 1.1 stub 協議版本的 stub 和 skeleton。
-v1.2 只創建 JDK 1.2 stub 協議版本的 stub。
=================================
rmid
功能說明:
rmid 啟動激活系統守護進程,以便能夠在 Java 虛擬機上注冊和激活對象。
語法:
rmid [-port port] [-log dir]
補充說明:
rmid 工具啟動激活系統守護進程。必須先啟動激活系統守護進程,才能向激活系統注冊可被激活的對象或在 Java 虛擬機上激活可被激活的對象。
命令選項
-C<某些命令行選項> 指定一個選項,在創建每個 rmid 的子守護進程(激活組)時,該選項以命令行參數的形式傳給該子守護進程。
-log[目錄] 指定目錄的名稱,激活系統守護進程在該目錄中寫入其資料庫及相關信息。預設狀態下,將在執行 rmid 命令的目錄中創建一個 log 目錄。
-port[埠] 指定 rmid 的注冊服務程序所使用的埠。激活系統守護進程將 ActivationSystem 與該注冊服務程序中的名稱java.rmi.activation.ActivationSystem 捆綁在一起。
-stop 停止 -port 選項所指定埠上的當前 rmid 調用。若未指定埠,則將停止在埠 1098 上運行的 rmid。
=============================
rmiregistry
功能說明:
rmiregistry 命令可在當前主機的指定埠上啟動遠程對象注冊服務程序。
語法:
rmiregistry [port]
補充說明:
rmiregistry 命令在當前主機的指定 port 上創建並啟動遠程對象注冊服務程序。如果省略 port,則注冊服務程序將在 1099 埠上啟動。rmiregistry 命令不產生任何輸出而且一般在後台運行。遠程對象注冊服務程序是自舉命名服務。主機上的 RMI 伺服器將利用它將遠程對象綁定到名字上。客戶機即可查詢遠程對象並進行遠程方法調用。注冊服務程序一般用於定位應用程序需調用其方法的第一個遠程對象。該對象反過來對各應用程序提供相應的支持,用於查找其它對象。java.rmi.registry.LocateRegistry 類的方法可用於在某台主機或主機和埠上獲取注冊服務程序操作。java.rmi.Naming 類的基於 URL 的方法將對注冊服務程序進行操作,並可用於查詢遠程對象、將簡單(字元串)名稱綁定到遠程對象、將新名稱重新綁定到遠程對象(覆蓋舊綁定)、取消遠程對象的綁定以及列出綁定在注冊服務程序上的 URL。
=============================
serialver
功能說明:
serialver 命令返回 serialVersionUID。
語法:
serialver [ 命令選項 ]
補充說明:
serialver 以適於復制到演變類的形式返回一個或多個類的 serialVersionUID。不帶參數調用時,它輸出用法行。
命令選項
-show 顯示一個簡單的用戶界面。輸入完整的類名並按回車鍵或「顯示」按鈕可顯示 serialVersionUID。
================================
jarsigner
功能說明:
為 Java 歸檔 (JAR) 文件產生簽名,並校驗已簽名的 JAR 文件的簽名。
語法:
jarsigner [ 命令選項 ] jar-file alias
jarsigner -verify [ 命令選項 ] jar-file
補充說明:
jarsigner 工具用於兩個目的:
1:為 Java 歸檔 (JAR) 文件簽名
2:校驗已簽名的 JAR 文件的簽名和完整性
命令選項
-keystore[url] 指定密鑰倉庫的 URL。預設值是用戶的宿主目錄中的 .keystore 文件,它由系統屬性「user.home」決定。
-storetype[storetype] 指定要被實例化的密鑰倉庫類型。默認的密鑰倉庫類型是安全屬性文件中 "keystore.type" 屬性值所指定的那個類型,由 java.security.KeyStore 中的靜態方法 getDefaultType 返回。
-storepass[password] 指定訪問密鑰倉庫所需的口令。這僅在簽名(不是校驗)JAR 文件時需要。在這種情況下,如果命令行中沒有提供 -storepass 選項,用戶將被提示輸入口令。
-keypass[password] 指定用於保護密鑰倉庫項(由命令行中指定的別名標出)的私鑰的口令。使用 jarsigner 為 JAR 文件簽名時需要該口令。如果命令行中沒有提供口令,且所需的口令與密鑰倉庫的口令不同,則將提示用戶輸入它。
-sigfile[file] 指定用於生成 .SF 和 .DSA 文件的基本文件名。
-signedjar[file] 指定用於已簽名的 JAR 文件的名稱。
-verify 如果它出現在命令行中,則指定的 JAR 文件將被校驗,而不是簽名。如果校驗成功,將顯示「jar verified」。如果試圖校驗未簽名的 JAR 文件,或校驗被不支持的演算法(例如未安裝 RSA 提供者時使用的 RSA)簽名的 JAR 文件,則將有如下顯示: "jar is unsigned. (signatures missing or not parsable)" 。
-certs 如果它與 -verify 和 -verbose 選項一起出現在命令行中,則輸出將包括 JAR 文件的每個簽名人的證書信息。
-verbose 如果它出現在命令行中,則代表「verbose」模式,它使 jarsigner 在 JAR 簽名或校驗過程中輸出額外信息。
-internalsf 過去,JAR 文件被簽名時產生的 .DSA(簽名塊)文件包含一個同時產生的 .SF 文件(簽名文件)的完整編碼副本。這種做法已被更改。為了減小輸出 JAR 文件的整個大小,預設情況下 .DSA 文件不再包含 .SF 文件的副本。但是如果 -internalsf 出現在命令行中,將採用舊的做法。該選項主要在測試時有用;實際上不應使用它,因為這樣將消除有用的優化。
-sectionsonly 如果它出現在命令行中,則 JAR 文件被簽名時生成的 .SF 文件(簽名文件)將不包括含有整個清單文件的散列的頭。它僅包含 與 JAR 中每個單獨的源文件相關的信息和散列。該選項主要在測試時有用;實際上不應使用它,因為這樣將消除有用的優化。
-J[javaoption] 將指定的 javaoption 串直接傳遞到 Java 解釋器。((jarsigner 實際上是解釋器的一個 「wrapper」)。該選項不應含有任何空格。它有助於調整執行環境或內存使用。要獲得可用的解釋器選項的清單,可在命令行鍵入 java -h 或 java -X。
========================
keytool
功能說明:
管理由私鑰和認證相關公鑰的 X.509 證書鏈組成的密鑰倉庫(資料庫)。還管理來自可信任實體的證書。
語法:
keytool [ 命令 ]
補充說明:
keytool 是個密鑰和證書管理工具。它使用戶能夠管理自己的公鑰/私鑰對及相關證書,用於(通過數字簽名)自我認證(用戶向別的用戶/服務認證自己)或數據完整性以及認證服務。它還允許用戶儲存他們的通信對等者的公鑰(以證書形式)。
=======================
native2ascii
功能說明:
將含有本地編碼字元(既非 Latin1 又非 Unicode 字元)的文件轉換為 Unicode 編碼字元的文件。
語法:
native2ascii [options] [inputfile [outputfile]]
補充說明:
Java 編譯器和其它 Java 工具只能處理含有 Latin-1 和/或 Unicode 編碼(udddd 記號)字元的文件。native2ascii 將含有其它字元編碼的文件轉換成含 Latin-1 和/或 Unicode 編碼字元的文件。若省略 outputfile,則使用標准輸出設備輸出。此外,如果也省略 inputfile,則使用標准輸入設備輸入。
命令選項
-reverse 執行相反的操作:將含 Latin-1 和/或 Unicode 編碼字元的文件轉換成含本地編碼字元的文件。
-encoding[encoding_name] 指定轉換過程使用的編碼名稱。預設的編碼從系統屬性 file.encoding 中得到。
=======================
appletviewer
功能說明:
Java applet 瀏覽器。appletviewer 命令可在脫離萬維網瀏覽器環境的情況下運行 applet。
語法:
appletviewer [ threads flag ] [ 命令選項 ] urls ...
補充說明:
appletviewer 命令連接到 url 所指向的文檔或資源上,並在其自身的窗口中顯示文檔引用的每個 applet。注意:如果 url 所指向的文檔不引用任何帶有 OBJECT、EMBED 或 APPLET 標記的 applet,那麼 appletviewer 就不做任何事情。
命令選項
-debug 在 Java 調試器 jdb 中啟動 appletviewer,使您可以調試文檔中的 applet。
-encoding[編碼名稱] 指定輸入 HTML 文件的編碼名稱。
-J[javaoption] 將 javaoption 字元串作為單個參數傳給運行 appletviewer 的 Java 解釋器。參數不能含有空格。由多重參數組成的字元串,其中的每個參數都必須以前綴 -J 開頭,該前綴以後將被除去。這在調整編譯器的執行環境或內存使用時將很有用。
=========================
extcheck
功能說明:
extcheck 檢測目標 jar 文件與當前安裝方式擴展 jar 文件間的版本沖突。
語法:
extcheck [ -verbose ] targetfile.jar
補充說明:
extcheck 實用程序檢查指定 Jar 文件的標題和版本與 JDK TM 軟體中所安裝的擴展是否有沖突。在安裝某個擴展前,可以用該實用程序查看是否已安裝了該擴展的相同版本或更高的版本。
extcheck 實用程序將 targetfile.jar 文件清單的 specification-title 和 specification-version 頭與當前安裝在擴展目錄下所有 Jar 文件的相對應的頭進行比較(預設擴展目錄為 jre/lib/ext)。extcheck 實用程序比較版本號的方式與 java.lang.Package.isCompatibleWith 方法相同。若未檢測到沖突,則返回代碼為 0。如果擴展目錄中任何一個 jar 文件的清單有相同的 specification-title 和相同的或更新的 specification-version 號,則返回非零錯誤代碼。如果 targetfile.jar 的清單中沒有 specification-title 或 specification-version 屬性,則同樣返回非零錯誤代碼。
命令選項
-verbose 對擴展目錄中的 Jar 文件進行檢查時,列出文件。此外,還報告目標 jar 文件的清單屬性及所有沖突的 jar 文件。
=====================
jar
功能說明:
Java歸檔工具
語法:
jar [ 命令選項 ] [manifest] destination input-file [input-files]
補充說明:
jar工具是個java應用程序,可將多個文件合並為單個JAR歸檔文件。jar是個多用途的存檔及壓縮工具,它基於ZIP和ZLIB壓縮格式。然而,設計jar的主要目的是便於將java applet或應用程序打包成單個歸檔文件。將applet或應用程序的組件(.class 文件、圖像和聲音)合並成單個歸檔文件時,可以用java代理(如瀏覽器)在一次HTTP事務處理過程中對它們進行下載,而不是對每個組件都要求一個新連接。這大大縮短了下載時間。jar還能壓縮文件,從而進一步提高了下載速度。此外,它允許applet的作者對文件中的各個項進行簽名,因而可認證其來源。jar工具的語法基本上與tar命令的語法相同。
命令選項
-c 在標准輸出上創建新歸檔或空歸檔。
-t 在標准輸出上列出內容表。
-x[file] 從標准輸入提取所有文件,或只提取指定的文件。如果省略了file,則提取所有文件;否則只提取指定文件。
-f 第二個參數指定要處理的jar文件。在-c(創建)情形中,第二個參數指的是要創建的jar文件的名稱(不是在標准輸出上)。在-t(表(或-x(抽取)這兩種情形中,第二個參數指定要列出或抽取的jar文件。
-v 在標准錯誤輸出設備上生成長格式的輸出結果。
-m 包括指定的現有清單文件中的清單信息。用法舉例:「jar cmf myManifestFile myJarFile *.class」
-0 只儲存,不進行 ZIP 壓縮。
-M 不創建項目的清單文件。
-u 通過添加文件或更改清單來更新現有的 JAR 文件。例如:「jar -uf foo.jar foo.class」將文件 foo.class 添加到現有的JAR文件foo.jar中,而「jar umf manifest foo.jar」則用manifest中的信息更新foo.jar的清單。
-C 在執行 jar 命令期間更改目錄。例如:「jar -uf foo.jar -C classes *」將classes目錄內的所有文件加到foo.jar中,但不添加類目錄本身。
程序示例
1:將當前目錄下所有CLASS文件打包成新的JAR文件:
jar cf file.jar *.class
2:顯示一個JAR文件中的文件列表
jar tf file.jar
3:將當前目錄下的所有文件增加到一個已經存在的JAR文件中
jar cvf file.jar *
========================
javadoc
功能說明
Java API文檔生成器從Java源文件生成API文檔HTML頁。
語法:
javadoc [ 命令選項 ] [ 包名 ] [ 源文件名 ] [ @files ]
其中[ 包名 ]為用空格分隔的一系列包的名字,包名不允許使用通配符,如(*)。[ 源文件名 ]為用空格分
⑸ APACHE是做什麼用的
Apache是一個歷史悠久並且功能十分強大的WEB伺服器,但其豐富的功能對於一個新手來說往往不知道從何下手。我個人感覺Apache的設計充分體現了模塊化設計的優勢,通過在動態模塊載入(DSO)模式下的安裝,任何子應用模塊都可以通過配置文件的簡單修改進行積木式的靈活配置。安裝的過程可以從簡單的靜態html服務開始,一個模塊一個模塊的學習使用。從單純的HTML靜態服務(core),到復雜的動態頁面服務(core + php, core + resin, core + php + mod_gzip, core + resin + mod_expire)。
本文主要從簡化安裝==>性能調優==>維護方便的角度,介紹了WEB服務的規劃、HTTPD安裝/應用模塊配置、升級/維護等過程。讓Apache和PHP,Resin等應用模塊的獨立升級,完全互不影響。
WEB應用容量規劃:根據硬體配置和WEB應用的特點進行WEB服務的規劃及一些簡單的估算公式;
Apache安裝過程:apache的通用的簡化安裝選項,方便以後的應用的模塊化配置;
修改 HARD_SERVER_LIMIT:
vi /path/to/apache_src/src/include/httpd.h
#define HARD_SERVER_LIMIT 2560 <===將原來的 HARD_SERVER_LIMIT 256 後面加個「0」
apache編譯:
./configure --prefix=/home/apache --enable-shared=max --enable-mole=most
可選應用模塊/工具的安裝:php resin mod_gzip mod_expire及各個模塊之間的配合;
mod_php安裝:./configure --with-apxs=/home/apache/bin/apxs --enable-track-vars --with-mysql
mod_resin安裝:./configure --with-apxs=/home/apache/bin/apxs
mod_gzip安裝:修改Makefile中的 apxs路徑:然後make make install
工具:日誌輪循工具cronolog安裝:http://www.cronolog.org
升級/維護:看看通用和模塊化的安裝過程如何簡化了日常的升級/維護工作;
按照以上的方法:系統管理員和應用管理員的職責可以清楚的分開,互相獨立。
系統安裝:系統管理員的職責就是安裝好一台DSO模式的Apache,然後COLON即可,
應用安裝:由應用管理員負責具體應用所需要的模塊,比如PHP Resin等,並設置httpd.conf中相關的配置。
系統升級:系統管理員:升級操作系統/升級Apache
應用升級:應用管理員:升級應用模塊,PHP Resin等。
WEB應用的容量規劃
Apache主要是一個內存消耗型的服務應用,我個人總結的經驗公式:
apache_max_process_with_good_perfermance < (total_hardware_memory / apache_memory_per_process ) * 2
apache_max_process = apache_max_process_with_good_perfermance * 1.5
為什麼會有一個apache_max_process_with_good_perfermance和apache_max_process呢?原因是在低負載下系統可以使用更多的內存用於文件系統的緩存,從而進一步提高單個請求的響應速度。在高負載下,系統的單個請求響應速度會慢不少,而超過 apache_max_process,系統會因為開始使用硬碟做虛擬內存交換空間而導致系統效率急劇下降。此外,同樣的服務:2G內存的機器的 apache_max_process一般只設置到1G內存的1.7倍,因為Apache本身會因為進程過多導致性能下降。
例子1:
一個apache + mod_php的伺服器:一個apache進程一般需要4M內存
因此在一個1G內存的機器上:apache_max_process_with_good_perfermance < (1g / 4m) * 2 = 500
apache_max_process = 500 * 1.5 = 750
所以規劃你的應用讓服務盡量跑在500個進程以下以保持比較高的效率,並設置Apache的軟上限在800個。
例子2:
一個apache + mod_resin的伺服器: 一個apache進程一般需要2M內存
在一個2G內存的機器上:
apache_max_process_with_good_perfermance < (2g / 2m ) * 2 = 2000
apache_max_process = 2000 * 1.5 = 3000
以上估算都是按小文件服務估算的(一個請求一般大小在20k以下)。對於文件下載類型站點,可能還會受其他因素:比如帶寬等的影響。
Apache安裝過程
伺服器個數的硬上限HARD_SERVER_LIMIT的修改:
在Apache的源代碼中預設的最大進程數是256個,需要修改apache_1.3.xx/src/include/httpd.h
#ifndef HARD_SERVER_LIMIT
#ifdef WIN32
#define HARD_SERVER_LIMIT 1024
#elif defined(NETWARE)
#define HARD_SERVER_LIMIT 2048
#else
#define HARD_SERVER_LIMIT 2560 <===將原來的HARD_SERVER_LIMIT 256 後面加個「0」
#endif
#endif
解釋:
Apache預設的最大用戶數是256個:這個配置對於伺服器內存還是256M左右的時代是一個非常好的預設設置,但隨著內存成本的急劇下降,現在大型站點的伺服器內存配置一般比當時要高一個數量級不止。所以256個進程的硬限制對於一台1G內存的機器來說是太浪費了,而且Apache的軟上限 max_client是受限於HARD_SERVER_LIMIT的,因此如果WEB伺服器內存大於256M,都應該調高Apache的 HARD_SERVER_LIMIT。根據個人的經驗:2560已經可以滿足大部分小於2G內存的伺服器的容量規劃了(Apache的軟上限的規劃請看後面)。
Apache的編譯:以下通用的編譯選項能滿足以後任意模塊的安裝
./configure --prefix=/another_driver/apache/ --enable-shared=max --enable-mole=most
比如:
./configure --prefix=/home/apache/ --enable-shared=max --enable-mole=most
解釋:
--prefix=/another_driver/apache/:建議將apache服務安裝在另外一個驅動設備上的目的在於硬碟往往是一個系統使用壽命最低的設備,因此:將服務數據和系統完全分開,不僅能提高了數據的訪問速度,更重要的,大大方便系統升級,應用備份和恢復過程。
--shared-mole=max:使用動態載入方式載入子模塊會帶來5%的性能下降,但和帶來的配置方便相比更本不算什麼:比如模塊升級方便,系統升級風險降低,安裝過程標准化等
--enable-mole=most:用most可以將一些不常用的mole編譯進來,比如後面講到的mod_expire是就不在 apache的預設常用模塊中
如果不想build so, 也可以這樣:
./configure \
"--with-layout=Apache" \
"--prefix=/path/to/apache" \
"--disable-mole=access" \
"--disable-mole=actions" \
"--disable-mole=autoindex" \
"--disable-mole=env" \
"--disable-mole=imap" \
"--disable-mole=negotiation" \
"--disable-mole=setenvif" \
"--disable-mole=status" \
"--disable-mole=userdir" \
"--disable-mole=cgi" \
"--disable-mole=include" \
"--disable-mole=auth" \
"--disable-mole=asis"
但結果會發現,這樣編譯對服務性能只能有微小的提高(5%左右),但卻失去了以後系統升級和模塊升級的靈活性,無論是模塊還是Apache本身升級都必須把Apache和PHP的SOURCE加在一起重新編譯。
apache的預設配置文件一般比較大:可以使用去掉注釋的方法精簡一下:然後再進入具體的培植過程能讓你更快的定製出你所需要的。
grep -v "#" httpd.conf.default >httpd.conf
需要修改的通用項目有以下幾個:
#服務埠,預設是8080,建議將整個Apache配置調整好後再將服務埠改到正式服務的埠
Port 8080 => 80
#伺服器名:預設沒有
ServerName name.example.com
#最大服務進程數:根據服務容量預測設置
MaxClients 256 => 800
#預設啟動服務後的服務進程數:等服務比較平穩後,按平均負載下的httpd個數設置就可以
StartServers 5 => 200
不要修改:
以前有建議說修改:
MinSpareServers 5 => 100
MaxSpareServers 10 => 200
但從我的經驗看來:預設值已經是非常優化的了,而且讓Apache自己調整子共享進程個數還是比較好的。
特別修改:
在solaris或一些比較容易出現內存泄露的應用上:
MaxRequestsPerChild 0 =>3000
應用模塊和工具的安裝配置:
由於使用模塊動態載入的模式,所以可以方便的通過簡單的配置調整來把Apache定製成你需要的:最好把不常用模塊全部清除(無論處於安全還是效率)。
比如:對於靜態頁面伺服器:就什麼其他子模塊都不載入,對於PHP應用就加上PHP模塊,對於JAVA應用就把Resin模塊載入上。而且各種模塊的插拔非常簡單,這樣調試過程中就可以簡單的通過注釋掉不需要的模塊,而不用重新編譯。
一般說來,可以不需要的模塊包括:
#LoadMole env_mole libexec/mod_env.so
#LoadMole negotiation_mole libexec/mod_negotiation.so
#LoadMole status_mole libexec/mod_status.so
#server side include已經過時了
#LoadMole includes_mole libexec/mod_include.so
#不需要將沒有預設index文件的目錄下所有文件列出
#LoadMole autoindex_mole libexec/mod_autoindex.so
#盡量不使用CGI:一直是Apache安全問題最多的地方
#LoadMole cgi_mole libexec/mod_cgi.so
#LoadMole asis_mole libexec/mod_asis.so
#LoadMole imap_mole libexec/mod_imap.so
#LoadMole action_mole libexec/mod_actions.so
#不使用安全認證可以大大提高訪問速度
#LoadMole access_mole libexec/mod_access.so
#LoadMole auth_mole libexec/mod_auth.so
#LoadMole setenvif_mole libexec/mod_setenvif.so
最好保留的有:
#用於定製log格式
LoadMole config_log_mole libexec/mod_log_config.so
#用於增加文件應用的關聯
LoadMole mime_mole libexec/mod_mime.so
#用於預設index文件:index.php等
LoadMole dir_mole libexec/mod_dir.so
可用可不用的有:
#比如:需要在~/username/下調試php可以將
LoadMole userdir_mole libexec/mod_userdir.so
#比如:需要將以前的URL進行轉向或者需要使用CGI script-alias
LoadMole alias_mole libexec/mod_alias.so
常用的模塊:
最常用的可能就是php和JAVA應用伺服器的前端,此外,從性能上講利用mod_gzip可以減少40%左右的流量,減少機器用於傳輸的負載,而 mod_expires可以減少10%左右的重復請求,讓重復的用戶對指定的頁面請求結果都CACHE在本地,根本不向伺服器發出請求。
建議將所有MODULE的配置都放到相應模塊的配置內部:some_mole config
PHP的安裝:
/path/to/php_src/configure --with-apxs=/path/to/apache/bin/apxs --with-other-moles-you-need
需要修改的配置:
AddType application/x-httpd-php .php .php3 .any_file_in_php
resin的安裝設置:
/path/to/resin/src/configure --with-apxs=/path/to/apache/bin/apxs
具體的resin設置放在另外一個文件中:比如/home/resin/conf/resin.conf
CauchoConfigFile /path/to/apache/conf/resin.conf
mod_expires的安裝配置:
ExpiresActive on
ExpiresByType image/gif "access plus 1 month"
ExpiresByType text/css "now plus 1 month"
ExpiresDefault "now plus 1 day"
注釋:
所有的.gif文件1個月以後過期
所有的文件預設1天以後過期
mod_gzip的安裝
http://www.chedong.com/tech/compress.html
日誌的輪循:cronolog的安裝和設置
cronolog可以非常整齊的將日誌按天輪循存儲
預設編譯安裝到/usr/local/bin/下,只需要將配置改成:
CustomLog "|/usr/local/sbin/cronolog /home/apache/logs/%w/access_log" combined
日誌將按天截斷並存放在以星期為目錄名的目錄下:比如:log/1是周一,log/5是周五, log/0是周日
用gzip壓縮每天的日誌:
30 4 * * * /usr/bin/gzip -f /home/apache/logs/`date -d yesterday +%w`/access_log
日誌的定期刪除:
30 5 * * */usr/bin/find /home/apache/logs/ -name access_log.gz -mtime +3 |xargs -r /bin/rm -f
升級維護:
由於使用動態模塊載入方式(DSO模式)安裝Apache,Apache的HTTPD核心服務和應用模塊以及應用模塊之間都變的非常靈活,建議將所有獨立模塊的配置都放在
CONFIGURATIONS..
里,這樣配置非常容易通過屏蔽某個模塊來進行功能調整:比如:
#AddMole mod_gzip.c
就屏蔽了mod_gzip,而其他模塊不首任何影響。
安裝和維護過程:
系統安裝:系統管理員的職責就是安裝系統和一個按照DSO模式安裝的Apache,然後COLON。
應用安裝:由應用管理員負責具體應用所需要的模塊並設置HTTPD。
系統升級:系統管理員:升級系統/升級Apache
應用升級:應用管理員:升級應用模塊:PHP CAUCHO等
系統備份/恢復:如果Apache不在預設的系統盤上,只需要將Apache目錄備份就可以了,遇到系統分區的硬體問題直接使用預先准備好的系統COLON,再直接將Apache所在物理盤恢復就行了。
系統管理員:Apache的最簡化安裝 OS + Apache (httpd core only)
應用管理員:應用模塊定製 純靜態頁面服務
core
PHP動態頁面
core+so
+php
JAVA應用
core+so
+caucho
+ssl
應用例子: www.example.com
image.example.com
bbs.example.com mall.example.com
例子:Apache和PHP模塊的獨立升級。
如果Apache是按照以下方式安裝:
./configure --prefix=/home/apache --enable-shared=max --enable-mole=most
PHP是按照以下方式安裝:
./configure --with-apxs=/home/apache/bin/apxs --enable-track-vars --with-mysql
以後單獨升級Apache的時候,仍然是:
./configure --prefix=/home/apache --enable-shared=max --enable-mole=most
make
su
#/home/apache/bin/apachectl stop
#make install
單獨升級php時,仍然是:
./configure --with-apxs=/home/apache/bin/apxs --enable-track-vars --with-mysql
make
su
#/home/apache/bin/apachectl stop
#make install
#/home/apache/bin/apachectl start
基於反相代理的WEB加速:
squid和mod_proxy都可以實現反相代理加速。而基於緩存的代理加速比起原有WEB服務,速度會有數量級的提升。
小提示:
Apache安裝後,預設根目錄下沒有但很有用的2個文件: