### 1. 構造方法
| **構造方法** | **描述** |
|-----|-----|
| File(String pathname) | 通過將給定的路徑名字符串轉換為抽象路徑名來創建一個新的文件實例。 |
| File(String parent , String child) | 通過給定的父路徑名字符串和子路徑名字符串來創建一個新的文件實例。 |
| File(File parent , String child) | 通過給定的父抽象路徑對象和子路徑名字符串來創建一個新的文件實例。 |
| File(URI uri) | 通過給定的URI來創建一個新的文件實例 |
~~~
package com.qunar.bean;
import java.io.File;
import java.net.URISyntaxException;
public class FileDemo {
public static void main(String[] args) throws URISyntaxException {
String pathname = "E:\\Recommended system";
// File(String pathname)
File file1 =new File(pathname);
// File(String parent,String child)
File file2 =new File(pathname,"train_data.txt");
// File(File parent,String child)
File file3 = new File(file1, "train_data.txt");
// File(URI uri)
// File file4 =new File(new URI(""));
// separator 跨平臺分隔符
File file4 =new File("E:"+File.separator+"Recommended system");
System.out.println(file1);
System.out.println(file2);
System.out.println(file3);
System.out.println(file4);
}
}
~~~
運行結果:
<table cellspacing="0" cellpadding="0" style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:919px"><tbody><tr><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:918px"><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">? ?</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">? ?E:\Recommended?system</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">? ?E:\Recommended?system\train_data.txt</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">? ?E:\Recommended?system\train_data.txt</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">? ?E:\Recommended?system</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑"><br/></span></div></td></tr></tbody></table>
### 2.創建與刪除方法
<table cellspacing="0" cellpadding="0" style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:919px"><tbody><tr><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); text-align:center; width:459px"><strong>方法</strong></td><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); text-align:center; width:458px"><strong>描述</strong></td></tr><tr><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); text-align:center; width:459px">boolean createNewFile()</td><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:458px">如果文件存在返回false,否則返回true并且創建文件?</td></tr><tr><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); text-align:center; width:459px">boolean mkdir()</td><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:458px">創建目錄</td></tr><tr><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); text-align:center; width:459px">boolean mkdirs()</td><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:458px">創建多級目錄</td></tr><tr><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); text-align:center; width:459px">boolean delete()</td><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:458px">如果文件存在返回true并且刪除文件,否則返回false</td></tr><tr><td colspan="1" style="border-collapse:collapse; border:1px solid rgb(187,187,187); text-align:center; width:459px">boolean deleteOnExit()</td><td colspan="1" style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:458px">文件使用完成后刪除</td></tr></tbody></table>
~~~
package com.qunar.bean;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
public class FileDemo {
public static void main(String[] args) throws URISyntaxException {
String pathname = "D:\\Recommended system.txt";
// 創建文件實例
File file = new File(pathname);
try {
// 如果文件存在返回false,否則返回true并且創建文件
if(file.createNewFile()){
System.out.println("創建文件["+pathname+"]");
}//if
else{
System.out.println("文件["+pathname+"]已存在");
}//else
} catch (IOException e) {
e.printStackTrace();
}
}
}
~~~
~~~
package com.qunar.bean;
import java.io.File;
public class FileDemo {
public static void main(String[] args) {
String pathname = "D:\\Recommended system.txt";
// 創建文件實例
File file = new File(pathname);
//如果文件存在返回true并且刪除文件,否則返回false
if(file.delete()){
System.out.println("刪除文件["+pathname+"]");
}//if
else{
System.out.println("文件["+pathname+"]不存在");
}//else
}
}
~~~
~~~
package com.qunar.bean;
import java.io.File;
public class FileDemo {
public static void main(String[] args) {
String pathname = "D:\\Recommended system";
String pathname2 = "D:\\Recommended system2\\Paper\\News";
// 創建文件實例
File file = new File(pathname);
File file2 = new File(pathname2);
//如果目錄不存在返回true并且創建目錄,否則返回false
if(file.mkdir()){
System.out.println("創建目錄["+pathname+"]");
}//if
else{
System.out.println("目錄["+pathname+"]已存在");
}//else
//如果多級目錄不存在返回true并且創建多級目錄,否則返回false
if(file2.mkdirs()){
System.out.println("創建多級目錄["+pathname2+"]");
}//if
else{
System.out.println("多級目錄["+pathname2+"]已存在");
}//else
}
}
~~~
### 3.判斷方法
| **方法** | **描述** |
|-----|-----|
| boolean canExecute() | 判斷文件是否可執行 |
| boolean canRead() | 判斷文件是否可讀 |
| boolean canWrite() | 判斷文件是否可寫 |
| boolean exists() | 判斷文件是否存在 |
| boolean isDirectory() | 判斷是否是目錄 |
| boolean isFile() | 判斷是否是文件 |
| boolean isHidden() | 判斷是否隱藏 |
| boolean isAbsolute() | 判斷是否是絕對路徑 文件不存在也能判斷 |
~~~
package com.qunar.bean;
import java.io.File;
public class FileDemo {
public static void main(String[] args) {
String pathname = "D:\\Recommended system\\train_data.txt";
// 創建文件實例
File file = new File(pathname);
// 判斷文件是否可執行
if(file.canExecute()){
System.out.println("文件["+pathname+"]可執行");
}//if
else{
System.out.println("文件["+pathname+"]不可執行");
}//else
// 判斷文件是否可讀
if(file.canRead()){
System.out.println("文件["+pathname+"]可讀");
}//if
else{
System.out.println("文件["+pathname+"]不可讀");
}//else
// 判斷文件是否可寫
if(file.canWrite()){
System.out.println("文件["+pathname+"]可寫");
}//if
else{
System.out.println("文件["+pathname+"]不可寫");
}//else
// 判斷文件是否存在
if(file.exists()){
System.out.println("文件["+pathname+"]存在");
}//if
else{
System.out.println("文件["+pathname+"]不存在");
}//else
// 判斷文件是否是目錄
if(file.isDirectory()){
System.out.println("文件["+pathname+"]是目錄文件");
}//if
else{
System.out.println("文件["+pathname+"]不是目錄文件");
}//else
// 判斷是否是一個絕對路徑
if(file.isAbsolute()){
System.out.println("["+pathname+"]是絕對路徑");
}//if
else{
System.out.println("["+pathname+"]不是絕對路徑");
}//else
}
}
~~~
### 4.獲取方法
<table cellspacing="0" cellpadding="0" style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:919px"><tbody><tr><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); text-align:center; width:459px"><strong>方法</strong></td><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); text-align:center; width:458px"><strong>描述</strong></td></tr><tr><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:459px">String getName()</td><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:458px">返回文件或者是目錄的名稱</td></tr><tr><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:459px">String getPath()</td><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:458px">返回路徑</td></tr><tr><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:459px">String getAbsolutePath()</td><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:458px">返回絕對路徑</td></tr><tr><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:459px">String getParent()</td><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:458px">返回父目錄,如果沒有父目錄則返回null</td></tr><tr><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:459px">long lastModified()</td><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:458px">返回最后一次修改的時間</td></tr><tr><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:459px">long length()</td><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:458px">返回文件的長度</td></tr><tr><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:459px">File[] liseRoots()</td><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:458px">返回系統可用的系統盤</td></tr><tr><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:459px">String[] list()?</td><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:458px">返回一個字符串數組,給定路徑下的文件或目錄名稱字符串</td></tr><tr><td colspan="1" style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:459px">String[] list(FilenameFilter filter)</td><td colspan="1" style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:458px">返回滿足過濾器要求的一個字符串數組</td></tr><tr><td colspan="1" style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:459px">File[] ?listFiles()</td><td colspan="1" style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:458px">返回一個文件對象數組,給定路徑下文件或目錄</td></tr><tr><td colspan="1" style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:459px">File[] listFiles(FilenameFilter filter)</td><td colspan="1" style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:458px">返回滿足過濾器要求的一個文件對象數組</td></tr></tbody></table>
~~~
package com.qunar.bean;
import java.io.File;
public class FileDemo {
public static void main(String[] args) {
String pathname = "E:\\Recommended system";
// 創建文件實例
File file = new File(pathname);
// 返回文件或者目錄的名稱
System.out.println("GetName->"+file.getName());
// 返回路徑
System.out.println("GetPath->"+file.getPath());
// 返回文件長度
System.out.println("Length->"+file.length());
// 返回給定路徑下的文件和目錄字符串數組
String[] files = file.list();
for (String name : files) {
System.out.println("名稱:"+name);
}//for
File[] files2 = file.listFiles();
for (File file2 : files2) {
if(file2.isFile()){
System.out.println("文件名稱:"+file2.getName());
}//if
else if(file2.isDirectory()){
System.out.println("目錄名稱:"+file2.getName());
}//else
}//for
// 列出可用的系統盤
File[] files3 = file.listRoots();
for (File file3 : files3) {
System.out.println("文件名稱:"+file3.getPath());
}
}
}
~~~
運行結果:
<table cellspacing="0" cellpadding="0" style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:919px"><tbody><tr><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:918px"><br/><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">GetName->Recommended?system</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">GetPath->E:\Recommended?system</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">Length->16384</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">名稱:540135b87c6d0.csv</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">名稱:5403c3df31780.doc</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">名稱:baidu-salon-38-1.mp3</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">名稱:baidu-salon-38-1.pdf</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">名稱:TextAnalysis.rar</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">名稱:train_data.txt</span></div><div><span style="color:windowtext; font-family:微軟雅黑; font-size:14pt; line-height:1.5">名稱:中文停用詞表(比較全面_有1208個停用詞).txt</span><br/></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">名稱:主題提起</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">名稱:協同過濾</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">名稱:天貓推薦算法.mp3</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">名稱:天貓推薦算法.pdf</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">名稱:推薦系統入門.zip</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">名稱:推薦系統實戰經驗與效果提升之道.pdf</span></div><div><br/></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">文件名稱:540135b87c6d0.csv</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">文件名稱:5403c3df31780.doc</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">文件名稱:baidu-salon-38-1.mp3</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">文件名稱:baidu-salon-38-1.pdf</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">文件名稱:TextAnalysis.rar</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">文件名稱:train_data.txt</span></div><div><span style="color:windowtext; font-family:微軟雅黑; font-size:14pt; line-height:1.5">文件名稱:中文停用詞表(比較全面_有1208個停用詞).txt</span><br/></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">目錄名稱:主題提起</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">目錄名稱:協同過濾</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">文件名稱:天貓推薦算法.mp3</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">文件名稱:天貓推薦算法.pdf</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">文件名稱:推薦系統入門.zip</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">文件名稱:推薦系統實戰經驗與效果提升之道.pdf</span></div><div><br/></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">文件名稱:C:\</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">文件名稱:D:\</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">文件名稱:E:\</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">文件名稱:F:\</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">文件名稱:G:\</span></div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">文件名稱:H:\</span>??</td></tr></tbody></table>
文件過濾例子:
~~~
package com.qunar.bean;
import java.io.File;
import java.io.FilenameFilter;
public class FileDemo {
public static void main(String[] args) {
String pathname = "E:\\Recommended system";
// 創建文件實例
File file = new File(pathname);
// 文件過濾
File[] files = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File file, String filename) {
return filename.endsWith(".mp3");
}
});
// 打印輸出
for (File file2 : files) {
System.out.println("名稱:"+file2.getName());
}//for
}
}
~~~
運行結果:
<table cellspacing="0" cellpadding="0" style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:919px"><tbody><tr><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:918px"><br/><div><span style="font-family:微軟雅黑; font-size:10.5pt; line-height:1.5">? ??</span><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">名稱:baidu-salon-38-1.mp3</span></div><div><span style="font-family:微軟雅黑; font-size:10.5pt; line-height:1.5">? ??</span><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">名稱:天貓推薦算法.mp3</span></div><span style="font-family:微軟雅黑">? ??</span><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">名稱:百度推薦實踐.mp3</span>??</td></tr></tbody></table>
列出文件夾下的全部問價或目錄:
~~~
package com.qunar.bean;
import java.io.File;
public class FileDemo {
public static void ListAllFile(File file){
if(!file.exists()){
throw new IllegalArgumentException("目錄["+file+"]不存在");
}//if
if(!file.isDirectory()){
throw new IllegalArgumentException("["+file+"]不是目錄");
}//if
// 列出指定路徑下的全部文件或目錄
File[] files = file.listFiles();
for (File fileName : files) {
// 判斷是否是目錄 如果是遞歸
if(fileName.isDirectory()){
ListAllFile(fileName);
}//if
// 否則打印輸出
else{
System.out.println(fileName.getPath());
}//else
}//for
}
public static void main(String[] args) {
String pathname = "E:\\Recommended system";
// 創建文件實例
File file = new File(pathname);
// 列出全部文件或目錄
ListAllFile(file);
}
}
~~~
運行結果:
<table cellspacing="0" cellpadding="0" style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:919px"><tbody><tr><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:918px"><br/><blockquote style="margin:0px 0px 0px 40px; border:none; padding:0px"><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">E:\Recommended?system\540135b87c6d0.csv</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">E:\Recommended?system\5403c3df31780.doc</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">E:\Recommended?system\baidu-salon-38-1.mp3</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">E:\Recommended?system\baidu-salon-38-1.pdf</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">E:\Recommended?system\TextAnalysis.rar</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">E:\Recommended?system\train_data.txt</span></div><div><span style="color:windowtext; font-family:微軟雅黑; font-size:14pt; line-height:1.5">E:\Recommended?system\中文停用詞表(比較全面_有1208個停用詞).txt</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">E:\Recommended?system\主題提起\中文新聞關鍵事件的主題句識別.pdf</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">E:\Recommended?system\主題提起\加入時間因素的個性化信息過濾技術.pdf</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">E:\Recommended?system\主題提起\動態新聞主題信息推薦系統設計.pdf</span></div><div><span style="font-family:微軟雅黑"><span style="font-size:19px; line-height:27px">...</span></span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">E:\Recommended?system\協同過濾\PatternRecognitionAndMachineLearning.pdf</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">E:\Recommended?system\協同過濾\一種改進的Item-based協同過濾推薦算法.pdf</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">E:\Recommended?system\協同過濾\一種電影個性化推薦系統的研究與實現.pdf</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">E:\Recommended?system\協同過濾\個性化搜索引擎中用戶協作推薦算法的研究.pdf</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">E:\Recommended?system\協同過濾\個性化新聞推薦引擎中新聞分組聚類技術的研究與實現.caj</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">E:\Recommended?system\協同過濾\協同過濾技術在個性化推薦中的運用.pdf</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">E:\Recommended?system\協同過濾\基于協同過濾的個性化新聞推薦系統的研究與實現.caj</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">E:\Recommended?system\協同過濾\基于矩陣分解的協同過濾算法.pdf</span></div><div><span style="font-family:微軟雅黑"><span style="font-size:19px; line-height:27px">....</span></span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">E:\Recommended?system\天貓推薦算法.mp3</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">E:\Recommended?system\天貓推薦算法.pdf</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">E:\Recommended?system\推薦系統入門.zip</span></div><div>.<span style="font-family:微軟雅黑; font-size:19px; line-height:27px">....</span></div></blockquote></td></tr></tbody></table>
- 前言
- [Hibernate開發之路](1)Hibernate配置
- [Hibernate開發之路](2)Hibernate問題
- [Hibernate開發之路](3)基礎配置
- [Hibernate開發之路](4)ID生成策略
- [Hibernate開發之路](5)聯合主鍵
- [設計模式實踐之路](1)單例模式
- [Java]UDP通信的簡單例子
- [Java]套接字地址InetAddress講解
- [Java開發之路](1)final關鍵字
- [Java開發之路](2)Java字符串
- [Java開發之路](3)Java常用類
- [Java開發之路](4)String、StringBuffer與StringBuilder詳解
- [Java開發之路](5)異常詳解
- [Java開發之路](6)File類的使用
- [Java開發之路](7)RandomAccessFile類詳解
- [Java開發之路](8)輸入流和輸出流
- [Java開發之路](9)對象序列化與反序列化
- [Java開發之路](10)DOM解析XML文檔
- [Java開發之路](11)SAX解析XML文檔
- [Java開發之路](12)JDOM和DOM4J解析XML文檔
- [Java開發之路](14)反射機制
- [Java開發之路](15)注解
- [Java開發之路](16)學習log4j日志
- [Java開發之路](18)關于Class.getResource和ClassLoader.getResource的路徑問題
- [Java開發之路](19)Long緩存問題
- [Java開發之路](20)try-with-resource 異常聲明
- [Java開發之路](21)Comparator與Comparable
- [Java]Java工程師成神之路
- [細說Java](1)圖說字符串的不變性
- [細說Java](2)Java中字符串為什么是不可變的
- [細說Java](3)創建字符串是使用&quot; &quot;還是構造函數?