| Message |
|
|
依我的了解,您應該是想要在輸入的內容是空白或是不存在時都顯示一個錯誤訊息來提醒使用者吧?
設計的想法是:
利用一個boolean變數found,初始值為false,然後比對輸入的字串s,如果不是null時程式會利用for迴圈拜訪每個XML文件樹的節點,如果內容等於我們讀取到的分類號時,才將found設為true,並輸出結果,並等待使用者按下Enter才顯示下一筆。
以下是參考範例ReadXMLFile.java:
import java.io.*;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
public class ReadXMLFile {
public static void main(String[] args) throws IOException {
SAXBuilder builder = new SAXBuilder();
File xmlFile = new File("C:\\JAVA_WORK\\test1.xml");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("輸入分類號:");
String s = br.readLine();
boolean found = false;
if (s != null) {
try {
Document document = (Document) builder.build(xmlFile);
Element rootNode = document.getRootElement();
List list = rootNode.getChildren("ROW");
for (int i = 0; i < list.size(); i++)
{
Element node = (Element) list.get(i);
if (node.getChildText("分類號").equals(s))
{
System.out.println("年度號 : " + node.getChildText("年度號"));
System.out.println("分類號 : " + node.getChildText("分類號"));
System.out.println("案次號 : " + node.getChildText("案次號"));
Scanner input = new Scanner(System.in);
input.hasNextLine();
found = true;;
}
}
} catch (IOException io) {
System.out.println(io.getMessage());
} catch (JDOMException jdomex) {
System.out.println(jdomex.getMessage());
}
}
if (!found) {
System.out.println("查無此分類號!請重新輸入...");
}
}
}
以下是參考用的輸入檔test1.xml:
<ROWSET>
<ROW num="1">
<年度號>0080</年度號>
<分類號>010302</分類號>
<案次號>002</案次號>
</ROW>
<ROW num="2">
<年度號>0078</年度號>
<分類號>011602</分類號>
<案次號>002</案次號>
</ROW>
<ROW num="3">
<年度號>0070</年度號>
<分類號>019302</分類號>
<案次號>011</案次號>
</ROW>
<ROW num="1225">
<年度號>0099</年度號>
<分類號>018719</分類號>
<案次號>111</案次號>
</ROW>
</ROWSET>
|
 |
|
|
|
|
 |
|
|
您的程式需要修改一下,第13行改為兩個倒斜線(\\),為什麼要兩個倒斜線是因為到斜線本身是Java的跳脫字元,否則就會變成\t,這樣就變成跳格字元了。
File xmlFile = new File("C:\\JAVA_WORK\\test3.xml");
第19行改為
List list = rootNode.getChildren("ROW");
即可正常輸出您要的結果。
至於jdom-1.1.2.jar檔的安裝或設定其實主要是要設定在CLASSPATH這個環境變數上,例如您可以將jdom-1.1.2.zip解壓縮,然後將jar檔複製到於C:\JAVA_WORK\lib目錄下,然後在CLASSPATH中加入C:\JAVA_WORK\lib\jdom-1.1.2.jar。
|
 |
|
|
實際測試上傳一個1GB多的檔案,確實會出現Read timed out的結果:
So far, 1069001476 of 1073742116 bytes have been read.
We are currently reading item 1
So far, 1070000168 of 1073742116 bytes have been read.
We are currently reading item 1
So far, 1071002992 of 1073742116 bytes have been read.
We are currently reading item 1
So far, 1072001684 of 1073742116 bytes have been read.
We are currently reading item 1
So far, 1073000376 of 1073742116 bytes have been read.
一月 16, 2012 2:25:28 上午 org.apache.catalina.core.StandardWrapperValve invoke
嚴重: Servlet.service() for servlet [jsp] in context with path [] threw exception [An exception occurred processing JSP page /fileupload_streaming.jsp at line 65
62: File uploadedFile = new File(saveDirectory, fileName);
63: FileOutputStream uploadedFileStream =
64: new FileOutputStream(uploadedFile);
65: Streams.copy(stream, uploadedFileStream, true);
66: }
67: }
68: }
Stacktrace:] with root cause
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at org.apache.coyote.ajp.AjpProcessor.read(AjpProcessor.java:309)
at org.apache.coyote.ajp.AjpProcessor.readMessage(AjpProcessor.java:364)
at org.apache.coyote.ajp.AjpProcessor.receive(AjpProcessor.java:331)
at org.apache.coyote.ajp.AbstractAjpProcessor.refillReadBuffer(AbstractAjpProcessor.java:576)
at org.apache.coyote.ajp.AbstractAjpProcessor$SocketInputBuffer.doRead(AbstractAjpProcessor.java:1027)
at org.apache.coyote.Request.doRead(Request.java:422)
at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:290)
at org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:429)
at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:315)
at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:200)
at org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:976)
at org.apache.commons.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:886)
at java.io.InputStream.read(Unknown Source)
at org.apache.commons.fileupload.util.Streams.copy(Streams.java:96)
at org.apache.commons.fileupload.util.Streams.copy(Streams.java:66)
at org.apache.jsp.fileupload_005fstreaming_jsp._jspService(fileupload_005fstreaming_jsp.java:125)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.ha.tcp.ReplicationValve.invoke(ReplicationValve.java:333)
at org.apache.catalina.ha.session.JvmRouteBinderValve.invoke(JvmRouteBinderValve.java:219)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:200)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
HTTP Status 500 -
type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
org.apache.jasper.JasperException: An exception occurred processing JSP page /fileupload_streaming.jsp at line 65
62: File uploadedFile = new File(saveDirectory, fileName);
63: FileOutputStream uploadedFileStream =
64: new FileOutputStream(uploadedFile);
65: Streams.copy(stream, uploadedFileStream, true);
66: }
67: }
68: }
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:568)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:460)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
root cause
java.net.SocketTimeoutException: Read timed out
java.net.SocketInputStream.socketRead0(Native Method)
java.net.SocketInputStream.read(Unknown Source)
java.net.SocketInputStream.read(Unknown Source)
org.apache.coyote.ajp.AjpProcessor.read(AjpProcessor.java:309)
org.apache.coyote.ajp.AjpProcessor.readMessage(AjpProcessor.java:364)
org.apache.coyote.ajp.AjpProcessor.receive(AjpProcessor.java:331)
org.apache.coyote.ajp.AbstractAjpProcessor.refillReadBuffer(AbstractAjpProcessor.java:576)
org.apache.coyote.ajp.AbstractAjpProcessor$SocketInputBuffer.doRead(AbstractAjpProcessor.java:1027)
org.apache.coyote.Request.doRead(Request.java:422)
org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:290)
org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:429)
org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:315)
org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:200)
org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:976)
org.apache.commons.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:886)
java.io.InputStream.read(Unknown Source)
org.apache.commons.fileupload.util.Streams.copy(Streams.java:96)
org.apache.commons.fileupload.util.Streams.copy(Streams.java:66)
org.apache.jsp.fileupload_005fstreaming_jsp._jspService(fileupload_005fstreaming_jsp.java:125)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.23 logs.
Apache Tomcat/7.0.23
實際上傳的檔案大小如下:
-rw-r--r-- 1 tomcat tomcat 1073094361 2012-01-16 02:25 ppsds.pgf
目前我的web.xml中設定如下:
<session-config>
<session-timeout>10</session-timeout>
</session-config>
目前我不確定是否跟session-timeout這個值有關係(10分鐘),不過整個1GB檔案上傳的時間大約有花半小時以上,您可以試試看調整這個參數再測試看看。
|
 |
|
|
starzine您好:
我給的範例確實是只能在本機端執行,取得本機端的檔案名稱,而您所需要的是取得遠端檔案伺服器目錄下的檔案清單。
可以在sftp下執行目錄排序的指令如下(日期最近的會排在上面)
ls -lt
但接下來可能你會問要如何從psftp將這個指令的結果(目錄內的檔案清單)傳回,好讓我們可以再加以過濾出某個日期範圍內的檔案?
你先想一下,好好的想一 下....
你不知道,我也不知道,
這個問題可能已經超出光靠DOS Batch語法就能完成的事情了。
還是再問一次,有沒有可能改為規範遠端檔案伺服器上檔案的命名方式,否則我想就只有老老實實去寫程式來處理會比較快。
當問題複雜到一個程度時,還是真得要寫個程式來執行這個任務。(如何寫這個程式我就不在這邊討論,可以參考 http://www.andowson.com/posts/list/199.page)
|
 |
|
|
您可以參考下面的範例程式去修改
@echo off
rem 取得系統日期
for /f "tokens=1 delims= " %%a in ('date /T') do set today=%%a
rem 先找出現行目錄下所有檔案並依日期排序後再過濾出日期為系統日期之檔案存到dir.txt
dir /A:-D /O:D | find /i "%today%" > dir.txt
if exist filelist.txt del filelist.txt
rem 利用空白字元切割,由dir.txt每列的第五欄中取得檔案名稱
for /f "tokens=5 delims= " %%a in (dir.txt) do (
echo %%a >> filelist.txt
rem 下面可以開始抓檔案了
rem get %%a
)
我是利用 DOS file date這樣子的關鍵字去搜尋的
參考資料:
http://www.computing.net/answers/dos/dos-batch-to-check-file-date/12627.html
|
 |
|
|
|
大家好!新年快樂!
轉眼一年又過去了,本站從無到有,至今也成立五年了,去年訂的各項目標均有達成,所以我也不特別去一一檢討。
最近站長忙著準備結婚的事,網站就以維持正常運作為原則,沒有特別去發表新文章,但對於網友們的問題仍然是盡量抽空回答。
由於經營這個網站的成本除了時間以外,還有域名和主機的費用,今年的展望以損益兩平為目標,希望讓這個站可以達成靠廣告收入來支付營運的費用。
|
 |
|
|
初步修正如下:
@echo off
echo wscript.echo dateadd("d",-2,date) >%tmp%\tmp.vbs
for /f "tokens=1-3 delims=/ " %%a in ('cscript /nologo %tmp%\tmp.vbs') do (set year=%%a& set month=%%b& set day=%%c)
if %month% LEQ 9 set month=0%month%
if %day% LEQ 9 set day=0%day%
rem 去掉字串尾端空白
set day=%day:~,2%
set BACKUPDIR=s:\upload
set BACKUPDIR2=s:\uploadbackup
set BACKUPFILE=%BACKUPDIR2%\%year%%month%%day%
set FTPDIR2=FundX
set LOGFILE=%year%%month%%day%_backup.log
echo %LOGFILE%
echo. | date | findstr "現在日期" >> %LOGFILE%
echo. | time | findstr "現在時間" >> %LOGFILE%
:ftpsession
for /f "tokens=1-3 delims= " %%i in (ftp.cfg) do (set FTPSERVER=%%i&set USERNAME=%%j&set PASSWORD=%%k)
rem echo open %FTPSERVER% > ftpscript.txt
rem echo user %USERNAME% %PASSWORD% >> ftpscript.txt
echo lcd %BACKUPDIR% > ftpscript.txt
for /f %%m in (pbank.txt) do (
echo cd %%m>>ftpscript.txt
echo mget *%year%%month%%day%.*>> ftpscript.txt
rem echo mget *.*>> ftpscript.txt
echo cd ..>> ftpscript.txt
)
echo cd %FTPDIR2%>>ftpscript.txt
echo mget *%year%%month%%day%.*>> ftpscript.txt
rem echo get *.*>> ftpscript.txt
echo dir *%year%%month%%day%.*>> ftpscript.txt
rem echo mget *.*>> ftpscript.txt
echo bye >> ftpscript.txt
echo ---=== ftp session begins ===--->> %LOGFILE%
echo ftp %FTPSERVER% to %BACKUPDIR% >> %LOGFILE%
echo mget *%year%%month%%day%.*>>%LOGFILE%
psftp %FTPSERVER% -l %USERNAME% -pw %PASSWORD% -be -b ftpscript.txt >> %LOGFILE%
xcopy %BACKUPDIR%\*%year%%month%%day%.* %BACKUPDIR2% /E/C/Q/R/Y
xcopy %BACKUPDIR%\*.* %BACKUPDIR2% /E/C/Q/R/Y
if not exist %BACKUPDIR2%\%year%%month%%day% mkdir %BACKUPDIR2%\%year%%month%%day%
move /Y %BACKUPDIR2%\*%year%%month%%day%.* %BACKUPDIR2%\%year%%month%%day%
move /Y %BACKUPDIR2%\*.* %BACKUPDIR2%\%year%%month%%day%
echo ---=== ftp session ends ===--->> %LOGFILE%
echo. |time | findstr "現在時間">> %LOGFILE%
echo %BACKUPDIR2%\%year%%month%%day%>> %LOGFILE%
echo %BACKUPFILE1%>> %LOGFILE%
echo.>> %LOGFILE%
rem del ftpscript.txt
rem del %LOGFILE%
move /Y I:\wSTN_IO\%LOGFILE% %BACKUPDIR2%\%year%%month%%day%
move /Y I:\wSTN_IO\ftpscript.txt %BACKUPDIR2%\%year%%month%%day%
set TARGET=
set TARGETNAME=
set BACKUPDIR=
set BACKUPFILE=
set LOGFILE=
set FTPSERVER=
set USERNAME=
set PASSWORD=
:end
說明如下:
將原8~11行搬移至第2行以取得year month day變數的定義
增加第7行, 修正day變數尾端有空白字串的bug
刪除(這裡我先用rem註解掉)原程式中的19-20行
rem echo open %FTPSERVER% > ftpscript.txt
rem echo user %USERNAME% %PASSWORD% >> ftpscript.txt
同時修改原第21行如下:
echo lcd %BACKUPDIR% > ftpscript.txt
另外我不知道你用cd \的原因為何,是否可以試著把cd \ 改為cd ..
將原第26行改為
echo cd ..>> ftpscript.txt
參考資料:
幾個在寫 MS-DOS batch script 時好用的動作
|
 |
|
|
starzine您好:
可否先將bat檔中的這一行註解掉:
del ftpscript.txt
方法就是前面加上rem,如下:
rem del ftpscript.txt
然後你再執行一次,接著你把ftpscript.txt和log檔都傳上來,比較方便除錯,謝謝~
|
 |
|
|
今天發現有些主機(REHL 3.3: mutt-1.4.1-3.4, RH Linux 7.3: mutt-1.2.5.1-1)使用mutt寄出來的信件寄件人會變成root<>,而被當成廣告信,接著遭到郵件伺服器的封鎖,因此有收不到信的狀況。
解決方法就是指定寄件人From:
mutt -e 'my_hdr from:客服中心<service@andowson.com>' -s "測試資料" -a /tmp/test.txt somebody@andowson.com < /dev/null
這樣子就可以正常收到信了
參考資料:
http://pegasus923.pixnet.net/blog/post/33608243-%E5%9C%A8linux%E4%B8%8A%E5%88%A9%E7%94%A8mutt%E6%8C%87%E4%BB%A4%E5%AF%84%E9%99%84%E5%8A%A0%E6%AA%94mail
|
 |
|
|
今天發現用原來的方法還是無法真正的解決,找到了下面的網頁:
http://plone.lucidsolutions.co.nz/linux/rpm/yum-metadata-file-does-not-match-checksum
發現這個問題的真正原因是 http caching,所以使用yum clean all並無法解決問題,
我決定採用讓yum暫時不要使用http caching的猛藥
將/etc/yum.conf加上
http_caching=none
再重新執行一次
yum update
這次就OK了。
|
 |
|
|
寄件者只能有一個,可以透過Email類別的setFrom的method來設定,可接受三種參數呼叫方式:
setFrom(String email)
setFrom(String email, String name)
setFrom(String email, String name, String charset)
如果要 收件者,可以透過Email類別的addTo的method來增加,類似setFrom有三種參數呼叫方式:
addTo(String email)
addTo(String email, String name)
addTo(String email, String name, String charset)
收件者可以有多個,只要連續呼叫多次的addTo即可(例如透過迴圈)或者先將收件者整理成一個清單(List),再呼叫setTo一次設定好
setTo(Collection aCollection)
至於您的錯誤訊息,可能是charset編碼問題,也可能是其他問題,得看到程式碼才能得知。
|
 |
|
|
|
今天在Eclipse中遇到下面的錯誤:
Access restriction: The type JPEGCodec is not accessible due to restriction on required library C:\Program Files\Java\jre6\lib\rt.jar
解決方法:
點選Eclipse的Project Name->Build Path ->Configure Build Path->Library
先remove JRE System Library[jre6],再按Add Library加入JRE System Library
|
 |
|
|
最近發現一台RHEL 5.1伺服器的/var/log/message出現這樣的錯誤訊息:
Nov 21 14:19:01 localhost restorecond: Will not restore a file with more than one hard link (/etc/resolv.conf) No such file or directory
Nov 21 16:21:51 localhost restorecond: Will not restore a file with more than one hard link (/etc/resolv.conf) No such file or directory
Nov 22 09:39:47 localhost restorecond: Will not restore a file with more than one hard link (/etc/resolv.conf) No such file or directory
Nov 22 09:40:39 localhost restorecond: Will not restore a file with more than one hard link (/etc/resolv.conf) Invalid argument
因為在CentOS/RHEL中/etc/sysconfig/networking/profiles/default/resolv.conf是hard link到/etc/resolv.conf,我們可以透過下列指令找出全部的hard link
find / -xdev -samefile /etc/resolv.conf
輸出大致如下:
/etc/sysconfig/networking/profiles/default/resolv.conf
/etc/resolv.conf
解法,用root權限依序執行下列步驟即可:
rm /etc/sysconfig/networking/profiles/default/resolv.conf
restorecon /etc/resolv.conf
ln /etc/resolv.conf /etc/sysconfig/networking/profiles/default/resolv.conf
參考資料:
http://www.cyberciti.biz/faq/linux-rhel-fedora-centos-restorecond-will-not-restoreafile/
|
 |
|
|
starzine您好:
還是老話一句,請仔細觀察我的範例程式,細節就是魔鬼啦:
將您的小批次檔存檔為test.bat,利用cmd開啟一個DOS 命令視窗後,執行test,顯示下列的錯誤訊息
這個時候不應有 do(。
不知道您有沒有發現,我的範例程式do和(中間有空一格?
將do(改為do (後,test.bat就可以正常執行了(前提是假設pbank.txt存在啦)
另外,%%i可否變成%%m?
這個當然是可以的,不過要改完整就是了,不要只改到一個地方:
@echo off
for /f %%m in (pbank.txt) do (
echo %%m
)
最後我不清楚你問的@echo off可以寫在FTP裡面嗎? 這裡的FTP是指ftpscript.txt嗎?
|
 |
|
|