一、多種方式讀檔案內容。【參考:http://www.ibm.com/developerworks/cn/java/j-lo-javaio/】
1、按位元組讀取檔案內容
2、按字元讀取檔案內容
3、按行讀取檔案內容
4、隨機讀取檔案內容
001 |
import java.io.BufferedReader;
|
002 |
import java.io.File;
|
003 |
import java.io.FileInputStream;
|
004 |
import java.io.FileReader;
|
005 |
import java.io.IOException;
|
006 |
import java.io.InputStream;
|
007 |
import java.io.InputStreamReader;
|
008 |
import java.io.RandomAccessFile;
|
009 |
import java.io.Reader;
|
010 |
public class ReadFromFile {
|
011 |
/** |
012 |
* 以位元組為單位讀取檔案,常用於讀二進位制檔案,如圖片、聲音、影像等檔案。
|
013 |
* @param fileName 檔案的名
|
014 |
*/
|
015 |
public static void readFileByBytes(String fileName){
|
016 |
File file = new File(fileName);
|
017 |
InputStream in = null ;
|
018 |
try {
|
019 |
System.out.println( "以位元組為單位讀取檔案內容,一次讀一個位元組:" );
|
020 |
// 一次讀一個位元組
|
021 |
in = new FileInputStream(file);
|
022 |
int tempbyte;
|
023 |
while ((tempbyte=in.read()) != - 1 ){
|
024 |
System.out.write(tempbyte);
|
025 |
}
|
026 |
in.close();
|
027 |
} catch (IOException e) {
|
028 |
e.printStackTrace();
|
029 |
return ;
|
030 |
}
|
031 |
try {
|
032 |
System.out.println( "以位元組為單位讀取檔案內容,一次讀多個位元組:" );
|
033 |
//一次讀多個位元組
|
034 |
byte [] tempbytes = new byte [ 100 ];
|
035 |
int byteread = 0 ;
|
036 |
in = new FileInputStream(fileName);
|
037 |
ReadFromFile.showAvailableBytes(in);
|
038 |
//讀入多個位元組到位元組陣列中,byteread為一次讀入的位元組數
|
039 |
while ((byteread = in.read(tempbytes)) != - 1 ){
|
040 |
System.out.write(tempbytes, 0 , byteread);
|
041 |
}
|
042 |
} catch (Exception e1) {
|
043 |
e1.printStackTrace();
|
044 |
} finally {
|
045 |
if (in != null ){
|
046 |
try {
|
047 |
in.close();
|
048 |
} catch (IOException e1) {
|
049 |
}
|
050 |
}
|
051 |
}
|
052 |
} |
053 |
/** |
054 |
* 以字元為單位讀取檔案,常用於讀文字,數字等型別的檔案
|
055 |
* @param fileName 檔名
|
056 |
*/
|
057 |
public static void readFileByChars(String fileName){
|
058 |
File file = new File(fileName);
|
059 |
Reader reader = null ;
|
060 |
try {
|
061 |
System.out.println( "以字元為單位讀取檔案內容,一次讀一個位元組:" );
|
062 |
// 一次讀一個字元
|
063 |
reader = new InputStreamReader( new FileInputStream(file));
|
064 |
int tempchar;
|
065 |
while ((tempchar = reader.read()) != - 1 ){
|
066 |
//對於windows下,/r/n這兩個字元在一起時,表示一個換行。
|
067 |
//但如果這兩個字元分開顯示時,會換兩次行。
|
068 |
//因此,遮蔽掉/r,或者遮蔽/n。否則,將會多出很多空行。
|
069 |
if ((( char )tempchar) != '/r' ){
|
070 |
System.out.print(( char )tempchar);
|
071 |
}
|
072 |
}
|
073 |
reader.close();
|
074 |
} catch (Exception e) {
|
075 |
e.printStackTrace();
|
076 |
}
|
077 |
try {
|
078 |
System.out.println( "以字元為單位讀取檔案內容,一次讀多個位元組:" );
|
079 |
//一次讀多個字元
|
080 |
char [] tempchars = new char [ 30 ];
|
081 |
int charread = 0 ;
|
082 |
reader = new InputStreamReader( new FileInputStream(fileName));
|
083 |
//讀入多個字元到字元陣列中,charread為一次讀取字元數
|
084 |
while ((charread = reader.read(tempchars))!=- 1 ){
|
085 |
//同樣遮蔽掉/r不顯示
|
086 |
if ((charread == tempchars.length)&&(tempchars[tempchars.length- 1 ] != '/r' )){
|
087 |
System.out.print(tempchars);
|
088 |
} else {
|
089 |
for ( int i= 0 ; i<charread; i++){
|
090 |
if (tempchars[i] == '/r' ){
|
091 |
continue ;
|
092 |
} else {
|
093 |
System.out.print(tempchars[i]);
|
094 |
}
|
095 |
}
|
096 |
}
|
097 |
}
|
098 |
|
099 |
} catch (Exception e1) {
|
100 |
e1.printStackTrace();
|
101 |
} finally {
|
102 |
if (reader != null ){
|
103 |
try {
|
104 |
reader.close();
|
105 |
} catch (IOException e1) {
|
106 |
}
|
107 |
}
|
108 |
}
|
109 |
} |
110 |
/** |
111 |
* 以行為單位讀取檔案,常用於讀面向行的格式化檔案
|
112 |
* @param fileName 檔名
|
113 |
*/
|
114 |
public static void readFileByLines(String fileName){
|
115 |
File file = new File(fileName);
|
116 |
BufferedReader reader = null ;
|
117 |
try {
|
118 |
System.out.println( "以行為單位讀取檔案內容,一次讀一整行:" );
|
119 |
reader = new BufferedReader( new FileReader(file));
|
120 |
String tempString = null ;
|
121 |
int line = 1 ;
|
122 |
//一次讀入一行,直到讀入null為檔案結束
|
123 |
while ((tempString = reader.readLine()) != null ){
|
124 |
//顯示行號
|
125 |
System.out.println( "line " + line + ": " + tempString);
|
126 |
line++;
|
127 |
}
|
128 |
reader.close();
|
129 |
} catch (IOException e) {
|
130 |
e.printStackTrace();
|
131 |
} finally {
|
132 |
if (reader != null ){
|
133 |
try {
|
134 |
reader.close();
|
135 |
} catch (IOException e1) {
|
136 |
}
|
137 |
}
|
138 |
}
|
139 |
} |
140 |
/** |
141 |
* 隨機讀取檔案內容
|
142 |
* @param fileName 檔名
|
143 |
*/
|
144 |
public static void readFileByRandomAccess(String fileName){
|
145 |
RandomAccessFile randomFile = null ;
|
146 |
try {
|
147 |
System.out.println( "隨機讀取一段檔案內容:" );
|
148 |
// 開啟一個隨機訪問檔案流,按只讀方式
|
149 |
randomFile = new RandomAccessFile(fileName, "r" );
|
150 |
// 檔案長度,位元組數
|
151 |
long fileLength = randomFile.length();
|
152 |
// 讀檔案的起始位置
|
153 |
int beginIndex = (fileLength > 4 ) ? 4 : 0 ;
|
154 |
//將讀檔案的開始位置移到beginIndex位置。
|
155 |
randomFile.seek(beginIndex);
|
156 |
byte [] bytes = new byte [ 10 ];
|
157 |
int byteread = 0 ;
|
158 |
//一次讀10個位元組,如果檔案內容不足10個位元組,則讀剩下的位元組。
|
159 |
//將一次讀取的位元組數賦給byteread
|
160 |
while ((byteread = randomFile.read(bytes)) != - 1 ){
|
161 |
System.out.write(bytes, 0 , byteread);
|
162 |
}
|
163 |
} catch (IOException e){
|
164 |
e.printStackTrace();
|
165 |
} finally {
|
166 |
if (randomFile != null ){
|
167 |
try {
|
168 |
randomFile.close();
|
169 |
} catch (IOException e1) {
|
170 |
}
|
171 |
}
|
172 |
}
|
173 |
} |
174 |
/** |
175 |
* 顯示輸入流中還剩的位元組數
|
176 |
* @param in
|
177 |
*/
|
178 |
private static void showAvailableBytes(InputStream in){
|
179 |
try {
|
180 |
System.out.println( "當前位元組輸入流中的位元組數為:" + in.available());
|
181 |
} catch (IOException e) {
|
182 |
e.printStackTrace();
|
183 |
}
|
184 |
} |
185 |
186 |
public static void main(String[] args) {
|
187 |
String fileName = "C:/temp/newTemp.txt" ;
|
188 |
ReadFromFile.readFileByBytes(fileName);
|
189 |
ReadFromFile.readFileByChars(fileName);
|
190 |
ReadFromFile.readFileByLines(fileName);
|
191 |
ReadFromFile.readFileByRandomAccess(fileName);
|
192 |
} |
193 |
} |
二、將內容追加到檔案尾部
001 |
import java.io.FileWriter;
|
002 |
import java.io.IOException;
|
003 |
import java.io.RandomAccessFile;
|
004 |
005 |
/** |
006 |
* 將內容追加到檔案尾部 |
007 |
*/ |
008 |
public class AppendToFile {
|
009 |
010 |
/** |
011 |
* A方法追加檔案:使用RandomAccessFile
|
012 |
* @param fileName 檔名
|
013 |
* @param content 追加的內容
|
014 |
*/
|
015 |
public static void appendMethodA(String fileName, String content){
|
016 |
try {
|
017 |
// 開啟一個隨機訪問檔案流,按讀寫方式
|
018 |
RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw" );
|
019 |
// 檔案長度,位元組數
|
020 |
long fileLength = randomFile.length();
|
021 |
//將寫檔案指標移到檔案尾。
|
022 |
randomFile.seek(fileLength);
|
023 |
randomFile.writeBytes(content);
|
024 |
randomFile.close();
|
025 |
} catch (IOException e){
|
026 |
e.printStackTrace();
|
027 |
}
|
028 |
} |
029 |
/** |
030 |
* B方法追加檔案:使用FileWriter
|
031 |
* @param fileName
|
032 |
* @param content
|
033 |
*/
|
034 |
public static void appendMethodB(String fileName, String content){
|
035 |
try {
|
036 |
//開啟一個寫檔案器,建構函式中的第二個引數true表示以追加形式寫檔案
|
037 |
FileWriter writer = new FileWriter(fileName, true );
|
038 |
writer.write(content);
|
039 |
writer.close();
|
040 |
} catch (IOException e) {
|
041 |
e.printStackTrace();
|
042 |
}
|
043 |
} |
044 |
045 |
public static void main(String[] args) {
|
046 |
String fileName = "C:/temp/newTemp.txt" ;
|
047 |
String content = "new append!" ;
|
048 |
//按方法A追加檔案
|
049 |
AppendToFile.appendMethodA(fileName, content);
|
050 |
AppendToFile.appendMethodA(fileName, "append end. /n" );
|
051 |
//顯示檔案內容
|
052 |
ReadFromFile.readFileByLines(fileName);
|
053 |
//按方法B追加檔案
|
054 |
AppendToFile.appendMethodB(fileName, content);
|
055 |
AppendToFile.appendMethodB(fileName, "append end. /n" );
|
056 |
//顯示檔案內容
|
057 |
ReadFromFile.readFileByLines(fileName);
|
058 |
} |
059 |
} |
060 |
061 |
三檔案的各種操作類 |
062 |
063 |
import java.io.*;
|
064 |
065 |
/** |
066 |
* FileOperate.java |
067 |
* 檔案的各種操作 |
068 |
* @author 楊彩 http://blog.sina.com.cn/m/yangcai |
069 |
* 檔案操作 1.0 |
070 |
*/ |
071 |
072 |
public class FileOperate
|
073 |
{ |
074 |
075 |
public FileOperate()
|
076 |
{ |
077 |
} |
078 |
/** |
079 |
* 新建目錄 |
080 |
*/ |
081 |
public void newFolder(String folderPath)
|
082 |
{ |
083 |
try |
084 |
{ |
085 |
String filePath = folderPath; |
086 |
filePath = filePath.toString(); |
087 |
File myFilePath = new File(filePath);
|
088 |
if (!myFilePath.exists())
|
089 |
{ |
090 |
myFilePath.mkdir(); |
091 |
} |
092 |
System.out.println( "新建目錄操作 成功執行" );
|
093 |
} |
094 |
catch (Exception e)
|
095 |
{ |
096 |
System.out.println( "新建目錄操作出錯" );
|
097 |
e.printStackTrace(); |
098 |
} |
099 |
} |
100 |
/** |
101 |
* 新建檔案 |
102 |
*/ |
103 |
public void newFile(String filePathAndName, String fileContent)
|
104 |
{ |
105 |
try |
106 |
{ |
107 |
String filePath = filePathAndName; |
108 |
filePath = filePath.toString(); |
109 |
File myFilePath = new File(filePath);
|
110 |
if (!myFilePath.exists())
|
111 |
{ |
112 |
myFilePath.createNewFile(); |
113 |
} |
114 |
FileWriter resultFile = new FileWriter(myFilePath);
|
115 |
PrintWriter myFile = new PrintWriter(resultFile);
|
116 |
String strContent = fileContent; |
117 |
myFile.println(strContent); |
118 |
resultFile.close(); |
119 |
System.out.println( "新建檔案操作 成功執行" );
|
120 |
} |
121 |
catch (Exception e)
|
122 |
{ |
123 |
System.out.println( "新建目錄操作出錯" );
|
124 |
e.printStackTrace(); |
125 |
} |
126 |
} |
127 |
/** |
128 |
* 刪除檔案 |
129 |
*/ |
130 |
public void delFile(String filePathAndName)
|
131 |
{ |
132 |
try |
133 |
{ |
134 |
String filePath = filePathAndName; |
135 |
filePath = filePath.toString(); |
136 |
File myDelFile = new File(filePath);
|
137 |
myDelFile.delete(); |
138 |
System.out.println( "刪除檔案操作 成功執行" );
|
139 |
} |
140 |
catch (Exception e)
|
141 |
{ |
142 |
System.out.println( "刪除檔案操作出錯" );
|
143 |
e.printStackTrace(); |
144 |
} |
145 |
} |
146 |
/** |
147 |
* 刪除資料夾 |
148 |
*/ |
149 |
public void delFolder(String folderPath)
|
150 |
{ |
151 |
try |
152 |
{ |
153 |
delAllFile(folderPath); //刪除完裡面所有內容
|
154 |
String filePath = folderPath; |
155 |
filePath = filePath.toString(); |
156 |
File myFilePath = new File(filePath);
|
157 |
if (myFilePath.delete()) { //刪除空資料夾
|
158 |
System.out.println( "刪除資料夾" + folderPath + "操作 成功執行" );
|
159 |
} else {
|
160 |
System.out.println( "刪除資料夾" + folderPath + "操作 執行失敗" );
|
161 |
} |
162 |
} |
163 |
catch (Exception e)
|
164 |
{ |
165 |
System.out.println( "刪除資料夾操作出錯" );
|
166 |
e.printStackTrace(); |
167 |
} |
168 |
} |
169 |
/** |
170 |
* 刪除資料夾裡面的所有檔案 |
171 |
* @param path String 資料夾路徑 如 c:/fqf |
172 |
*/ |
173 |
public void delAllFile(String path)
|
174 |
{ |
175 |
File file = new File(path);
|
176 |
if (!file.exists())
|
177 |
{ |
178 |
return ;
|
179 |
} |
180 |
if (!file.isDirectory())
|
181 |
{ |
182 |
return ;
|
183 |
} |
184 |
String[] tempList = file.list(); |
185 |
File temp = null ;
|
186 |
for ( int i = 0 ; i < tempList.length; i++)
|
187 |
{ |
188 |
if (path.endsWith(File.separator))
|
189 |
{ |
190 |
temp = new File(path + tempList[i]);
|
191 |
} |
192 |
else |
193 |
{ |
194 |
temp = new File(path + File.separator + tempList[i]);
|
195 |
} |
196 |
if (temp.isFile())
|
197 |
{ |
198 |
temp.delete(); |
199 |
} |
200 |
if (temp.isDirectory())
|
201 |
{ |
202 |
//delAllFile(path+"/"+ tempList[i]);//先刪除資料夾裡面的檔案 |
203 |
delFolder(path+ File.separatorChar + tempList[i]); //再刪除空資料夾
|
204 |
} |
205 |
} |
206 |
System.out.println( "刪除檔案操作 成功執行" );
|
207 |
} |
208 |
/** |
209 |
* 複製單個檔案 |
210 |
* @param oldPath String 原檔案路徑 如:c:/fqf.txt |
211 |
* @param newPath String 複製後路徑 如:f:/fqf.txt |
212 |
*/ |
213 |
public void copyFile(String oldPath, String newPath)
|
214 |
{ |
215 |
try |
216 |
{ |
217 |
int bytesum = 0 ;
|
218 |
int byteread = 0 ;
|
219 |
File oldfile = new File(oldPath);
|
220 |
if (oldfile.exists())
|
221 |
{ |
222 |
//檔案存在時 |
223 |
InputStream inStream = new FileInputStream(oldPath); //讀入原檔案
|
224 |
FileOutputStream fs = new FileOutputStream(newPath);
|
225 |
byte [] buffer = new byte [ 1444 ];
|
226 |
while ( (byteread = inStream.read(buffer)) != - 1 )
|
227 |
{ |
228 |
bytesum += byteread; //位元組數 檔案大小
|
229 |
System.out.println(bytesum); |
230 |
fs.write(buffer, 0 , byteread);
|
231 |
} |
232 |
inStream.close(); |
233 |
} |
234 |
System.out.println( "刪除資料夾操作 成功執行" );
|
235 |
} |
236 |
catch (Exception e)
|
237 |
{ |
238 |
System.out.println( "複製單個檔案操作出錯" );
|
239 |
e.printStackTrace(); |
240 |
} |
241 |
} |
242 |
/** |
243 |
* 複製整個資料夾內容 |
244 |
* @param oldPath String 原檔案路徑 如:c:/fqf |
245 |
* @param newPath String 複製後路徑 如:f:/fqf/ff |
246 |
*/ |
247 |
public void copyFolder(String oldPath, String newPath)
|
248 |
{ |
249 |
try |
250 |
{ |
251 |
( new File(newPath)).mkdirs(); //如果資料夾不存在 則建立新資料夾
|
252 |
File a= new File(oldPath);
|
253 |
String[] file=a.list(); |
254 |
File temp= null ;
|
255 |
for ( int i = 0 ; i < file.length; i++)
|
256 |
{ |
257 |
if (oldPath.endsWith(File.separator))
|
258 |
{ |
259 |
temp= new File(oldPath+file[i]);
|
260 |
} |
261 |
else |
262 |
{ |
263 |
temp= new File(oldPath+File.separator+file[i]);
|
264 |
} |
265 |
if (temp.isFile())
|
266 |
{ |
267 |
FileInputStream input = new FileInputStream(temp);
|
268 |
FileOutputStream output = new FileOutputStream(newPath + "/" +
|
269 |
(temp.getName()).toString()); |
270 |
byte [] b = new byte [ 1024 * 5 ];
|
271 |
int len;
|
272 |
while ( (len = input.read(b)) != - 1 )
|
273 |
{ |
274 |
output.write(b, 0 , len);
|
275 |
} |
276 |
output.flush(); |
277 |
output.close(); |
278 |
input.close(); |
279 |
} |
280 |
if (temp.isDirectory())
|
281 |
{ |
282 |
//如果是子資料夾 |
283 |
copyFolder(oldPath+ "/" +file[i],newPath+ "/" +file[i]);
|
284 |
} |
285 |
} |
286 |
System.out.println( "複製資料夾操作 成功執行" );
|
287 |
} |
288 |
catch (Exception e)
|
289 |
{ |
290 |
System.out.println( "複製整個資料夾內容操作出錯" );
|
291 |
e.printStackTrace(); |
292 |
} |
293 |
} |
294 |
/** |
295 |
* 移動檔案到指定目錄 |
296 |
* @param oldPath String 如:c:/fqf.txt |
297 |
* @param newPath String 如:d:/fqf.txt |
298 |
*/ |
299 |
public void moveFile(String oldPath, String newPath)
|
300 |
{ |
301 |
copyFile(oldPath, newPath); |
302 |
delFile(oldPath); |
303 |
} |
304 |
/** |
305 |
* 移動檔案到指定目錄 |
306 |
* @param oldPath String 如:c:/fqf.txt |
307 |
* @param newPath String 如:d:/fqf.txt |
308 |
*/ |
309 |
public void moveFolder(String oldPath, String newPath)
|
310 |
{ |
311 |
copyFolder(oldPath, newPath); |
312 |
delFolder(oldPath); |
313 |
} |
314 |
public static void main(String args[])
|
315 |
{ |
316 |
String aa,bb; |
317 |
boolean exitnow= false ;
|
318 |
System.out.println( "使用此功能請按[1] 功能一:新建目錄" );
|
319 |
System.out.println( "使用此功能請按[2] 功能二:新建檔案" );
|
320 |
System.out.println( "使用此功能請按[3] 功能三:刪除檔案" );
|
321 |
System.out.println( "使用此功能請按[4] 功能四:刪除資料夾" );
|
322 |
System.out.println( "使用此功能請按[5] 功能五:刪除資料夾裡面的所有檔案" );
|
323 |
System.out.println( "使用此功能請按[6] 功能六:複製檔案" );
|
324 |
System.out.println( "使用此功能請按[7] 功能七:複製資料夾的所有內容" );
|
325 |
System.out.println( "使用此功能請按[8] 功能八:移動檔案到指定目錄" );
|
326 |
System.out.println( "使用此功能請按[9] 功能九:移動資料夾到指定目錄" );
|
327 |
System.out.println( "使用此功能請按[10] 退出程式" );
|
328 |
while (!exitnow)
|
329 |
{ |
330 |
FileOperate fo= new FileOperate();
|
331 |
try |
332 |
{ |
333 |
BufferedReader Bin= new BufferedReader( new InputStreamReader(System.in));
|
334 |
String a=Bin.readLine(); |
335 |
int b=Integer.parseInt(a);
|
336 |
switch (b)
|
337 |
{ |
338 |
case 1 :System.out.println( "你選擇了功能一 請輸入目錄名" );
|
339 |
aa=Bin.readLine(); |
340 |
fo.newFolder(aa); |
341 |
break ;
|
342 |
case 2 :System.out.println( "你選擇了功能二 請輸入檔名" );
|
343 |
aa=Bin.readLine(); |
344 |
System.out.println( "請輸入在" +aa+ "中的內容" );
|
345 |
bb=Bin.readLine(); |
346 |
fo.newFile(aa,bb); |
347 |
break ;
|
348 |
case 3 :System.out.println( "你選擇了功能三 請輸入檔名" );
|
349 |
aa=Bin.readLine(); |
350 |
fo.delFile(aa); |
351 |
break ;
|
352 |
case 4 :System.out.println( "你選擇了功能四 請輸入檔名" );
|
353 |
aa=Bin.readLine(); |
354 |
fo.delFolder(aa); |
355 |
break ;
|
356 |
case 5 :System.out.println( "你選擇了功能五 請輸入檔名" );
|
357 |
aa=Bin.readLine(); |
358 |
fo.delAllFile(aa); |
359 |
break ;
|
360 |
case 6 :System.out.println( "你選擇了功能六 請輸入檔名" );
|
361 |
aa=Bin.readLine(); |
362 |
System.out.println( "請輸入目標檔名" );
|
363 |
bb=Bin.readLine(); |
364 |
fo.copyFile(aa,bb); |
365 |
break ;
|
366 |
case 7 :System.out.println( "你選擇了功能七 請輸入原始檔名" );
|
367 |
aa=Bin.readLine(); |
368 |
System.out.println( "請輸入目標檔名" );
|
369 |
bb=Bin.readLine(); |
370 |
fo.copyFolder(aa,bb); |
371 |
break ;
|
372 |
case 8 :System.out.println( "你選擇了功能八 請輸入原始檔名" );
|
373 |
aa=Bin.readLine(); |
374 |
System.out.println( "請輸入目標檔名" );
|
375 |
bb=Bin.readLine(); |
376 |
fo.moveFile(aa,bb); |
377 |
break ;
|
378 |
case 9 :System.out.println( "你選擇了功能九 請輸入原始檔名" );
|
379 |
aa=Bin.readLine(); |
380 |
System.out.println( "請輸入目標檔名" );
|
381 |
bb=Bin.readLine(); |
382 |
fo.moveFolder(aa,bb); |
383 |
break ;
|
384 |
case 10 :exitnow= true ;
|
385 |
System.out.println( "程式結束,請退出" );
|
386 |
break ;
|
387 |
default :System.out.println( "輸入錯誤.請輸入1-10之間的數" );
|
388 |
} |
389 |
System.out.println( "請重新選擇功能" );
|
390 |
} |
391 |
catch (Exception e)
|
392 |
{ |
393 |
System.out.println( "輸入錯誤字元或程式出錯" );
|
394 |
} |
395 |
} |
396 |
} |
397 |
} |