久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Java文件操作對(duì)比:從File到NIO.2,遷移指南與踩坑總結(jié)

Java文件操作對(duì)比:從File到NIO.2,遷移指南與踩坑總結(jié) 先說明一下我寫這篇對(duì)比的起因。雖然 Java 7 就把 NIO.2也就是 java.nio.file 這套 API帶進(jìn)來了但你去翻很多生產(chǎn)項(xiàng)目的代碼java.io.File依然隨處可見。不是老項(xiàng)目不敢動(dòng)而是很多同學(xué)入行時(shí)學(xué)的就是File后面項(xiàng)目里new File()、file.exists()、file.delete()一路寫下來沒人提醒的話很難跳出這個(gè)慣性。這篇是 Java 文件操作對(duì)比系列的第 4 篇也是收尾篇。前面幾篇拆了 IO 流的讀寫細(xì)節(jié)、字符編碼處理和二進(jìn)制操作這篇就專門把java.io.File和java.nio.file兩大體系做一次全方位對(duì)照。重點(diǎn)不放在“哪個(gè) API 更高級(jí)”這種口號(hào)上而是直接落到實(shí)際開發(fā)里你每天都會(huì)碰到的場(chǎng)景文件刪不掉怎么辦、目錄怎么遞歸遍歷、移動(dòng)文件是否原子、符號(hào)鏈接怎么處理、文件監(jiān)聽怎么做。每一條都會(huì)給出可跑的示例和我會(huì)踩的坑。1. API 設(shè)計(jì)與使用體驗(yàn)對(duì)比為什么 File 用著別扭1.1 設(shè)計(jì)哲學(xué)一坨類 vs 一條路徑加一個(gè)工具類java.io.File最大的問題在于它既是“路徑的表示”又是“文件操作的入口”。你new File(a.txt)并沒有真正觸達(dá)文件系統(tǒng)它只包裝了一個(gè)路徑字符串但同一個(gè)對(duì)象上你又可以調(diào)用exists()、delete()、mkdirs()這些方法去修改真實(shí)文件系統(tǒng)。路徑表示和狀態(tài)操作混在一起職責(zé)非常散。而java.nio.file把這兩件事拆開了。Path只負(fù)責(zé)“描述一個(gè)路徑”不帶任何文件系統(tǒng)操作真正的讀寫、復(fù)制、移動(dòng)、刪除、屬性查詢?nèi)渴諗康紽iles這個(gè)工具類里。也就是說你拿到一個(gè)Path對(duì)象它只是一個(gè)不可變的位置標(biāo)記想對(duì)它做什么再通過Files靜態(tài)方法傳入這個(gè)Path。類名上也容易踩坑。java.io.File叫“文件”但它其實(shí)也能代表目錄Path叫“路徑”聽上去好像是給文件用的實(shí)際指向文件或目錄都行。理解這個(gè)職責(zé)分離之后寫代碼的思路會(huì)清晰很多先構(gòu)造路徑再?zèng)Q定操作而不是在一個(gè)對(duì)象上調(diào)來調(diào)去。1.2 失敗模型靜默 boolean 與顯式異常這是兩套 API 使用體驗(yàn)差異最大的地方也是從File遷到 NIO 后最先感覺“舒服”的點(diǎn)。java.io.File的寫操作基本都是返回boolean比如File file new File(/tmp/data/report.txt); boolean deleted file.delete(); if (!deleted) { // 到底為什么失敗權(quán)限不存在目錄非空完全不知道 }delete()返回false的原因可能是不存在、沒有權(quán)限、文件被占用但老 API 不會(huì)告訴你具體是哪一種。排查問題全靠猜。mkdir()、renameTo()同理。java.nio.file的做法完全不同刪除操作要么成功要么拋出帶具體類型的異常Path path Paths.get(/tmp/data/report.txt); Files.delete(path); // 文件不存在 - NoSuchFileExceptionNoSuchFileException是IOException的子類你能從異常類一眼看出問題文件不存在。權(quán)限問題拋AccessDeniedException目錄非空刪除失敗會(huì)得到DirectoryNotEmptyException路徑格式不對(duì)拋InvalidPathException。這些異常類本身就攜帶了足夠多的排查信息。所以我的建議很直接新代碼一律用Files老代碼如果還在寫boolean ok file.delete()這種邏輯至少加個(gè)日志把它為什么失敗打印出來否則線上出問題沒法定位。下面給一個(gè)簡(jiǎn)單的語義對(duì)照表操作java.io.Filejava.nio.file失敗表現(xiàn)刪除文件delete()Files.delete(path)返回 false / 拋異常刪除存在才刪delete()后判斷返回值Files.deleteIfExists(path)返回 boolean / 返回 false創(chuàng)建目錄mkdir()Files.createDirectory(path)返回 false / 拋異常創(chuàng)建多級(jí)目錄mkdirs()Files.createDirectories(path)返回 false / 拋異常判斷存在exists()Files.exists(path)返回 boolean / 返回 boolean1.3 資源釋放數(shù)組免操心流必須關(guān)File.listFiles()返回的是File[]數(shù)組拿到數(shù)組后不需要額外釋放什么資源。這看上去很省事但代價(jià)是“一次性全量加載”。如果目錄里有十萬個(gè)文件數(shù)組會(huì)一次性把全部條目加載進(jìn)內(nèi)存。NIO 的Files.newDirectoryStream()返回一個(gè)DirectoryStreamPath可以邊遍歷邊處理但注意它是AutoCloseable的必須關(guān)閉否則會(huì)泄漏文件句柄。try (DirectoryStreamPath stream Files.newDirectoryStream(dir)) { for (Path entry : stream) { // 處理 entry } } // 自動(dòng) closeFiles.list()和Files.walk()返回的是StreamPath同樣需要關(guān)閉。很多人會(huì)忽略這一點(diǎn)因?yàn)镾tream平時(shí)用起來不像“資源”。事實(shí)上Files.list()底層就包了一個(gè)DirectoryStream如果不用try-with-resources包住流不關(guān)閉句柄就會(huì)一直占著。Windows 上尤其明顯文件被句柄占著后面想刪除或移動(dòng)都會(huì)失敗。2. 路徑處理File 的歷史包袱與 Path 的現(xiàn)代化2.1 分隔符別再自己拼字符串了舊的FileAPI 里最常見的路徑拼接寫法是這樣String path data File.separator 2025 File.separator report.txt;如果不小心用了File.separatorWindows 和 Linux 還能自適應(yīng)但很多人圖省事直接寫死/或者\(yùn)\。其實(shí)File內(nèi)部能處理兩種分隔符只是拼接出來的字符串在跨平臺(tái)場(chǎng)景容易被其他組件誤解。Path從根本上消滅了這類問題。使用Paths.get()傳入多個(gè)片段NIO 會(huì)自動(dòng)用當(dāng)前文件系統(tǒng)的分隔符拼接Path path Paths.get(data, 2025, report.txt);在 Windows 上它會(huì)得到data\2025\report.txt在 Linux 上得到data/2025/report.txt。無論后面是直接交給Files操作還是傳給其他接口都不會(huì)出現(xiàn)分隔符不一致的問題。實(shí)際開發(fā)里我?guī)缀醪辉偈謩?dòng)拼接路徑字符串全部用這種可變參數(shù)構(gòu)造方式。2.2 絕對(duì)路徑與規(guī)范路徑一個(gè)“不碰磁盤”一個(gè)“必須碰”File提供了兩個(gè)容易混淆的方法getAbsolutePath()和getCanonicalPath()。getAbsolutePath()純粹從字面上補(bǔ)全路徑不會(huì)解析..和.也不會(huì)訪問文件系統(tǒng)。getCanonicalPath()會(huì)解析..、.、符號(hào)鏈接返回“規(guī)范路徑”。因?yàn)樗L問文件系統(tǒng)所以方法簽名上直接聲明了throws IOException。Path對(duì)應(yīng)的是toAbsolutePath()和toRealPath()。其中toRealPath()等價(jià)于getCanonicalPath()的增強(qiáng)版默認(rèn)會(huì)解析符號(hào)鏈接也可以通過參數(shù)LinkOption.NOFOLLOW_LINKS不跟隨鏈接Path path Paths.get(/tmp/data/../data/report.txt); System.out.println(path.toAbsolutePath()); // /tmp/data/../data/report.txt帶著 .. System.out.println(path.normalize()); // /tmp/data/report.txt詞法規(guī)約不碰磁盤 System.out.println(path.toRealPath()); // 解析符號(hào)鏈接要求文件必須存在否則拋異常三者各有用途。配置文件加載時(shí)我通常用toRealPath()因?yàn)樗鼤?huì)順帶校驗(yàn)文件是否存在如果只是想規(guī)整一下路徑格式但文件還不一定存在就用normalize()。搞清楚這三者的區(qū)別比記住一堆 API 名字有用得多。2.3 路徑段操作subpath 這類高階能力 File 完全沒有File里跟路徑段有關(guān)的只有g(shù)etName()、getParent()、getPath()想取完整路徑中的某一段需要自己在字符串上切。Path提供了更結(jié)構(gòu)化的能力Path path Paths.get(/projects/order-service/src/main/java/OrderService.java); System.out.println(path.getNameCount()); // 7 System.out.println(path.getName(0)); // projects System.out.println(path.subpath(0, 4)); // projects/order-service/src/main System.out.println(path.getFileName()); // OrderService.java System.out.println(path.getRoot()); // /subpath(0, 4)這種“截取中段路徑”的能力在按目錄結(jié)構(gòu)掃描代碼、按約定解析模塊路徑時(shí)特別好用。老代碼要實(shí)現(xiàn)相同的邏輯基本只能split(/)然后自己拼數(shù)組還得分隔符在不同平臺(tái)的差異。路徑段的操作能力是 NIO 對(duì)舊 API 一次實(shí)打?qū)嵉慕稻S打擊。3. 文件元數(shù)據(jù)從多次 stat 到一次屬性視圖3.1 存在性與類型判斷老代碼里最常見的判斷邏輯是這樣File f new File(/tmp/conf/application.yml); if (f.exists() f.isFile()) { // 讀配置 }這段代碼在大多數(shù)場(chǎng)景沒問題但如果/tmp/conf/application.yml是一個(gè)符號(hào)鏈接就得小心了。java.io.File的isDirectory()和isFile()默認(rèn)會(huì)跟隨符號(hào)鏈接——也就是說如果符號(hào)鏈接指向的是一個(gè)目錄isFile()會(huì)返回falseisDirectory()會(huì)返回true但有時(shí)候你恰恰想知道“這個(gè)鏈接本身指向什么類型”。NIO 的Files系列方法提供了LinkOption參數(shù)Path path Paths.get(/tmp/conf/application.yml); // 判斷是否是目標(biāo)類型跟隨鏈接 boolean isFile Files.isRegularFile(path); // 判斷鏈接本身的屬性不跟隨鏈接 boolean isFileNoFollow Files.isRegularFile(path, LinkOption.NOFOLLOW_LINKS); // 直接判斷是不是符號(hào)鏈接 boolean isSymlink Files.isSymbolicLink(path);實(shí)際項(xiàng)目里處理配置文件路徑時(shí)我一般先用Files.isSymbolicLink()判斷一下再?zèng)Q定是否讀取鏈接目標(biāo)。如果只是簡(jiǎn)單判斷目錄是否存在用Files.isDirectory(path)就夠但涉及符號(hào)鏈接的部署場(chǎng)景不加上NOFOLLOW_LINKS很容易誤判。3.2 屬性視圖一次調(diào)用拿全套元數(shù)據(jù)File查詢文件大小和修改時(shí)間需要分別調(diào)用File f new File(/tmp/data.bin); long size f.length(); long lastModified f.lastModified(); boolean isDir f.isDirectory(); boolean isHidden f.isHidden();每次調(diào)用都可能觸發(fā)一次文件系統(tǒng)操作也就是一次 stat。雖然單次 stat 開銷不大但在批量處理成千上萬個(gè)文件時(shí)反復(fù)查詢多個(gè)屬性會(huì)讓性能明顯變差而且代碼也啰嗦。NIO 的Files.readAttributes()可以一次讀取整套屬性BasicFileAttributes attrs Files.readAttributes(path, BasicFileAttributes.class); long size attrs.size(); long lastModified attrs.lastModifiedTime().toMillis(); long creationTime attrs.creationTime().toMillis(); boolean isDirectory attrs.isDirectory(); boolean isRegularFile attrs.isRegularFile(); boolean isSymbolicLink attrs.isSymbolicLink();一次系統(tǒng)調(diào)用拿到全部信息。需要區(qū)分文件類型時(shí)attrs.isRegularFile()和attrs.isDirectory()已經(jīng)幫你分好了不用像File那樣先exists()再isFile()做兩次判斷。如果需要更精細(xì)的屬性還可以換用視圖類視圖類適用平臺(tái)擴(kuò)展屬性BasicFileAttributes所有大小、時(shí)間、文件類型DosFileAttributesWindows隱藏、只讀、歸檔、系統(tǒng)文件PosixFileAttributesLinux/macOS權(quán)限、屬主、屬組PosixFileAttributes posix Files.readAttributes(path, PosixFileAttributes.class); SetPosixFilePermission perms posix.permissions();這套屬性視圖機(jī)制在File時(shí)代是完全缺失的。拿File查 Linux 文件的讀、寫、執(zhí)行權(quán)限只能通過canRead()、canWrite()、canExecute()三個(gè)方法分別判斷拿不到具體的權(quán)限組合更拿不到屬主屬組。3.3 修改屬性從粒度過粗到精細(xì)可控File提供的修改能力很有限翻來覆去就那幾個(gè)file.setReadOnly(); // 只讀 file.setWritable(true, false); // 當(dāng)前用戶可寫ownerOnlyfalse file.setExecutable(true); // 當(dāng)前用戶可執(zhí)行 file.setLastModified(timestamp); // 修改時(shí)間粒度非常粗。想要“給所有用戶加執(zhí)行權(quán)限”這種操作File根本做不了只能借助外部命令。NIO 則可以通過 PosixFilePermissions 精確控制權(quán)限位SetPosixFilePermission perms PosixFilePermissions.fromString(rwxr-x---); Files.setPosixFilePermissions(path, perms);fromString(rwxr-x---)這種寫法非常直觀一眼就能看出屬主是rwx、屬組是r-x、其他用戶是---。生產(chǎn)環(huán)境里我經(jīng)常用來給腳本文件加執(zhí)行權(quán)限部署完直接一條命令生效。這個(gè)能力在File時(shí)代只能靠Runtime.exec(chmod 750 xxx)繞過去麻煩還容易踩轉(zhuǎn)義坑。4. 目錄遍歷與遞歸刪除三種寫法的演進(jìn)4.1 遍歷一個(gè)目錄null 的坑和必須關(guān)閉的流File.listFiles()最大的坑是返回值。如果目錄里面沒有條目它返回空數(shù)組但如果發(fā)生了 IO 錯(cuò)誤比如目錄不存在、權(quán)限不足它返回null。如果代碼拿到null不去判空直接for遍歷瞬間NullPointerException。File[] files dir.listFiles(); if (files ! null) { // 必須判空否則可能 NPE for (File f : files) { // ... } }NIO 的Files.newDirectoryStream()遇到目錄不存在時(shí)直接拋NoSuchFileException不會(huì)返回null也沒有必要判空。更輕量的是Files.list()返回StreamPath配合現(xiàn)代 Java 的函數(shù)式風(fēng)格非常自然try (StreamPath stream Files.list(Paths.get(/tmp/data))) { stream.filter(Files::isRegularFile) .filter(p - p.toString().endsWith(.log)) .forEach(System.out::println); }這三個(gè)方法的取舍我實(shí)際使用下來是只是列目錄、無需過濾和自定義屬性查詢用Files.list()需要過濾條件比較復(fù)雜的比如只挑大于某個(gè)大小的文件用Files.newDirectoryStream()配合自定義過濾器更清晰如果目錄很大優(yōu)先newDirectoryStream()邊讀邊處理避免一次性加載全部條目到內(nèi)存。4.2 深度遍歷walk 與 walkFileTree 怎么選按目錄樹遞歸遍歷是文件操作里最高頻的需求之一。File時(shí)代只能手寫遞歸大概長(zhǎng)這樣void listAll(File dir) { File[] files dir.listFiles(); if (files null) return; for (File f : files) { if (f.isDirectory()) { listAll(f); } else { System.out.println(f.getPath()); } } }NIO 提供了兩種現(xiàn)成的深度遍歷方案。第一種Files.walk()惰性遍歷并返回StreamPath適合過濾、收集類的場(chǎng)景try (StreamPath stream Files.walk(Paths.get(/tmp/data))) { stream.filter(Files::isRegularFile) .forEach(System.out::println); }第二種Files.walkFileTree()基于訪問者模式需要寫一個(gè)SimpleFileVisitor。它最大的優(yōu)勢(shì)是能夠在“進(jìn)入目錄前”“離開目錄后”“訪問文件時(shí)”“訪問失敗時(shí)”四個(gè)時(shí)機(jī)分別插入邏輯刪除目錄樹時(shí)尤其好用。Files.walkFileTree(Paths.get(/tmp/data), new SimpleFileVisitorPath() { Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { Files.delete(file); return FileVisitResult.CONTINUE; } Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { Files.delete(dir); return FileVisitResult.CONTINUE; } });FileVisitResult除了CONTINUE還有SKIP_SUBTREE跳過當(dāng)前目錄、TERMINATE終止遍歷。比如備份時(shí)需要跳過.git目錄在preVisitDirectory里判斷目錄名直接返回SKIP_SUBTREE即可這種控制力是Stream方案給不了的。4.3 遞歸刪除的三種推薦寫法刪除一個(gè)非空目錄File.delete()直接失敗因?yàn)槟夸浄强?。File時(shí)代最原始的遞歸刪除長(zhǎng)這樣void deleteRecursively(File f) { if (f.isDirectory()) { File[] children f.listFiles(); if (children ! null) { for (File child : children) { deleteRecursively(child); } } } f.delete(); }NIO 時(shí)代常見三種寫法。前面提到的walkFileTree是最穩(wěn)的。第二種是利用Files.walk()配合反序刪除——因?yàn)镕iles.walk()默認(rèn)深度優(yōu)先先列出的路徑在樹的上層刪除前需要把流排序成“子路徑在前、父路徑在后”try (StreamPath stream Files.walk(Paths.get(/tmp/data))) { stream.sorted(Comparator.reverseOrder()) .forEach(p - { try { Files.deleteIfExists(p); } catch (IOException e) { throw new UncheckedIOException(e); } }); }第三種是用遞歸加Files.deleteIfExists()簡(jiǎn)潔但對(duì)深層目錄會(huì)造成較深的調(diào)用棧void deleteRecursive(Path dir) throws IOException { try (StreamPath stream Files.list(dir)) { for (Path p : stream) { if (Files.isDirectory(p, LinkOption.NOFOLLOW_LINKS)) { deleteRecursive(p); } else { Files.deleteIfExists(p); } } } Files.delete(dir); }我個(gè)人的選擇是老代碼重構(gòu)時(shí)用walkFileTree因?yàn)檎Z義清晰、可控性高寫一次性腳本或臨時(shí)清理邏輯時(shí)用sorted(reverseOrder())那一行流式寫法簡(jiǎn)潔。搜索“java 文件相關(guān)的操作”這個(gè)主題時(shí)遞歸刪除永遠(yuǎn)是最熱門的場(chǎng)景之一所以這里特意把三種姿勢(shì)都列出看你們項(xiàng)目風(fēng)格自取。5. 復(fù)制、移動(dòng)與刪除原子性是最容易被忽略的點(diǎn)5.1 刪除語義的差異File.delete()和Files.delete()的差別前面已經(jīng)提到這里再補(bǔ)一個(gè)實(shí)操場(chǎng)景清理日志文件時(shí)我們經(jīng)常遇到“目標(biāo)可能不存在”的情況。// 舊寫法 File logFile new File(/tmp/app.log); if (logFile.exists()) { // 有些人會(huì)先 exists 再 delete logFile.delete(); } // NIO 寫法 Files.deleteIfExists(Paths.get(/tmp/app.log));Files.deleteIfExists()把“存在才刪”這個(gè)語義封裝好了不用再手動(dòng)判存在也省掉了“exists 判斷后文件被并發(fā)刪除導(dǎo)致 delete 返回 false”的競(jìng)態(tài)問題。需要注意deleteIfExists()在目錄非空時(shí)依然會(huì)拋DirectoryNotEmptyException所以刪除目錄還是要走遞歸方案。5.2 復(fù)制文件保留屬性是個(gè)細(xì)節(jié)活java.io.File沒有自己的復(fù)制能力老代碼通常用兩個(gè)流手動(dòng)搬運(yùn)try (InputStream in new FileInputStream(src); OutputStream out new FileOutputStream(dst)) { byte[] buffer new byte[8192]; int len; while ((len in.read(buffer)) ! -1) { out.write(buffer, 0, len); } }能復(fù)制內(nèi)容但源文件的修改時(shí)間、權(quán)限這些元數(shù)據(jù)全部丟失。而Files.copy()可以通過CopyOption控制復(fù)制行為Files.copy(src, dst, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES);REPLACE_EXISTING表示目標(biāo)存在時(shí)覆蓋COPY_ATTRIBUTES表示盡量保留源文件的屬性修改時(shí)間等。如果不加COPY_ATTRIBUTES復(fù)制出來的文件時(shí)間戳就是“當(dāng)前時(shí)間”在發(fā)布構(gòu)建產(chǎn)物的場(chǎng)景里會(huì)造成緩存判斷錯(cuò)誤。這里有個(gè)細(xì)節(jié)Files.copy()底層在不同文件系統(tǒng)上的實(shí)現(xiàn)有差異如果源和目標(biāo)在同一個(gè)文件系統(tǒng)里某些平臺(tái)會(huì)走更高效的路徑但你不必關(guān)心這些差異API 層面一致即可。另外Files.copy()復(fù)制目錄時(shí)是淺復(fù)制只復(fù)制目錄本身不會(huì)遞歸復(fù)制子目錄和文件。需要完整復(fù)制目錄樹還得配合walkFileTree逐個(gè)創(chuàng)建和復(fù)制。5.3 移動(dòng)文件renameTo 靠不住ATOMIC_MOVE 有講究File.renameTo()是舊 API 里我踩過最多坑的方法。它的行為高度依賴平臺(tái)和文件系統(tǒng)在 Windows 上如果目標(biāo)文件已經(jīng)存在renameTo()很可能失敗如果跨文件系統(tǒng)比如從 C 盤挪到 D 盤renameTo()大概率直接返回 false如果目標(biāo)文件的父目錄不存在也會(huì)失敗。最難受的是它失敗返回false你完全不知道是哪種原因。Files.move()則干凈得多Files.move(src, dst, StandardCopyOption.REPLACE_EXISTING);這在同一個(gè)文件系統(tǒng)內(nèi)基本是原子的。如果需要把原子性作為硬性要求可以加上AtomicMoveNotSupportedException兜底try { Files.move(src, dst, StandardCopyOption.REPLACE_EXISTING, AtomicMoveOption.ATOMIC_MOVE); } catch (AtomicMoveNotSupportedException e) { // 文件系統(tǒng)不支持原子移動(dòng)降級(jí)為普通 move Files.move(src, dst, StandardCopyOption.REPLACE_EXISTING); }ATOMIC_MOVE保證移動(dòng)操作要么完成、要么完全沒發(fā)生。文件替換、日志輪轉(zhuǎn)這類場(chǎng)景特別看重這個(gè)語義——如果你在進(jìn)程正在寫文件時(shí)做替換非原子移動(dòng)可能出現(xiàn)目標(biāo)文件短暫不存在或內(nèi)容不完整的情況。這一點(diǎn)在生產(chǎn)環(huán)境里尤其重要比如部署新版本 jar 包如果不用原子替換的方式服務(wù)重啟瞬間可能讀到半截文件。5.4 臨時(shí)文件與退出清理File.createTempFile()和File.deleteOnExit()是老代碼里常見的組合File temp File.createTempFile(data, .tmp); temp.deleteOnExit();deleteOnExit()會(huì)在 JVM 退出時(shí)刪除文件邏輯本身還好但有幾個(gè)坑它只刪除注冊(cè)的這個(gè)文件不清理目錄而且如果文件已經(jīng)被刪除它不會(huì)報(bào)錯(cuò)。更麻煩的是如果 JVM 被kill -9強(qiáng)殺deleteOnExit()根本不會(huì)執(zhí)行臨時(shí)文件會(huì)殘留。NIO 的createTempFile()只負(fù)責(zé)創(chuàng)建沒有自帶退出清理Path temp Files.createTempFile(null, .tmp);清理需要自己做。如果是邊寫邊用的臨時(shí)文件最簡(jiǎn)單的是用完立刻刪try { Files.write(temp, data); // 使用 temp } finally { Files.deleteIfExists(temp); }如果臨時(shí)文件要跨越多個(gè)方法使用直到 JVM 退出可以注冊(cè)ShutdownHook做兜底。deleteOnExit()本身也是 JVM 內(nèi)部維護(hù)了一個(gè)待刪隊(duì)列所以存在一個(gè)隱藏問題如果短時(shí)間創(chuàng)建大量臨時(shí)文件都會(huì)進(jìn)入隊(duì)列等待 JVM 退出時(shí)逐個(gè)清理如果程序崩得早列隊(duì)里的文件就全留下變成垃圾。實(shí)際項(xiàng)目里我傾向于盡快刪除臨時(shí)文件而不是依賴退出鉤子。6. 符號(hào)鏈接與文件監(jiān)聽NIO 獨(dú)有的兩個(gè)高價(jià)值能力6.1 符號(hào)鏈接判斷與讀取目標(biāo)java.io.File完全沒有符號(hào)鏈接的概念遇到符號(hào)鏈接會(huì)直接當(dāng)普通文件處理。NIO 在這塊補(bǔ)齊了關(guān)鍵能力。Path link Paths.get(/usr/bin/java); System.out.println(Files.isSymbolicLink(link)); // true Path target Files.readSymbolicLink(link); System.out.println(target); // 實(shí)際指向的路徑注意readSymbolicLink()讀取的是鏈接自己保存的目標(biāo)路徑不會(huì)遞歸解析最終目標(biāo)。如果你需要不斷解析直到找到真實(shí)文件可以結(jié)合toRealPath()Path realPath link.toRealPath(); // 默認(rèn)跟隨所有符號(hào)鏈接返回最終真實(shí)路徑在包含軟鏈的部署環(huán)境比如/usr/bin/java普遍是軟鏈下判斷 JDK 版本時(shí)用link.toRealPath()能拿到真正安裝的 JDK 路徑比File.getCanonicalPath()穩(wěn)定得多。6.2 WatchService監(jiān)控目錄變化替代無頭輪詢java.io.File沒有文件監(jiān)聽能力。老代碼想實(shí)現(xiàn)“目錄里多了新文件就處理”一般只能靠輪詢lastModified或者listFiles()比對(duì)前后差異又慢又容易漏。NIO 的WatchService是原生的目錄監(jiān)聽機(jī)制try (WatchService watchService FileSystems.getDefault().newWatchService()) { Path dir Paths.get(/tmp/incoming); dir.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY); while (true) { WatchKey key watchService.take(); // 阻塞等待事件 for (WatchEvent? event : key.pollEvents()) { Path changed (Path) event.context(); System.out.println(event.kind() : dir.resolve(changed)); } key.reset(); // 重置后繼續(xù)監(jiān)聽 } }這個(gè)機(jī)制的幾個(gè)注意事項(xiàng)很關(guān)鍵WatchService只能監(jiān)聽目錄本身不會(huì)遞歸監(jiān)聽子目錄。想監(jiān)聽整棵目錄樹需要手動(dòng)遍歷子目錄逐個(gè)register并在新目錄創(chuàng)建時(shí)動(dòng)態(tài)注冊(cè)。事件類型里ENTRY_MODIFY可能會(huì)觸發(fā)多次文件寫入過程中可能產(chǎn)生多次修改事件做業(yè)務(wù)處理時(shí)最好加一個(gè)短延遲去重。平臺(tái)延遲差異明顯Windows 上事件可能稍有延遲Linux 上則依賴 inotify 機(jī)制不同文件系統(tǒng)對(duì)事件粒度的支持也有區(qū)別。但在大多數(shù)場(chǎng)景下用WatchService替代“每 5 秒掃一遍目錄”的輪詢實(shí)現(xiàn)無論是實(shí)時(shí)性、準(zhǔn)確率還是系統(tǒng)開銷都有質(zhì)的提升。部署配置熱更新、文件導(dǎo)入落地的自動(dòng)觸發(fā)我都是用這個(gè)方案。7. 遷移清單與實(shí)操建議從 File 到 NIO 的平滑過渡7.1 方法替換映射表老項(xiàng)目改造時(shí)最實(shí)用的就是一張映射表。下面這份是我自己整理過的覆蓋日常 90% 的文件操作場(chǎng)景java.io.File操作java.nio.file替代new File(path)Paths.get(path)file.exists()Files.exists(path)file.isFile()Files.isRegularFile(path)file.isDirectory()Files.isDirectory(path)file.length()Files.size(path)file.lastModified()Files.getLastModifiedTime(path).toMillis()file.isHidden()Files.isHidden(path)file.mkdir()Files.createDirectory(path)file.mkdirs()Files.createDirectories(path)file.listFiles()Files.list(path)或Files.newDirectoryStream(path)file.renameTo(dest)Files.move(src, dest)file.delete()Files.deleteIfExists(path)file.getAbsolutePath()path.toAbsolutePath().toString()file.getCanonicalPath()path.toRealPath().toString()file.deleteOnExit()手動(dòng)立即清理或ShutdownHookfile.setReadOnly()Files.setPosixFilePermissions()或DosFileAttributeView這里特別強(qiáng)調(diào)一下file.length()到Files.size(path)的差異。File.length()對(duì)不存在的文件返回 0可能被誤讀為“文件存在但內(nèi)容為空”Files.size(path)對(duì)不存在的文件會(huì)拋NoSuchFileException語義更準(zhǔn)確。我見過不少生產(chǎn) bug 就是“文件不存在時(shí) length 返回 0然后被當(dāng)成空文件處理”。7.2 常見問題速查表實(shí)際遷移過程中問得最多的幾個(gè)問題我整理成一張表問題場(chǎng)景推薦方案關(guān)鍵坑點(diǎn)刪除目錄樹失敗walkFileTree配合SimpleFileVisitor目錄非空時(shí)delete()直接失敗遍歷大目錄內(nèi)存暴漲Files.newDirectoryStream()listFiles()一次性加載全部判斷符號(hào)鏈接Files.isSymbolicLink(path)File.isDirectory()默認(rèn)跟隨鏈接移動(dòng)文件要求原子Files.moveATOMIC_MOVE文件系統(tǒng)不支持時(shí)拋AtomicMoveNotSupportedException目錄不存在時(shí)靜默創(chuàng)建Files.createDirectories(path)mkdirs()失敗返回 false無異常信息流忘關(guān)導(dǎo)致句柄泄漏try-with-resources包住Stream/DirectoryStreamFiles.list()底層持有DirectoryStream需要監(jiān)控文件變化WatchService不遞歸子目錄需手動(dòng)注冊(cè)復(fù)制文件保留時(shí)間戳Files.copyCOPY_ATTRIBUTES不指定則時(shí)間戳是當(dāng)前時(shí)間7.3 遷移節(jié)奏建議老項(xiàng)目如果代碼量巨大不推薦一次性把所有File全換成Path/Files。我見過不少同事一上來就全局替換最后在File.separator、deleteOnExit這些邊緣語義上翻了車。穩(wěn)妥的做法是只改新代碼老代碼按模塊逐步替換。一個(gè)實(shí)用的中間策略是寫一個(gè)薄封裝工具類把高頻操作包一層。比如統(tǒng)一提供deleteQuietly(Path)、moveAtomic(Path, Path)、listFilesStream(Path)這類方法底層用 NIO 實(shí)現(xiàn)然后逐步把老代碼的調(diào)用點(diǎn)遷移到工具類上。這樣既能享受新 API 的能力又不至于一次性改動(dòng)太大。比較難遷移的是這幾類依賴FilenameFilter或FileFilter的老代碼可以改成DirectoryStream.FilterPath依賴file.deleteOnExit()清理臨時(shí)文件的要改成顯式清理依賴file.renameTo()實(shí)現(xiàn)移動(dòng)的務(wù)必改成Files.move()否則在 Windows 上的行為極不穩(wěn)定依賴file.getCanonicalPath()解析軟鏈路徑的改成path.toRealPath()語義更明確。新代碼只要運(yùn)行環(huán)境是 Java 8 以上我可以直接建議默認(rèn)java.nio.file沒有理由再用java.io.File做新的文件操作。唯一需要保留File的場(chǎng)景是調(diào)用第三方庫的舊接口——有些庫方法簽名還是File參數(shù)這時(shí)候用path.toFile()轉(zhuǎn)換即可。最后說點(diǎn)我自己的體會(huì)。NIO 真正讓人覺得舒服的地方不是某個(gè) API 名字更好看而是它把“路徑”和“對(duì)路徑做什么”拆開了。File之所以難用根本原因是它把狀態(tài)判斷、屬性讀取、修改操作全堆在一個(gè)類里失敗時(shí)只給你一個(gè)boolean false你根本不知道發(fā)生了什么。從File遷到Path/Files不是把 API 名字換掉就完了而是把每一次操作腦子里過一遍它的語義刪除是不存在就報(bào)錯(cuò)還是不存在就跳過移動(dòng)失敗后是拋異常終止還是靜默降級(jí)目錄遍歷是需要全部加載還是邊讀邊處理把這些問題想清楚了代碼的健壯性自然會(huì)上去這也是我寫這篇對(duì)比最想傳達(dá)的一個(gè)點(diǎn)。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
天天躁日日躁xxxxx| 色哟哟511老熟女| 一级毛片久久久久久久女人18| 狠狠爱夜夜| 9/A片| 蜜臀久久在线视频| 色偷偷2020免费视频播放| 婷婷激情丁香| 91麻豆va国产精品| 99精品在线播放| 色综九九九一区| 狠狠干狠狠色| 91欧美高清| laoshunv91| 综合第一页| 五月婷婷丁香中文字幕| 国产精品视频白浆免费| 中国亚洲呦女专区| 内射日韩大臀美女| 欧美91久久久久| www欧美91| 沈阳熟女高潮对白视频| 男女做爰猛烈动高潮A片免费应用 少妇厨房愉情理伦片bd在线观看 不卡中文字幕aⅴ在线 | 亚洲欧洲无码97久久精品| 人妻夜夜爽天天爽麻豆三区网站| 日韩一级成人毛片免费观看| 国产高潮AA片免费看| 天天综合色电影| 天堂麻豆天美| 亚春色色| 午夜超爽| 亚洲一区二区三区久久 亚洲一区二区| 欧美专区在线| 啪啪免费| 亚洲情色一区二区三区| 超碰伊人在线| 久久久久夜夜夜夜| 欧美人与性动交a美精品| 国产精品视频精品一二| 久久一区,青青青青草视频在线播放| 久久精品国产97欧美精品亚洲 | 69精品| 超碰97精品在线| 国产精品成久久久久午夜午夜| 不卡一区视频| 欧美亚洲厕所精品偷拍91 | 懂色Av| 天天肏美女| 欧美一区二区三区四区综合| 后入式福利| 看免费的黄片| 日韩性爱人人爱人人操| 曰本精品久久久| 一区AV| 欧美精品久久久久久久久88| 国产熟女完整版中字| 成功精品影院| 熟女少妇视频| 操人91| 九九热午夜欧亚国产视频| 欧美性生活免费网| 中文字幕久久精视频久久大全| 97天天摸天天爽| 激情小说五月天| 欧美性爱超碰97| 一区二区三区四区色图| 日韩9区| 综合激情五月丁香| 大象AV在线| 久操99| 国产午夜福利专区综合| 天天摸夜夜操视频| 99日韩| 亲子敌伦对白在线播放 | 岛国激情视频在线观看| 伊人久久大香线综合无码| 一本久道在线综合视频| 97亚洲国产| 女色视频社区| 乱伦图av| 99re9| 国产一区二区三区中文字幕| 五月天综合在线| 国产性爱欧美性爱在线| 国产熟女少妇一区| 日韩性爱长视频免费| 亚洲熟女精品| 99热免费| 人人贴人人摸| 亚洲天堂第一页| 天堂资源欧美| 婷婷丁香五月天亚洲天堂网| 97国产精品在线观看| 综合网亚洲| 大稥蕉免费视频这里只有精品| 国产美女精品| 色制服丝袜夫妻av一区| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 蜜桃AV天堂| 国产九九久久久精品| av强奸乱轮| 日本一区二区中文字幕久久| 懂色av中文字幕一区二区三区天美| 久久国产三区| 男人的天堂啪啪啪啪啪蜜桃不卡| 多毛小伙内射老太婆| 99久久精品无码一区二区毛片免费 | 亚洲一二三| 天天日日日射| 观看免费区二区三区二| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 91九九九小逼| 日韩二级| 欧美韩国你懂得在线 | 久久午夜色播影院免费高清| 91激情国产| 男人天堂毛片| 人妻娇喘 激情视频| 伊人九九| 成 人 A V免费视频在线观看| 97超碰9| 国产精品黄色三级av| 九九热国产| 精品无码产区一区二| 天天操综合网| 综合九九| 日日爱99| 97亚洲综合电影| 亚欧操逼片在线观看 | 国产免费小视频| 91偷拍欧美亚洲| 92午夜免费福利视频| 后入福利视频| 亚洲激情视频| 欧美性爱18观看| av日韩国产一区二区| 国产 三级自拍| 99免费视频| 91网18| 亚洲图片视频小说| 国产最火爆久久国产网站网站 | 四方色播| 放黄片放3级黄片没穿衣服| 26UUU欧美激情一区二区| 欧美日本一区二区a人| www.狠狠干.coom| 天天操美美| 亚洲中文字幕在线视频一区二区| 久久精品熟女亚洲AV麻豆软件| AV不卡在线| 高清不卡国产| 免费人成毛片乱码| 婷婷五月天激情四射| 欧美日韩理论一区| 欧美色宗合| 99热这里| 9久久精品| 亚洲九九夜夜| 国内外激情在线| 这里只有精品视频在线观看麻豆 | 一区二区三区一亚洲中文字幕、综合区灬 | 精品96久久| 蜜乳AV一区二区三区四| 神马久久69| 久96热在线观看视频| 欧美精品91| 伊人991| 午夜视频好爽啊| 国产剧情一区在线观看| 精品一区二区三区蜜桃| 亚洲日韩av一区二区三区百合| 黄片www视频免费| 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 91校园春色长篇| 欧美爆乳精品一区二区| 少妇人妻激情四射| 五月天春色激情网| 女人爽到高潮潮喷18禁网站 | 国产激情综合五月久久| 无码人妻一区二区三区色欲aⅴ| 久久国产对白激情浪潮| 五月激情综合网| 在线观看亚洲成人精品| 欧美综合天堂| 青草影院内射高潮| 青青草密桃在线播放| 东京热视频网| 久久久性爱| 91天美传媒精品| 亚洲精品乱码久久久久久蜜桃麻豆| 超碰97 线线 在现| 亚洲综合射| 电影69乱码96| 色色色热| 岛国色情视频在线观看| 好色综合| 人妻丝袜一区二区三区在线| 色悠久久久av| 亚洲久久东京热一二三四五区视频| 天美国产精品| 五月丁香亭亭| 五月天偷拍| 中文字幕一区二区韩| 99re9| 九九九九热只有精品| 乱日视频| av在线浏览| 天天看综合网| 日韩去日本高清在| 青娱乐久久艹| 尤物一级在线免费观看| 欧美黄色大片在线观看| 日韩欧美tv一区二区在线观看| 麻豆三极片| 久久久精品网| 97操97干| 一级二级在线观看| 黑人综合网| 殴美色网| 亚洲性高潮| 亚洲人综合| 欧美中字二区| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 亚洲最新a在线观看| 老熟女乱子伦中文字幕一区二区| 亚洲性爱电影| 免费的很黄很污的全部视频| 很很热性爱视频| 青青久久手机线视频| 亚洲欧洲日本精品中文a∨| 超碰97人妻在线| 又大又大又大又粗爽高潮观看| 亚洲色图A| 亚洲色图A| 日韩综合第八区国产精品| 五月天欧美色图| www. 男人天堂成人在线| 欧美中字不卡| 黄色工厂这里只有精品| 另类图片欧美激情综合| 91在线秘 男同| 国产家庭乱伦性爱视频| 2019天天干天天操| 99无码视频| 91在线欧色| 亚洲欧美另类少妇精品| 亚州国产成人精品女人久久| 福利视频网站| 免费少妇一区二区| 久热这里| 天天弄欧美| 91在线/欧洲| 91精品婷婷国产综合久久| 91模特在线观看| 97在线免费看视频| 欧美日韩国产三级黄色| 东京热激情视频一二三区| 亚洲最大黄网| 97超碰色中文字幕| 国产白丝av| 欧美一级久久久久久久大片动画 | 亚洲 欧美 91| 在线情色电影 91大 | 中文字幕中文字幕一区二区| 五月天综合在线| 九九热五区| 久久久精品一区二区| 麻豆成人影音在线| 色色色欧美| 欧美日韩性爱精品| 十八禁黄色成人网站观看| 欧亚韩国999| 性爱av在线免费观看| 丁香久久| 蜜臀99久久精品| 日韩日本欧美在线观看| 可以免费观看的av| 欧美性性性| 加勒比综合| 抽插无码高清一区| 天美欧美国产| 无码久久亚洲高清,| 99九九久久| 1000午夜黄色| 久久久久久亚洲Av无码精| 五月婷婷爱六月丁香色| 是还免费视频1727我| 日韩久射综合| 久久久久9999| 9.1小视频| 嫩草美女久久| 人妻一区久久二区三区色播| 一区二区三| 操操碰| 久久久性少妇| 97人人射| 欧美后入式| h无码动漫在线观看| 久久久久久性爱视频| 欧美 日韩第一性色| 久久精品中文字幕观看| 亚洲射综合网| 亚洲日韩人妻中文字幕一区| 欧美激情亚洲色图| 碰碰97| 曰韩精品九九无码| 91欧美综合| 大香蕉伊人久久| 另类图片五月天| 99久久e免费热视| 九九九精品一区二区无码| 无码不卡八戒| 中文字幕文字幕无码一区二区三区电影99| 日本操逼aaaaa| 亚洲人在线成线成人| 99无码狠狠久久| 色女网日韩| 精品丝袜无码一区二区三APP| 麻豆性爱视频在线播放| 天堂а√在线最新版在线| 精品999日本| 成人激情无码在线视频| 欧美亚洲清纯| 五月婷婷综合激情| 综合影院永久入口国产| 国产蜜臀在线| 欧美美女啪啪视频| 园内精品自拍视频在线播放| 凹凸 69堂 在线播放| 99久在线精品99re8| 欧洲视频在线| 操学生天天| 日韩Va亚洲va欧美Ⅴa久久| 九热超碰| 熟妇一区,二区,三区。| 99在线观看| 国产精品国产精品国产| 福利天堂| 精品精品精品| 欧美老妇曰批的视频| 欧美96交| 亚洲日韩青青草色月| 十八禁视频一区二区| 强奸熟女一区二区三区| 超碰人人妻| 人妻一二三区| 蜜臀久久99精品久久久久久-DVD原版全| 欧美性爱一内片一区二区三区| 黑人白女精品一区| 蜜屁av| 丝袜内射| 国产高清成人传媒影视| 精品人妻一区二区三区四区不卡在| 久久av色| 999久久久九| 黄色一区二区秘书性感| 中文?日韩?免费?精品| 制服中出中文人人精品| 99啪| 日韩黄色电影网站| 久久久久久69国产一区二区| 欧美九九九九九| 一直超碰| 四虎AV无码| 成人短视频在线观看| 乱伦熟女专区| 欧美翘臀视频网站一区二区三区| 中文久久96| 后入 亚洲 美女 射| 色色色999| 99这里只有精品国产| 国产又粗又长视频| 人妻大香蕉| 素人无码中文字幕| 日韩 成人 有码| 蜜臀AV一区二区三区激情综合| WWW黄片COM| 亚洲无码太久| 日韩av免费一级电影| 加勒比综合88| 亚洲久9| 999热日韩精品| 热热色色综合| 情侣操 逼视频99| 亚洲情色一区三区| 插老姨肥穴| 国产精品久久久亚洲一区| 成人性爱电影一区二区| 丁香九月 婷婷| 国产精品香蕉| 一起草三级AV电影在线观看 | 色欲天天婬色婬香WWW夜色| 91亚.色| 人妻素股| 久久久久久久久国产| 日韩情色AV| 亚洲av热热色| 啊啊啊啊操死我| 久久禁| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 日产狠狠干| 97久久久| 色久综合| 伊人影院中文字幕| 99热综合| 淫色网综合| 欧美人妻二区三区| 一区二区 日韩 欧美 国产 传媒| 青青草伊人久久| 大香蕉伊人在线成人AV在线观看| 欧美78| 亚洲怡春院| 欧亚韩国999| 91久久国产精品| 亚洲 欧美综合| 99re视频这里只有精品| 国产强奸无码乱伦| 熟妇的味道HD中文字幕| 亚洲午夜福利在线影院| 丁香五月影院| 久久久久久91香蕉国产| 国产AV天美传媒一区二区三区 | 国产9区| 91亚洲网| 国产51色综合久久免费| 国产成人精品亚洲日本| 色97| 亚洲精品一卡二卡三卡福利视频网站| 成人情色综合网| 色香91| 欧美综合天天| 午夜欧美女人操逼| 久久精彩视频9| 狠狠色一区二区中文字幕| 啊啊啊啊在线播放| 超碰97综合在线| 男女做爰猛烈动高潮A片免费应用 少妇厨房愉情理伦片bd在线观看 不卡中文字幕aⅴ在线 | 91综合无码| 26uuu最新| 亚洲一欧洲中文字幕在线| 五月丁香| 色悠久久久av| 五月丁香激情四射| 丁香六月东京热| 嫩草 人人网精品| 9精品久久| 久艹日日日| 国产大学生口爆吞精合集| 9色在线| 韩日精品福利视频一区不卡在线免| 亚洲精品国产拍免费91在线| 丰满人妻一区二区三区| 天美一二三在线观看Av| 97国产精品一区二区传媒公司| 欧美十八禁视频| 超碰av人人人| 99久热精品99re6热| 91色插| 国产精品无码在线| 久久日本熟女精品一区| 一二三区操逼国产91| 国产三级电影免费观看| 欲色啪| 成人97人人超碰人人| 九九无码久久精品视频| 欧在线一二区| 婷婷久久五月天| 色网1| CCYY草草影院地址入口| 97视频在线观看播放与子乱对白在线……| 天天操福利视频综合网站| 黄色片一区二区三区四区五区| 国产精品一二三区福利| AV女资源| 亚洲无码一区二区三区三州| 久久久久大香青草精品综合| 18禁在线视频| 午夜激情床戏激情| 九七超碰| ,国产乱人伦精品一区二区三区| 91欧美www| 天天色播亚洲综合网站| 欧美精品欧美精品系列| 国产一区二区三区影片| 33044男人的天堂深夜备| 久久综合资源一区二区| 亚洲男人天堂视频| 亚洲日韩精品在线播放| av2014 日韩在线中文字幕| 欧美性爱精品一区二区| 中国特猛少妇色xxx| 最新中文字幕在线亚洲| 亚洲有薄码区久久在线一区| 99综合免费视频| 97操B| 96AV精品| 最新AV在线| 五月婷婷六月丁香| 亚洲一区中文精品| 中文字幕综合人妻| 亚洲操人| 亚洲欧美成人网站AAA| 啊啊啊啊啊在线观看网址 | 东京热综合久久一区二区| 五月丁香激情综合网| 亚洲日韩资源| 精品一区二区啪啪啪| 啪啪啪综合网| 人人妻人人色| 免费久久精品麻豆一区二区av| 少妇的嫩逼图片| 婷婷成人久久久精品| 美日韩男女操屄视频| 日韩精品人妻中文字幕久久久| 欧美aa一级片| 情侣操 逼视频99| 欧美久久伊人| 欧美性xxxxx狂欢| 成人久久精品| 精品区9| A级毛片在线看免费| 色偷偷色偷偷欧美日韩| 大奶尤物鲍汁淫荡欧美视频粉嫩夜夜骚| 欧美伊人久久综合网| 欧美色爱综合| 秋霞午夜视频一区二区| 婷婷久月| 日本性爰一道本| 九久9精品| 欧美成人色| 婷婷丁香五月综合| 污污汅18禁网站在线永久免费观看 | 色天天野狼综合社区| 人妻精品综合中文字幕在线 | 日韩射精| 亚洲人人夜夜澡人人爽| h在线看免费版在线看| 国产精品日韩在线一区| 加勒比综合88| 99福利社| 91久久久老司机| 91久久精品国产| 亚洲午夜福利视频| 综合五月婷婷亚洲一区| 欧美牲| 日日摸日日弄日日拍| 亚洲免费97免费| 亚洲天堂性爱| 91狠狠色丁香婷婷综合久久精品| 逼逼逼逼操操操操操操操操操午夜剧场 | 色婷五月| 在线无码操| 男人天堂黄片| 亚洲巨爆乳一区二区三区四季网| 国产熟女无套内射| 日日97| 欧美天天在线| 欧美国产操逼| 亚洲色情在线影视| 欧美亚洲日韩16色| 中文字幕 人妻不满 在线视频| 最新中文字幕精品在线| 午夜无遮挡男女啪啪视频| 97干97色| 天堂v无码免费视频| 91日韩国产欧美亚洲另类精盘州至城都| 精品国产乱码久久久久久口爆网站| 韩日男人的天堂| 亚洲成熟国产精品美女| 亚洲免费在线探花| 激情小说成人日本无码一| 美欧色综合| 久久蜜桃一区二区| 久久久久白虎| 亚洲综合网91| 亭亭在线资源| 97干综合网| 夜夜肏2021| 欧州色图区| 婷婷香蕉| 亚洲最大的黄色电影网站。| 99re99视频在线免费观看| 青娱乐蜜桃臀AV色婷| 日日夜夜草草草| 久久激情视频| 亚洲无992tv| 收看日本人日bb| 中日韩欧美精品无码AⅤ一区二区| 日韩不卡毛片Av免费高清| 国产福利影视| 久久久工口| 国产亚热在线久久| 无码不卡八戒| 色播丁香| 欧美日韩国产色五月综合在线| 日韩精品人妻一区二区| 国产av波波国产精品| 国产农村一一级特黄毛片| 有码色中文字幕在线观看| 97看操| 日夜尻逼网| a级成人毛片免费视频高清| 电影69乱码96| 日逼97| 亚洲黄网在哪免费看| 天天操av懂色| 亚州性色| 日本三级大片| 素人伊尹大香蕉免费下载视频| 麻豆精品一区二区三区四区免费观看| 国产亲戚伦亲在线| 久久女同性恋一二区| 亚春色色| 色五月婷婷在线| 欧美92| 国产激情综合五月久久| 爱丝福利| 91丝袜美女国产| 精品人妻15区| 欧美淫穴| 精品美女少妇一区二区| 99热在线播放| 女生91网站| 91爱综合| 欧美激情区| 日韩国产品视频中文字| 精品成人无码| 欧美在线视频观看一二三四区高清| 日韩人妻制服丝袜av| 涩亚洲欧洲| Av色五月| 亚洲天堂AV在线播放| 少妇久久久免费| 激情五月天色色| 欧美精品久久96人妻无码| 青青草原人妻| 亚洲欧美中文一区二区三| 男人的天堂kva| 偷拍超碰| 日日干日日| 亚洲啪AⅤ永久无码| 黑人精品欧美一区二区蜜桃| 国内精品999| 亚欧成人中文字幕一区| av黄图片在线观看| 亚洲天堂少妇| 欧美韩国你懂得在线 | 女人被男人桶爽视频网站| 欧美综合第一页| av一区二区三区四区五区久草臀| 亚洲综合色男人网| 激情五月婷婷| ..日韩av毛片精品久久久| 九九九九九九综合| 天美传媒av在线| 黑人中出21连凳花野真衣| 久久久久9999| 色播五月婷婷| 丁香六月婷婷| 久久精品三级影视| 精品无码久久久久久国产浪潮| 欧美国产婷婷久久| 日韩成人人妻网站| 青青久日| 另类小说欧美激情校园春色| 91N综合网| 麻豆91熟妇人妻中文字幕茄子| 欧美日韩天堂| 亚洲AV在线资源| 免费看污网址| 欧美|91色综合| 欧美啪啪女女| 丁香五月天啪啪| 精品国产乱码久久久久久影片| 乱老女人一区二区视频| 国产一区96在线| 亚洲欧美精品一区天堂久久| 久久精品人体AV| 久久久久久大| 一区二区视频你懂的| 欧美97视频| 欧美精品欧美精品系列| 午夜福利 成人 91| 精品无码久久久久久久久果冻糖心| 天天做天天爱夜夜爽毛片试看| 中文字幕黄片在线| 日本激情免费大片| 国产av高清版| 亚洲风情综合网| 91大神精品长腿在线观看网站| 国产精品99精品视频网站| 国产精品国产自产高清AV| 亚洲精品影视老司机| 天天日日夜夜| 99日免费视频中文字幕| 精品人妻av区天天看片| 97人人操人人摸人人爱| 久久久久性熟视频| 四虎免费在线播放| 亚洲制服欧美另类内射| 久久嫩草国产成人一区| 91国产丝袜白虎| 91精品人妻电影| 久热久一区二区三区| 97久久国产精品| 欧美不卡在线一区二区| 久久久国产成人一区二区三区在线| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 青青草吊丝| 美女AV一区二区| 久久亚洲AV无码白度| 99热18| 亚洲天堂少妇| 亚乱色| 久久中出在线| 91在线国产后入风骚翘臀美女素人| 国产 日韩 欧美一区| 六月丁香啪啪| 久久精品电影| 九九精品热| 超碰碰97资源站| 五月丁香综合啪啪| 九九九九久久久久| 久无码| 亚洲久久久久| 欧美三级免费伊人| 色欲Av人妻精品一区二| 天堂在线一区二区| 综合欧美激情网| 视频黄站| 亚洲狼狼干综合1| 日韩欧美tv一区二区在线观看| 日本超碰色精品| 99只有精品| 国产成人91一区二区三区| 欧美国产视频| 激情综合五月| 先锋影音av先锋一区| 美女丝袜激情小说| 91丝袜美女| 国产精品久久久久久久久久久久久久吹| 91美女丝袜诱惑视频| 精品日韩人妻精品一二三区| 久9综合在线| 9 7超碰在线免费观看| 国产强奸超碰AV| 青娱乐老司机视频| 亚洲 欧美 第一页| 性性久久| 国产高清1234区| 综合夜夜| 久久久免费懂色| 亚洲AV免费在线观看| 人妻精品视频一区二区| 人妻中文字幕精品无码| 韩国三级一线观看久| 久久二| 欧美天天影院| 亚洲激情深爱文学小说网站| 麻豆精品天美| 日韩人妻无码精品系列| 亚欧美天堂在线| 欧色综合| 999 久久久| 精品96久久| 久久色一区二区| 色妹子A V| 亚洲熟妇乱女区二区三区| 色婷婷激情| 色噜噜综合在线| 校园春色综合| 麻豆人妻精品一区二区| 长长久久免费视频| 久久人妻丝袜一区二区三| 亚洲激情网一二三四区| 久久人妻无码毛片A片麻豆| 色婷婷综合久久久久中文一区二区 | 少妇一区二区三区高速| 日韩探花精品在线视频| 高清成年美女黄网站免费大全 | 精品一区二区三区蜜桃臀赵总| 九九热精品| 四月丁香婷婷| 经典丝袜一区| 97在线免费观看| 久久精品中文字幕观看| 天天干天天爽| 一区二区国产视频在线观看| 亚洲中文字幕熟女少妇一区二区| 中文字幕丰满人妻日本| 亚洲强奸乱伦影视网| 久久久婷婷| 久久97资源 网| 粉嫩AV一区二区夜夜| 免费福利视频中文字幕| 激情视频网址| 久久一二三四五六七八九区| 人人操超碰在线| 亚洲啪啪视频免费| 翘臀vidoes| 国产久9| 男人高清无码一区二区| 久久久久骚| 亚洲资源站| 成人国产精品三级A片| 国产超碰在线一区| 久久超碰网| 五月天综合| 亚欧美无遮挡| 中文精品一区二去| 英伦大奶子熟妇吊带| 91老司机视频| 情色AV电影| 免费一二区| 91老熟女逼| 爱妃国产亚洲视频中文字幕| 婷婷五月天影院| 色老大| 国产精品久久久久久久久AV大片| 亚洲偷91色| 3p国产色噜噜一区| 激情文学亚洲| 大香蕉人妻| 中国91AV| 久热伊人99re| 无码区蜜乳| 91精品免费| 中文字幕精品一区二区精| 中文字幕AV片| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 精品国产嫩穴视频| 国产综合色精品在线观看| 亚洲色欲一区二区三区| 欧美精品成人一区二区在线观看| 欧美在线官网| 国产成人精品无码久久| 中文字幕午夜精品久久久| 中国东北熟女老太婆内谢| 亚洲美女高潮喷水视频| 97操97色| 免费啪啪一级视频| 亚洲欧美国产va在线播放频| 日本最新1区2区3区| 五月婷婷性爱| 欧美18 在线观看| 久久九九精品一区二区| 欧美有码亚洲中文字幕一区二区三区四区 | 女人被男人桶爽视频网站| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 久久久人体| 在线看的av| 国产在线播放成人免费| 亚州高清av| 久久仑合| 混色激情av| 操美女高潮抽搐白浆| 中国操逼无码| 美女网站91| 欧美日韩97在线| 9热9热综合网| 丁香六月婷| 国产AV高清AV无码| 91色黑人少妇| 成人久久久精品| 岛国免费视频在线| 色色无码| 天天性射网| 高清无码 国产精品| 色呦呦、国产精品| 91色花堂| 爽爽淫人网| 欧美日韩性爱电影在线| 少妇内射视频| 蜜臀久久99精品久久久久电影| 综合激情一一91| 日本高清一本二本免费不卡| 色哟哟精品1精品2| 亚洲系列欧美| 久99在线免费观看视频| 久久久久久久久久9| 午夜精品久久久久久久第一页按摩| 青青国产在线拍揄自揄拍| 丰满少妇一区二区三区专区| 国产精品久久久久久高清无码免费看| 99国产在线 精品 视频| 草蕉影视亚洲无码| 亚洲国产一级精品毛一级精品看免费视频| 99热18这里只有精品| www.婷婷六月天| 麻花豆传媒剧国产MV出差| 久久久青青草| 1二区9| 四虎影院成年人片| 亚洲一区在线观看欧洲| 日天天九九天堂666| 91久久伊人婷婷青青草| 99婷婷| 国产成人免费观看在线视频| 欧美一区二区三区不卡高清视频| 精品国产乱码久久久久久日本公司| 久久久久9久久久久| 综合啪啪| 强奸乱伦资源| 欧美性爱18观看| 精品免费一区| 色爱天堂| 超碰欧美COM| 中出后入| A啊啊在线观看| 日韩人体偷拍| av九九| 日韩一级片在线看| 蜜乳AV一区| 日韩无码视频黄色| 97超碰色| 1240青青草一区二区三区视频天爱| 国产自啪精品视频网站黑丝| 欧美综合在线91| 97精品国产97久久久久久户外免费| 色五月首页| 1769精品一区二区三区| 亚洲无吗在线视频| 免费公开人人操| 色女99一级片在线观看| 最新亚洲人成网站在线影院| 国产第二页| 国产女人成人精品视频| 天天综合网日韩| 欧美 牲| 亚洲,欧美,春色,另类| 欧美精品成人一区二区在线观看 | 天天摸夜夜添无码小视频| 97欧美色综合| 肉丝网站91| 国产女生在线| 69少妇一区二区| 中日韓欧美高清| 婷婷九月国产| 久久av色| 熟妇熟女亚洲天堂网| 欧美一级A片在线看视频性色| 老妇女91| 国产日韩怡红院| 日日干夜夜欢| 97伪v| 久久国产对白激情浪潮 | 午夜福利久久久噜久噜久久综合| 国产精品自在线发布| 无码免费在线观看黄色片| 97在线视频网站| 亚洲a色| 日韩欧美三级| 日韩无码人妻中字久久三区四区| 97国产色图| 91精品国产乱码| 91激情网| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 怡红院亚洲怡春院av| 亚洲精品一卡二卡三卡福利视频网站| 天天色悠悠激情| 91久久国产综合久久| 亚洲国产第一页综合视频| 伊人成人中文字幕久久网| 国产亚州日韩欧美看片| 99热超碰在线| 日本三级久| 乱老熟女一区二区三区| 夜夜国产一区| 中文字幕精品三级久久久| 日韩欧美女求操每天更新| 男人天堂新在线| 欧美激情综合| 一级岛国大片| 热99这里只有精品| 亚洲天堂区| 99热导航| 亚州欧美在线| 青青操网| 欧美 亚洲 偷拍自拍| 欧美亚男人的天堂| 国内97干免费看| 亚洲色交| 国产Aα| 亚州宗合另类| 99热8| 超碰免费人妻人人| 99在线观看| 大肉棒导航| 久久精品国产亚洲AV先锋| 久久久久久日韩| 国产欧美第五页| 好爽要喷了| 日本成人A片网站| renqi久久久久久久久久久久| 爱妻综合网| 最新av中文字幕高清| 夂久色| 亚洲九九视频| 999亚洲国产视频| 啊啊啊啊在线观看网址| 蜜臀久久99精品久久久久久无删减 | 99色色网| 无码粉嫩白虎一线天b区| 日本高清一区二区在线| 精品一久久久| 天天射天天| 青青操在线亚洲视频观看欧美在线 | 青娱乐亚洲自拍| 欧美色日本| 老外又粗又长一晚做五次| 91爱综合| 日本乱人伦片中文三区| 亚洲情色一区三区| 性爱网站一区二区| 嗯嗯啊啊好大好爽| 伊人激情五月天一区二区| 天美麻豆黄色录像| 伦理片秋霞免费影院| 欧美草草高清日韩视频| 超碰精品在线| 国产午夜精品理论片a大结局| 无码一区二区三区四区五区六区七区八区九区十区视频 | 精品乱码久久久久| 强奸乱伦动态污图免费| a啊啊啊啊啊啊啊啊一区二区| av九九| 国产精品一区二区久久精品| 亚洲性少妇| 欧美激情综合色综合啪啪五月| 超碰在线一区二区| 蜜桃久久久久久久久久久久| 欧美大香蕉专区网| 欧美夜夜| 国产99999久久精品| 五月天社区| 亚洲国产婷婷在线播放| 一卡二卡在线播放| 999综合色| 天天干一区二区| 亚洲少妇中文字幕网址| 亚洲国产丝袜熟女av| 91综合天天看| 超碰1997| 无码人妻丰满熟妇奶水区毛片| 69精品久久久久中文字幕| 色视频蜜乳| 蜜臀久久99精品久久久久久| 乱色老一区二区三区的观看方式| 秋霞鲁丝午夜无码一区二区三| 久久国产视频性吧 | 免费日韩黄片| 日韩丰满熟妇| 婷婷五月激情综合| 亚洲精品97久久| 久99热| 日韩操p| 日韩亚洲国产视频| 噜噜噜无码AV一级一级久久影院| 久久久爆乳翘臀一线天伦理视频| JULIA一区二区三区在线播放| 五月丁香综合| 夜夜人妻爽| 久久久久久久性爱| 2018天天干在线视频| 91久久婷婷| 欧美日动态视频| 亚洲国产综合图区中文字幕| 噜噜噜在线视频| 日本曲间由美性生活片| 亚洲诱惑天堂 | 一级岛国大片| 亚洲色五月| 久久精品99久久久久久| 亚洲无码com| 久久婷婷伊人| 啊嗯嗯啊好大好爽| 操婢日韩| 成人精品视频一区二区| 天堂网亚洲区手机版| 上床啊啊啊| 少妇熟女1区2区3区| 七久久久| 嗯嗯啊啊啊好爽| 国产一区二区三区精品观看啪| 色五月天AV| 正在播放国产精品一区| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 国产激情在线| 亚洲午夜免费狠狠干| 蜜臀视频网站| 精品久久久久成人码免| 天美传媒麻豆一区二区三区国产精| 黑人精品欧美一区二区蜜桃| 青青青草原| 精品高清一区二区三区三州| 天天插天天插| 青青草久久| 国产亚洲精品无码三区| 亚洲少妇色| 精品大全99999| 最近2019中文字幕国语免费版| 美女尤物福利视频| 夜夜夜夜久久久久| 亚洲AV秘 精品久久老牛影视| 日韩成人色图| 少妇无码999| 五月婷婷丁香六月| 久久久一区二区三区麻豆| 1769精品一区二区三区| 学生妹天天看| 人妻一区视频| 热久久无毒不卡| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 人妻碰碰碰碰碰碰| 99人妻| 东北黄色电影| 成人精品在线免费视频| 色噜噜综合在线| 亚洲精品久久久久毛片A片拉屎 | 午夜噜噜噜| 天天操av懂色| 偷拍精品一区二区三区| 欧美熟妇人体| 黄色网址在线免费观看| 91色欧美| 九九九九88| 91丨九色丨国产打屁股| 啪啪自拍九九综合| yazhousetuoumei| 欧美人妻久久精品二区三区 | 丁香五月成人| 国产精品久久妻无码网站| 操91| 国产13区| 午夜一区| 国模不卡| 超碰午夜| 老熟女天天操| 传媒免费一区二区三区| 九九色图| 91午夜无码| 婷婷色综合欧美日韩| 人人爽夜夜玩视频| 神马福利久草| 国产小u女在线观看| 少妇啪啪自拍| 三上悠亚在线毛片91| 高颜值美女口爆高潮浪叫| 久久av网| 中文字幕片| 一品道视频一区二区三区| 免费一级毛片在线视频观看| AV乱伦专区| 翔田千里AV无码秘 三区| 麻豆熟妇乱妇熟色A片在线看| 一区二区国产视频在线观看| 在线 亚洲 网爆 自拍| 一区二区三区四区色图| 婷婷丁香六月天| 日韩成人综合网|