例:exp導出
exp username/password@database file=xxx/xxx/xx.dmp
imp導入
imp username/password@database file=xxx/xxx/xxx.dmp FULL=y
以上的例子是對整個數據庫進行的導出導入,除了以數據庫外,還可以導出表,表空間。
注意在導入是如果遇到imp-00015提示following statement failed because the objiect already exits時,只需對該信息后面的所存在的對象刪除,再次導入即可。
在使用Java的時候,我們都會遇到使用集合(Collection)的時候,但是Java API提供了多種集合的實現,我在使用和面試的時候頻 頻遇到這樣的“抉擇” 。 :)(主要還是面試的時候) 久而久之,也就有了一點點的心得體會,寫出來以供大家討論 。 總的說來,Java API中所用的集合類,都是實現了Collection接口,他的一個類繼承結構如下: Collection<--List<--Vector Collection<--List<--ArrayList Collection<--List<--LinkedList Collection<--Set<--HashSet Collection<--Set<--HashSet<--LinkedHashSet Collection<--Set<--SortedSet<--TreeSet Vector : 基于Array的List,其實就是封裝了Array所不具備的一些功能方便我們使用,它不可能走入Array的限制。性能也就不可能 超越Array。所以,在可能的情況下,我們要多運用Array。另外很重要的一點就是Vector“sychronized”的,這個也是Vector和 ArrayList的唯一的區別。 ArrayList:同Vector一樣是一個基于Array上的鏈表,但是不同的是ArrayList不是同步的。所以在性能上要比Vector優越一些,但 是當運行到多線程環境中時,可需要自己在管理線程的同步問題。 LinkedList:LinkedList不同于前面兩種List,它不是基于Array的,所以不受Array性能的限制。它每一個節點(Node)都包含兩方 面的內容:1.節點本身的數據(data);2.下一個節點的信息(nextNode)。所以當對LinkedList做添加,刪除動作的時候就不用像 基于Array的List一樣,必須進行大量的數據移動。只要更改nextNode的相關信息就可以實現了。這就是LinkedList的優勢。 List總結: 1. 所有的List中只能容納單個不同類型的對象組成的表,而不是Key-Value鍵值對。例如:[ tom,1,c ]; 2. 所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ]; 3. 所有的List中可以有null元素,例如[ tom,null,1 ]; 4. 基于Array的List(Vector,ArrayList)適合查詢,而LinkedList(鏈表)適合添加,刪除操作。 HashSet:雖然Set同List都實現了Collection接口,但是他們的實現方式卻大不一樣。List基本上都是以Array為基礎。但是Set則是 在HashMap的基礎上來實現的,這個就是Set和List的根本區別。HashSet的存儲方式是把HashMap中的Key作為Set的對應存儲項。看看 HashSet的add(Object obj)方法的實現就可以一目了然了。 public boolean add(Object obj) { return map.put(obj, PRESENT) == null; } 這個也是為什么在Set中不能像在List中一樣有重復的項的根本原因,因為HashMap的key是不能有重復的。 LinkedHashSet:HashSet的一個子類,一個鏈表。 TreeSet:SortedSet的子類,它不同于HashSet的根本就是TreeSet是有序的。它是通過SortedMap來實現的。 Set總結: 1. Set實現的基礎是Map(HashMap); 2. Set中的元素是不能重復的,如果使用add(Object obj)方法添加已經存在的對象,則會覆蓋前面的對象 為什么要使用集合類 當你事先不知道要存放數據的個數,或者你需要一種比數組下標存取機制更靈活的方法時,你就需要用到集合類。 理解集合類 集合類存放于java.util包中。 集合類存放的都是對象的引用,而非對象本身,出于表達上的便利,我們稱集合中的對象就是指集合中對象的引用(reference)。 集合類型主要有3種:set(集)、list(列表)和map(映射)。 (1)集 集(set)是最簡單的一種集合,它的對象不按特定方式排序,只是簡單的把對象加入集合中,就像往口袋里放東西。 對集中成員的訪問和操作是通過集中對象的引用進行的,所以集中不能有重復對象。 集也有多種變體,可以實現排序等功能,如TreeSet,它把對象添加到集中的操作將變為按照某種比較規則將其插入到有序的對象序 列中。它實現的是SortedSet接口,也就是加入了對象比較的方法。通過對集中的對象迭代,我們可以得到一個升序的對象集合。 (2)列表 列表的主要特征是其對象以線性方式存儲,沒有特定順序,只有一個開頭和一個結尾,當然,它與根本沒有順序的集是不同的。 列表在數據結構中分別表現為:數組和向量、鏈表、堆棧、隊列。 關于實現列表的集合類,是我們日常工作中經常用到的,將在后邊的筆記詳細介紹。 (3)映射 映射與集或列表有明顯區別,映射中每個項都是成對的。映射中存儲的每個對象都有一個相關的關鍵字(Key)對象,關鍵字決定了 對象在映射中的存儲位置,檢索對象時必須提供相應的關鍵字,就像在字典中查單詞一樣。關鍵字應該是唯一的。 關鍵字本身并不能決定對象的存儲位置,它需要對過一種散列(hashing)技術來處理,產生一個被稱作散列碼(hash code)的整數值, 散列碼通常用作一個偏置量,該偏置量是相對于分配給映射的內存區域起始位置的,由此確定關鍵字/對象對的存儲位置。理想情況 下,散列處理應該產生給定范圍內均勻分布的值,而且每個關鍵字應得到不同的散列碼。 集合類簡介 java.util中共有13個類可用于管理集合對象,它們支持集、列表或映射等集合,以下是這些類的簡單介紹 集: HashSet: 使用HashMap的一個集的實現。雖然集定義成無序,但必須存在某種方法能相當高效地找到一個對象。使用一個HashMap對 象實現集的存儲和檢索操作是在固定時間內實現的. TreeSet: 在集中以升序對對象排序的集的實現。這意味著從一個TreeSet對象獲得第一個迭代器將按升序提供對象。TreeSet類使用 了一個TreeMap. 列表: Vector: 實現一個類似數組一樣的表,自動增加容量來容納你所需的元素。使用下標存儲和檢索對象就象在一個標準的數組中一樣 。你也可以用一個迭代器從一個Vector中檢索對象。Vector是唯一的同步容器類??當兩個或多個線程同時訪問時也是性能良好的。 Stsck: 這個類從Vector派生而來,并且增加了方法實現棧??一種后進先出的存儲結構。 LinkedList: 實現一個鏈表。由這個類定義的鏈表也可以像棧或隊列一樣被使用。 ArrayList: 實現一個數組,它的規模可變并且能像鏈表一樣被訪問。它提供的功能類似Vector類但不同步。 映射: HashTable: 實現一個映象,所有的鍵必須非空。為了能高效的工作,定義鍵的類必須實現hashcode()方法和equal()方法。這個類 是前面java實現的一個繼承,并且通常能在實現映象的其他類中更好的使用。 HashMap: 實現一個映象,允許存儲空對象,而且允許鍵是空(由于鍵必須是唯一的,當然只能有一個)。 WeakHashMap: 實現這樣一個映象:通常如果一個鍵對一個對象而言不再被引用,鍵/對象對將被舍棄。這與HashMap形成對照,映象 中的鍵維持鍵/對象對的生命周期,盡管使用映象的程序不再有對鍵的引用,并且因此不能檢索對象。 TreeMap: 實現這樣一個映象,對象是按鍵升序排列的。 Set和List都是由公共接口Collection擴展而來,所以它們都可以使用一個類型為Collection的變量來引用。這就意味著任何列表或 集構成的集合都可以用這種方式引用,只有映射類除外(但也不是完全排除在外,因為可以從映射獲得一個列表。)所以說,把一個 列表或集傳遞給方法的標準途徑是使用Collection類型的參數。 Vector 還是ArrayList,哪一個更好,為什么? 要回答這個問題不能一概而論,有時候使用Vector比較好;有時是ArrayList,有時候這兩個都不是最好的選擇。你別指望能夠獲得 一個簡單肯定答案,因為這要看你用它們干什么。下面有4個要考慮的因素: (1)API (2)同步處理 (3)數據增長性 (4)使用模式 下面針對這4個方面進行一一探討 API 在由Ken Arnold等編著的《Java Programming Language》(Addison-Wesley, June 2000)一書中有這樣的描述,Vector類似于 ArrayList.。所有從API的角度來看這兩個類非常相似。但他們之間也還是有一些主要的區別的。 同步性 Vector是同步的。這個類中的一些方法保證了Vector中的對象是線程安全的。而ArrayList則是異步的,因此ArrayList中的對象并不 是線程安全的。因為同步的要求會影響執行的效率,所以如果你不需要線程安全的集合那么使用ArrayList是一個很好的選擇,這樣 可以避免由于同步帶來的不必要的性能開銷。 數據增長 從內部實現機制來講ArrayList和Vector都是使用數組(Array)來控制集合中的對象。當你向這兩種類型中增加元素的時候,如果元素 的數目超出了內部數組目前的長度它們都需要擴展內部數組的長度,Vector缺省情況下自動增長原來一倍的數組長度,ArrayList是 原來的50%,所以最后你獲得的這個集合所占的空間總是比你實際需要的要大。所以如果你要在集合中保存大量的數據那么使用Vector 有一些優勢,因為你可以通過設置集合的初始化大小來避免不必要的資源開銷。 使用模式 在ArrayList和Vector中,從一個指定的位置(通過索引)查找數據或是在集合的末尾增加、移除一個元素所花費的時間是一樣的, 這個時間我們用O(1)表示。但是,如果在集合的其他位置增加或移除元素那么花費的時間會呈線形增長:O(n-i),其中n代表集合中 元素的個數,i代表元素增加或移除元素的索引位置。為什么會這樣呢?以為在進行上述操作的時候集合中第i和第i個元素之后的所 有元素都要執行位移的操作。這一切意味著什么呢? 這意味著,你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以。如果是其他操作, 你最好選擇其他的集合操作類。比如,LinkList集合類在增加或移除集合中任何位置的元素所花費的時間都是一樣的—O(1),但它在 索引一個元素的使用缺比較慢-O(i),其中i是索引的位置.使用ArrayList也很容易,因為你可以簡單的使用索引來代替創建iterator 對象的操作。LinkList也會為每個插入的元素創建對象,所有你要明白它也會帶來額外的開銷。 最后,在《Practical Java》一書中Peter Haggar建議使用一個簡單的數組(Array)來代替Vector或ArrayList。尤其是對于執行效 率要求高的程序更應如此。因為使用數組(Array)避免了同步、額外的方法調用和不必要的重新分配空間的操作。(T007)
|
轉自 http://hi.baidu.com/%C1%F5%CA%E9%B3%AC%B9%A4%B3%CC%CA%A6/blog/item/fa6867fe38a018375d60084e.html
最近要做上傳下載,所以又把它翻出了,熟悉了一把,做了一下字節轉換的調整及上傳類型的限制,當然還有上傳路徑的限制。不過一直在考慮的問題是怎樣找到減少服務器壓力的具體方法,本列子貼出來是希望能給某些新手一些幫助,同時也希望各路大俠批評指點小弟的許多不足。
首先建立一個FileAction
package com.action;
import org.apache.struts.action.*;
import javax.servlet.http.*;
import com.actionForm.FileActionForm;
import org.apache.struts.actions.DispatchAction;
import java.util.Date;
import java.text.*;
import org.apache.struts.upload.FormFile;
import java.io.*;
import java.net.URLEncoder;
import com.dao.*;
public class FileAction extends DispatchAction {
private JDBConnection connection =new JDBConnection();
//以下方法實現文件的上傳
public ActionForward upLoadFile(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws
Exception {
ActionForward forward=null;
Date date = new Date();
FileActionForm fileActionForm = (FileActionForm) form;
//FormFile用于指定存取文件的類型
FormFile file = fileActionForm.getFile(); //獲取當前的文件
// 獲得系統的絕對路徑 String dir = servlet.getServletContext().getRealPath("/image");
//我上傳的文件沒有放在服務器上。而是存在D:D:\\loadfile\\temp\\
String dir="D:\\loadfile\\temp\\";
int i = 0;
String type = file.getFileName();
while(i!=-1){
//找到上傳文件的類型的位置,這個地方的是'.'
i = type.indexOf(".");
/* System.out.println(i);*/
/*截取上傳文件的后綴名,此時得到了文件的類型*/
type = type.substring(i+1);
}
// 限制上傳類型為jpg,txt,rar;
if (!type.equals("jpg") && !type.equals("txt")&& !type.equals("bmp"))
{//當上傳的類型不為上述類型時,跳轉到錯誤頁面。
forward=mapping.findForward("error");
}
else
{
// 將上傳時間加入文件名(這個地方的是毫秒數)
String times = String.valueOf(date.getTime());
//組合成 time.type
String fname = times + "." + type;
//InInputStream是用以從特定的資源讀取字節的方法。
InputStream streamIn = file.getInputStream(); //創建讀取用戶上傳文件的對象
//得到是字節數,即byte,我們可以直接用file.getFileSize(),也可以在創建讀取對象時用streamIn.available();
// int ok=streamIn.available();
int ok=file.getFileSize();
String strFee = null;
//這個地方是處理上傳的為M單位計算時,下一個是以kb,在下一個是byte;
if(ok>=1024*1024)
{
float ok1=(((float)ok)/1024f/1024f);
DecimalFormat myformat1 = new DecimalFormat("0.00");
strFee = myformat1.format(ok1)+"M";
System.out.println(strFee+"M");
}
else if(ok>1024 && ok<=1024*1024)
{
double ok2=((double)ok)/1024;
DecimalFormat myformat2=new DecimalFormat("0.00");
strFee = myformat2.format(ok2)+"kb";
System.out.println(strFee+"kb");
}
else if(ok<1024)
{
System.out.println("aaaaaaaaa");
strFee=String.valueOf(ok)+"byte";
System.out.println(strFee);
}
System.out.println( streamIn.available()+"文件大小byte");
//這個是io包下的上傳文件類
File uploadFile = new File(dir); //指定上傳文件的位置
if (!uploadFile.exists() || uploadFile == null) { //判斷指定路徑dir是否存在,不存在則創建路徑
uploadFile.mkdirs();
}
//上傳的路徑+文件名
String path = uploadFile.getPath() + "\\" + fname;
//OutputStream用于向某個目標寫入字節的抽象類,這個地方寫入目標是path,通過輸出流FileOutputStream去寫
OutputStream streamOut = new FileOutputStream(path);
int bytesRead = 0;
byte[] buffer = new byte[8192];
//將數據讀入byte數組的一部分,其中讀入字節數的最大值是8192,讀入的字節將存儲到,buffer[0]到buffer[0+8190-1]的部分中
//streamIn.read方法返回的是實際讀取字節數目.如果讀到末尾則返回-1.如果bytesRead返回為0則表示沒有讀取任何字節。
while ((bytesRead = streamIn.read(buffer, 0, 8192)) != -1) {
//寫入buffer數組的一部分,從buf[0]開始寫入并寫入bytesRead個字節,這個write方法將發生阻塞直至字節寫入完成。
streamOut.write(buffer, 0, bytesRead);
}
// 關閉輸出輸入流,銷毀File流。
streamOut.close();
streamIn.close();
file.destroy();
String paths=path;
System.out.println(paths);
String fileName = Chinese.toChinese(fileActionForm.getFileName()); //獲取文件的名稱
//String fileSize = String.valueOf(file.getFileSize());
String fileDate = DateFormat.getDateInstance().format(date);
String sql = "insert into tb_file values('" + fileName + "','" +
strFee + "','" + fileDate + "','" + paths + "')";
connection.executeUpdate(sql);
connection.closeConnection();
forward=mapping.findForward("upLoadFileResult");
}
return forward;
}
//實現文件的下載
public ActionForward downFile(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws
Exception {
String path = request.getParameter("path");
System.out.println(path+"111");
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
OutputStream fos = null;
InputStream fis = null;
//如果是從服務器上取就用這個獲得系統的絕對路徑方法。 String filepath = servlet.getServletContext().getRealPath("/" + path);
String filepath=path;
System.out.println("文件路徑"+filepath);
File uploadFile = new File(filepath);
fis = new FileInputStream(uploadFile);
bis = new BufferedInputStream(fis);
fos = response.getOutputStream();
bos = new BufferedOutputStream(fos);
//這個就就是彈出下載對話框的關鍵代碼
response.setHeader("Content-disposition",
"attachment;filename=" +
URLEncoder.encode(path, "utf-8"));
int bytesRead = 0;
//這個地方的同上傳的一樣。我就不多說了,都是用輸入流進行先讀,然后用輸出流去寫,唯一不同的是我用的是緩沖輸入輸出流
byte[] buffer = new byte[8192];
while ((bytesRead = bis.read(buffer, 0, 8192)) != -1) {
bos.write(buffer, 0, bytesRead);
}
bos.flush();
fis.close();
bis.close();
fos.close();
bos.close();
return null;
}
}
FileActionForm
package com.actionForm;
import org.apache.struts.action.*;
import org.apache.struts.upload.*;
public class FileActionForm extends ActionForm {
private String fileName;//上傳文件的名稱
private String fileSize;//上傳文件的大小
private String filePath;//上傳文件到服務器的路徑
private String fileDate;//上傳文件的日期
private FormFile file;//上傳文件
public String getFileName() {
return fileName;
}
public FormFile getFile() {
return file;
}
public String getFileSize() {
return fileSize;
}
public String getFilePath() {
return filePath;
}
public String getFileDate() {
return fileDate;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public void setFile(FormFile file) {
this.file = file;
}
public void setFileSize(String fileSize) {
this.fileSize = fileSize;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
public void setFileDate(String fileDate) {
this.fileDate = fileDate;
}
}
index.jsp 此位置的form是javabeen的對象,這個javabeen中存取的圖片的相關信息
<table width="264" height="81" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td width="115" rowspan="4" align="center"><img src="<%=form.getFilePath()%>" width="100" height="100"></td>
<td width="133" align="center">圖片名稱:<%=form.getFileName()%></td>
</tr>
<tr align="center">
<td>圖片大小:<%=form.getFileSize()%></td>
</tr>
<tr align="center">
<td>上傳日期:<%=form.getFileDate()%></td>
</tr>
<tr>
<td align="center"><a href="fileAction.do?method=downFile&path=<%=form.getFilePath()%>" ><img src="priture/bottond.jpg"></a>
</td>
</tr>
</table>
<html:form action="fileAction.do?method=upLoadFile" enctype="multipart/form-data" onsubmit="return Mycheck()">
<table height="52" border="0" align="center" cellpadding="0" cellspacing="0">
<tr align="center">
<td width="60" height="26">圖片名稱:</td>
<td width="160"> <html:text property="fileName"/> </td>
<td width="60">圖片路徑:</td>
<td width="198"> <html:file property="file"/> </td>
</tr>
<tr align="right">
<td height="26" colspan="4"> <html:submit>上傳</html:submit> </td>
</tr>
</table>
</html:form>
struts-config.xml
<?xml version="1.0" encoding="UTF-8"?> <struts-config>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "
<form-beans>
<form-bean name="fileActionForm" type="com.actionForm.FileActionForm" />
</form-beans>
<action-mappings>
<action name="fileActionForm" parameter="method" path="/fileAction" scope="request" type="com.action.FileAction" validate="true">
<forward name="upLoadFileResult" path="/result.jsp"/>
<forward name="error" path="/fail.jsp"></forward>
</action>
</action-mappings>
<message-resources parameter="ApplicationResources" />
</struts-config>
轉自javaEye http://www.javaeye.com/topic/219585
解決:在zg上建一個download方法,通過將zg的請求路徑放在xg的下載界面上,當點擊xg界面上的下載連接時,都是請求zg的download。因此,文件下載解決。
ps:這個只是新手的我給新手兄弟們的一點分享,請各路高手盡量指點。謝謝!
ps2:to新手兄弟:關于文件上傳下載網上很多,我的博客也有,請自行選擇。



















































































例如:
2 <arg0 key="phne" resource="false"/>
3 <arg1 name="minlength" key="${minlength}" resource="fasle"/>
4 <arg1 name="maxlength" key="${maxlength}" resource="fasle"/>
5 <var>
6 <var-name>mask</var-name>
7 <var-value>${phone}</var-value>
8 </var>
9 <var>
10 <var-name>minlength</var-name>
11 <var-value>8</var-value>
12 </var>
13 <var>
14 <var-name>maxlength</var-name>
15 <var-value>8</var-value>
16 </var>
17 </field>
如何在不把源字符串的“中國人”截斷來判斷是否在源字符串的的length大于50&。
解決方法:
將源字符串中的“中國人”替換為‘’然后判斷源字符串的length是否小于“中國人”的length。即可。
發現應為使用myeclipse(me)來建立,因為me會默認的建立execute方法,必須將execute刪去,否則自定的方法不會被調用。