亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

深入Java NIO.2文件系統(tǒng):Path、Files與WatchService核心實(shí)現(xiàn)解析

深入Java NIO.2文件系統(tǒng):Path、Files與WatchService核心實(shí)現(xiàn)解析 剛接觸 NIO.2 的時(shí)候我一度以為 java.nio.file 只是給老 java.io.File 換了層好看的外殼。真正把這套包挖到底層之后才發(fā)現(xiàn)它從路徑表示、文件屬性到目錄監(jiān)聽(tīng)都重新抽象了一遍算得上 Java 文件 I/O 領(lǐng)域一次徹底重構(gòu)。今天這篇文章就把java.nio.file的核心組件和實(shí)現(xiàn)原理拆開(kāi)講重點(diǎn)解釋它為什么這樣設(shè)計(jì)、底層做了什么以及實(shí)際使用時(shí)容易踩的坑。無(wú)論你是準(zhǔn)備給項(xiàng)目做統(tǒng)一文件管理還是想實(shí)現(xiàn)目錄變更監(jiān)聽(tīng)、跨平臺(tái)屬性讀取這篇內(nèi)容都能給你一條清晰的技術(shù)路線。1. 內(nèi)容整體設(shè)計(jì)與思路拆解1.1 從 java.io.File 的尷尬說(shuō)起每個(gè)用過(guò)java.io.File的人應(yīng)該都體會(huì)過(guò)它的別扭它既能表示一個(gè)存在的文件又能表示一個(gè)不存在的路徑判斷對(duì)象到底是文件還是目錄得靠isFile()現(xiàn)場(chǎng)探測(cè)符號(hào)鏈接、文件權(quán)限、修改時(shí)間這些信息全都要通過(guò)額外的方法去取取到的也不是統(tǒng)一視圖。更麻煩的是File類(lèi)的很多操作是阻塞式的在目錄條目特別多的高并發(fā)場(chǎng)景下一個(gè)簡(jiǎn)單的listFiles()都可能成為性能瓶頸。而java.nio.file把這些概念分得清清楚楚。Path只負(fù)責(zé)描述路徑Files只負(fù)責(zé)執(zhí)行操作FileSystem定義了一類(lèi)文件系統(tǒng)的邊界FileStore則對(duì)應(yīng)真實(shí)的存儲(chǔ)設(shè)備。這樣一來(lái)代碼不再依賴“某個(gè)文件對(duì)象”這種模糊的東西而是通過(guò)路徑 操作 屬性三層結(jié)構(gòu)來(lái)組織邏輯。以目錄列表為例Files.newDirectoryStream()返回一個(gè)可關(guān)閉的DirectoryStream按需迭代而不是一次性把全部條目加載進(jìn)內(nèi)存在大目錄下表現(xiàn)穩(wěn)定得多。這套設(shè)計(jì)真正解決了我過(guò)去幾十個(gè)文件工具類(lèi)的通病。以前我寫(xiě)遞歸刪除需要自己判斷符號(hào)鏈接、判空目錄、處理權(quán)限異常代碼里全是if (file.isDirectory())這種分支。切到Files.walkFileTree后遍歷和訪問(wèn)控制被抽象成FileVisitor回調(diào)骨架代碼幾乎固定我只能專注于業(yè)務(wù)邏輯出錯(cuò)概率也降下來(lái)。1.2 面向 SPI 的擴(kuò)展思路java.nio.file的另一個(gè)關(guān)鍵設(shè)計(jì)是引入了Provider機(jī)制。核心包定義的是FileSystemProvider這個(gè)抽象類(lèi)真正的文件系統(tǒng)實(shí)現(xiàn)由具體 Provider 完成默認(rèn)的fileProvider 負(fù)責(zé)訪問(wèn)本地磁盤(pán)。這個(gè)機(jī)制讓 Java 生態(tài)可以擴(kuò)展出 ZIP 文件系統(tǒng)、內(nèi)存文件系統(tǒng)、遠(yuǎn)程文件系統(tǒng)等。日常我們常用的Paths.get(“/tmp/a.txt”)本質(zhì)上是在默認(rèn)文件系統(tǒng)上創(chuàng)建路徑而FileSystems.newFileSystem(uri, map)則可以掛載一個(gè) ZIP 包把它當(dāng)作一個(gè)獨(dú)立的文件系統(tǒng)來(lái)操作。這種“一套 API多種后端”的抽象非常值錢(qián)。比如我維護(hù)的一個(gè)老項(xiàng)目原來(lái)所有資源都散落在本地目錄后來(lái)需要把部分靜態(tài)資源遷移到壓縮包內(nèi)我只需要替換文件系統(tǒng)創(chuàng)建方式業(yè)務(wù)層的Path、Files調(diào)用幾乎沒(méi)改。因?yàn)樗胁僮鞫冀⒃贔ileSystem之上業(yè)務(wù)代碼不依賴具體存儲(chǔ)形態(tài)擴(kuò)展成本就低了。1.3 一次重構(gòu)解決的問(wèn)題清單我接觸 java.nio.file 時(shí)最直觀的感受是它的方法簽名經(jīng)過(guò)大量打磨。舉幾個(gè)例子Files.move可以用StandardCopyOption.ATOMIC_MOVE要求原子移動(dòng)這在配置文件熱更新場(chǎng)景下能避免讀到半截文件Files.readAttributes通過(guò)LinkOption.NOFOLLOW_LINKS來(lái)控制是否跟隨符號(hào)鏈接Files.newBufferedReader默認(rèn)使用 UTF-8 而不是平臺(tái)默認(rèn)編碼。每一個(gè)選項(xiàng)背后都是過(guò)去 File API 中容易出現(xiàn)的邊界問(wèn)題。這說(shuō)明 java.nio.file 不只是在 API 數(shù)量上做加法而是按“你能對(duì)文件做什么”這個(gè)維度重新歸納。設(shè)計(jì)者對(duì)常見(jiàn)操作做了枚舉把選項(xiàng)約束在類(lèi)型安全的枚舉常量里而不是像老 API 一樣用 int 掩碼。比如打開(kāi)文件時(shí)的StandardOpenOption.CREATE、TRUNCATE_EXISTING這些常量組合起來(lái)可讀性很好IDE 自動(dòng)補(bǔ)全也能減少低級(jí)錯(cuò)誤。2. 核心組件逐個(gè)拆解2.1 Path、Paths、Files 三件套的關(guān)系Path接口是 java.nio.file 的基礎(chǔ)你可以把它想象成一個(gè)不可變的路徑描述對(duì)象。它不像File那樣直接綁定磁盤(pán)上的某個(gè)實(shí)體而更像一個(gè)字符串加上解析規(guī)則。Paths.get(String)是創(chuàng)建Path最常見(jiàn)的入口但其實(shí)它底層調(diào)用的是FileSystems.getDefault().getPath(...)。這個(gè)細(xì)節(jié)很重要路徑是相對(duì)于某個(gè)文件系統(tǒng)存在的同一個(gè)字符串在不同文件系統(tǒng)里可能解析成不同含義。Files類(lèi)則是工具類(lèi)幾乎所有靜態(tài)操作都在這里定義復(fù)制、移動(dòng)、刪除、讀屬性、創(chuàng)建目錄、寫(xiě)文本、遍歷目錄樹(shù)。理論上你可以只依賴Path和Files完成絕大多數(shù)文件操作。Files的很多方法返回Path或StreamPath這些返回結(jié)果可以繼續(xù)串聯(lián)代碼風(fēng)格上比File時(shí)代流暢得多。有一個(gè)容易忽視的地方Path的equals比較的是路徑字符串解析后的結(jié)果而不是文件系統(tǒng)中的真實(shí)文件。也就是說(shuō)Paths.get(/a/../b)和Paths.get(/b)的 equals 通常為 false除非你調(diào)用normalize()。判斷兩個(gè)路徑是否指向同一文件更可靠的方式是Files.isSameFile(p1, p2)它通過(guò)文件系統(tǒng)比對(duì) inode 等信息。我在監(jiān)控腳本里就吃過(guò)這個(gè)虧用 equals 去重兩個(gè)“看起來(lái)一樣”的路徑結(jié)果兩個(gè)都處理了后來(lái)改成isSameFile才算穩(wěn)定。2.2 Path 的內(nèi)部表示和解析規(guī)則Path接口定義了一組解析方法getParent、getFileName、getRoot、getNameCount、subpath、resolve、relativize。理解這些方法的輸出對(duì)拼接路徑很有幫助。resolve方法有點(diǎn)像一個(gè)智能拼接如果傳入的是絕對(duì)路徑它直接返回參數(shù)路徑如果傳入的是相對(duì)路徑就在當(dāng)前路徑末尾追加。很多新人在寫(xiě)路徑拼接時(shí)習(xí)慣自己加/一旦處理../就會(huì)出問(wèn)題正確做法是交給Path.resolve。底層具體實(shí)現(xiàn)因系統(tǒng)而異。類(lèi) Unix 系統(tǒng)里的UnixPath內(nèi)部不是直接保存 String而是保存了字節(jié)數(shù)組因?yàn)榈讓酉到y(tǒng)調(diào)用需要的是字節(jié)序列。解析時(shí)會(huì)按平臺(tái)的路徑分隔符切分同時(shí)還要處理.、..、重復(fù)分隔符等。normalize()返回的是語(yǔ)義上等價(jià)的簡(jiǎn)化路徑但它不做字符串合并而是逐個(gè)路徑元素判斷。至于訪問(wèn)真實(shí)文件時(shí)路徑還要轉(zhuǎn)成系統(tǒng)調(diào)用參數(shù)中間會(huì)經(jīng)過(guò) JNI 層的路徑轉(zhuǎn)換。還有個(gè)大坑路徑比較用compareTo是有平臺(tái)差異的Windows 不區(qū)分大小寫(xiě)而 Unix 區(qū)分。所以直接用字符串排序往往不符合預(yù)期。如果需要穩(wěn)定的排序最好自行統(tǒng)一成小寫(xiě)比較。2.3 FileSystem 和 FileStoreFileSystem抽象代表一個(gè)文件系統(tǒng)的實(shí)例。默認(rèn)文件系統(tǒng)通常對(duì)應(yīng)操作系統(tǒng)根文件系統(tǒng)但你也可以打開(kāi) ZIP 文件系統(tǒng)那時(shí)候它會(huì)管理 ZIP 包內(nèi)部的所有條目。FileSystem提供getPath(String)來(lái)創(chuàng)建 Path提供getFileStores()來(lái)查看存儲(chǔ)。注意一個(gè) FileSystem 里可以有多個(gè) FileStore比如一個(gè)根磁盤(pán)可能有多個(gè)掛載點(diǎn)。FileStore代表底層存儲(chǔ)池你通過(guò)Files.getFileStore(Path)能拿到目標(biāo)文件所在的存儲(chǔ)然后調(diào)用getTotalSpace()、getUsableSpace()、getUnallocatedSpace()查詢?nèi)萘俊_@個(gè)功能在實(shí)現(xiàn)磁盤(pán)告警時(shí)非常有用不需要再執(zhí)行外部命令去解析 df 輸出。getAttribute還可以讀取 store-level 的屬性比如是否支持大文件、是否只讀。需要留意的是FileStore 的容量統(tǒng)計(jì)結(jié)果受文件系統(tǒng)配額和權(quán)限影響。某平臺(tái)下普通用戶看到的可用空間和 root 看到的可能不同這不算 bug只是底層statvfs按調(diào)用用戶返回的結(jié)果。2.4 文件屬性統(tǒng)一視圖java.nio.file的屬性體系也是重頭戲。最常用的是Files.readAttributes(Path, BasicFileAttributes.class)它返回一個(gè)視圖接口包含creationTime、lastModifiedTime、size、isDirectory、isRegularFile、isSymbolicLink等。還可以傳入DosFileAttributes、PosixFileAttributes獲取系統(tǒng)特有屬性比如權(quán)限位、屬主、隱藏標(biāo)志。這套屬性接口背后是動(dòng)態(tài)代理式實(shí)現(xiàn)。具體 Provider 會(huì)把屬性讀取請(qǐng)求映射到底層系統(tǒng)調(diào)用比如 Unix 上讀取unix:mode會(huì)調(diào)用stat系列函數(shù)。如果你只想讀一個(gè)字段也可以直接用字符串形式Files.getAttribute(path, unix:mode)。不過(guò)字符串容易打錯(cuò)推薦用類(lèi)型化接口。屬性讀取要考慮符號(hào)鏈接。Files.readAttributes(path, BasicFileAttributes.class)默認(rèn)跟隨鏈接讀取的是鏈接指向目標(biāo)的屬性。如果想讀取鏈接本身的屬性要傳LinkOption.NOFOLLOW_LINKS。這幾個(gè)LinkOption不是裝飾品——在找符號(hào)鏈接本身時(shí)不正確使用會(huì)導(dǎo)致返回的isSymbolicLink()一直是 false。3. 實(shí)現(xiàn)原理FileSystemProvider 與底層系統(tǒng)調(diào)用3.1 Provider 的加載與選擇java.nio.file 的依賴注入核心在FileSystemProvider這個(gè)抽象類(lèi)。它提供了newFileSystem,getPath,newByteChannel,newDirectoryStream,readAttributes,createDirectory,delete等一大堆抽象方法。默認(rèn)的fileProvider 安裝時(shí)被注冊(cè)到系統(tǒng)列表里FileSystemProvider.installedProviders()使用ServiceLoader從META-INF/services里加載擴(kuò)展。有意思的是你不能直接用new創(chuàng)建一個(gè) ProviderJDK 保證只有通過(guò)ServiceLoader機(jī)制加載到的 Provider 才能被系統(tǒng)認(rèn)可。這從機(jī)制上防止了外部創(chuàng)建偽造的 Provider 干擾文件系統(tǒng)路徑解析。自定義文件系統(tǒng)插件比如內(nèi)存文件系統(tǒng)只需要在 jar 包的 META-INF/services 里聲明實(shí)現(xiàn)類(lèi)調(diào)用FileSystems.newFileSystem(URI.create(mem:///))就能被找到。3.2 本地方法調(diào)用的實(shí)現(xiàn)模型具體 Provider 最終還是要調(diào)用操作系統(tǒng)能力。以 Linux 為例UnixFileSystemProvider在 open、read、stat 等操作上會(huì)調(diào)用UnixNativeDispatcher里的 native 方法。這些方法用 JNI 實(shí)現(xiàn)直接包裝系統(tǒng)調(diào)用比如open、close、statvfs等。這意味著Files類(lèi)一個(gè)簡(jiǎn)單的Files.size(path)在底層可能經(jīng)過(guò)一次stat系統(tǒng)調(diào)用而不是直接讀取Path內(nèi)部保存的長(zhǎng)度。為了減少系統(tǒng)調(diào)用次數(shù)JDK 在 Unix 實(shí)現(xiàn)里大量使用了stat結(jié)構(gòu)體緩存。UnixFileAttributes會(huì)把一次系統(tǒng)調(diào)用拿到的 mode、uid、gid、size、mtime 都保存下來(lái)后續(xù)的isDirectory、size等屬性查詢都從緩存對(duì)象里取不需要再多次穿過(guò) JNI。如果你做百萬(wàn)量級(jí)的文件遍歷這個(gè)優(yōu)化非常明顯。底層還有一個(gè)細(xì)節(jié)open系統(tǒng)調(diào)用經(jīng)常需要配合O_NOFOLLOW等標(biāo)志但 java.nio.file 的 API 本身沒(méi)有直接暴露 open flags而是把LinkOption.NOFOLLOW_LINKS、StandardOpenOption、PosixFilePermissions這些抽象參數(shù)翻譯成對(duì)應(yīng)的系統(tǒng)層標(biāo)志。這種分層正是實(shí)現(xiàn)可移植性的關(guān)鍵。3.3 從 open 到 FileChannel很多人可能沒(méi)意識(shí)到Files.newInputStream和Files.newByteChannel之間是有共性的。newByteChannel返回一個(gè)SeekableByteChannel實(shí)例這個(gè)對(duì)象在默認(rèn)文件系統(tǒng)里就是FileChannel。FileChannel與普通輸入輸出流最大的區(qū)別是它持有文件描述符fd并且能進(jìn)行 random access、文件鎖、內(nèi)存映射等操作。從實(shí)現(xiàn)角度看UnixFileSystemProvider.newByteChannel調(diào)用UnixChannelFactory.open先構(gòu)造打開(kāi)標(biāo)志集再調(diào)用底層open拿到 fd最后把 fd 包裝成FileChannelImpl。值得注意的地方是FileChannel默認(rèn)是阻塞模式但也可以放到Selector里做多路復(fù)用嚴(yán)格說(shuō)不能直接注冊(cè)因?yàn)镕ileChannel不是SelectableChannel無(wú)法用傳統(tǒng) NIO selector 監(jiān)聽(tīng)就緒狀態(tài)。要監(jiān)聽(tīng)文件變化應(yīng)該用WatchService它走的是另一條事件機(jī)制。3.4 WatchService 的事件監(jiān)聽(tīng)原理WatchService是 java.nio.file 里我最喜歡的組件之一。它讓你注冊(cè)一個(gè)目錄然后阻塞式等待目錄內(nèi)文件的創(chuàng)建、刪除、修改事件。底層實(shí)現(xiàn)因平臺(tái)不同Linux 上主用的是inotify通過(guò)inotify接口注冊(cè) watch 描述符事件通過(guò)文件描述符讀取而某些平臺(tái)如果無(wú)法使用原生事件會(huì)降級(jí)到PollingWatchService也就是定時(shí)掃描目錄對(duì)比快照。實(shí)現(xiàn)層面注冊(cè)到 WatchService 時(shí)WatchKey負(fù)責(zé)保存每個(gè)目錄的監(jiān)視狀態(tài)注冊(cè)有事件的目錄會(huì)維護(hù)一份事件列表。take()方法會(huì)阻塞等待事件poll()是非阻塞獲取。事件取出后WatchKey.reset()能被復(fù)用如果不 reset它就不會(huì)再收到新事件。這個(gè)狀態(tài)機(jī)設(shè)計(jì)在文檔里不顯眼但實(shí)際寫(xiě)監(jiān)聽(tīng)程序時(shí)漏了 reset 是最常見(jiàn)的 bug。Linux 實(shí)現(xiàn)細(xì)節(jié)是每個(gè)注冊(cè)的目錄對(duì)應(yīng)一個(gè)inotifywatch 描述符事件對(duì)象會(huì)把底層inotify_event里的 cookie、name、mask 翻譯成 Java 層的StandardWatchEventKinds.ENTRY_CREATE等。需要注意inotify在目錄自身被刪除時(shí)可能會(huì)有事件丟失或崩潰現(xiàn)象所以生產(chǎn)環(huán)境要配合定時(shí)巡檢。3.5 符號(hào)鏈接與擴(kuò)展屬性符號(hào)鏈接處理是 java.nio.file 與老 File API 差異最大的一塊。老 API 面對(duì)符號(hào)鏈接基本是“看不見(jiàn)”而 NIO.2 顯式引入NOFOLLOW_LINKS在很多方法參數(shù)里都會(huì)出現(xiàn)。例如Files.exists(path, LinkOption.NOFOLLOW_LINKS)可以檢測(cè)“鏈接本身是否存在”而Files.exists(path)則檢測(cè)“鏈接目標(biāo)是否存在”。這看似簡(jiǎn)單但在處理文件遷移、備份工具時(shí)至關(guān)重要。擴(kuò)展屬性則通過(guò)UserDefinedFileAttributeView支持用戶自定義屬性它把屬性寫(xiě)到文件系統(tǒng)的擴(kuò)展屬性區(qū)域。這在類(lèi) Unix 系統(tǒng)上對(duì)應(yīng)setxattr/getxattr系統(tǒng)調(diào)用??梢詫?shí)現(xiàn)類(lèi)似“給文件打標(biāo)簽”的功能而不需要維護(hù)額外的數(shù)據(jù)庫(kù)索引。4. 實(shí)操過(guò)程與核心環(huán)節(jié)實(shí)現(xiàn)4.1 目錄遍歷Files.walkFileTree 的骨架我記得第一次用Files.walkFileTree寫(xiě)目錄清掃工具時(shí)最大的感受是“代碼結(jié)構(gòu)終于有了形狀”。SimpleFileVisitor提供了一系列默認(rèn)回調(diào)你只需要覆寫(xiě)visitFile、preVisitDirectory、postVisitDirectory、visitFileFailed。比如物理刪除一個(gè)多級(jí)目錄核心邏輯只要覆寫(xiě)visitFile時(shí)刪除文件在postVisitDirectory時(shí)刪除空目錄Path root Paths.get(/data/tmp); Files.walkFileTree(root, 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; } });我還會(huì)額外覆寫(xiě)preVisitDirectory對(duì)符號(hào)鏈接目錄返回SKIP_SUBTREE防止誤刪鏈接指向的整個(gè)目錄。這個(gè)操作我吃過(guò)一次大虧以前用File遞歸時(shí)沒(méi)有檢查符號(hào)鏈接直接把一個(gè)軟鏈接當(dāng)成目錄遞歸下去清理腳本刪掉了不該刪的數(shù)據(jù)?,F(xiàn)在用 visitor 后可以在訪問(wèn)前判斷attrs.isSymbolicLink()并跳過(guò)安全很多。4.2 文件屬性批量讀取與對(duì)比另一個(gè)高頻場(chǎng)景是“找出目錄里所有超過(guò) 100MB 的文件”。用Files.walk配合Stream可以一行寫(xiě)出try (StreamPath stream Files.walk(Paths.get(/data))) { ListPath bigFiles stream .filter(p - { try { return Files.isRegularFile(p) Files.size(p) 100L * 1024 * 1024; } catch (IOException e) { return false; } }) .collect(Collectors.toList()); }注意 Stream 資源必須關(guān)閉這里用 try-with-resources 是必須的。如果目錄非常深、文件特別多Files.walk的遍歷順序未必穩(wěn)定而且它會(huì)用掉大量文件描述符。更底層的DirectoryStream更適合手動(dòng)迭代按需關(guān)閉。我通常先調(diào)用Files.readAttributes一次性讀取屬性緩存然后從這個(gè)對(duì)象里取size和類(lèi)型避免每個(gè)文件調(diào)兩次方法產(chǎn)生兩次系統(tǒng)調(diào)用。屬性對(duì)象本身是一次性快照不代表實(shí)時(shí)狀態(tài)但在批量掃描場(chǎng)景里足夠用了。4.3 WatchService 實(shí)現(xiàn)目錄實(shí)時(shí)監(jiān)聽(tīng)目錄監(jiān)視是最容易出現(xiàn)“代碼看起來(lái)對(duì)但實(shí)際不工作”的場(chǎng)景之一。我寫(xiě)過(guò)一個(gè)小工具監(jiān)聽(tīng)上傳目錄先用Paths.get(uploadDir).register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY)注冊(cè)然后循環(huán)take()try (WatchService watcher FileSystems.getDefault().newWatchService()) { Path dir Paths.get(/data/incoming); dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); while ((key watcher.take()) ! null) { for (WatchEvent? event : key.pollEvents()) { Path changed (Path) event.context(); System.out.println(event.kind() - changed); } key.reset(); } }這里要強(qiáng)調(diào)key.reset()不是可選項(xiàng)。如果忘記調(diào)用那個(gè)目錄的 WatchKey 會(huì)進(jìn)入 invalid 狀態(tài)后續(xù)事件全部收不到。另外event.context()返回的是相對(duì)于監(jiān)視目錄的路徑不是完整路徑。完整路徑需要dir.resolve(changed)這是新手最?lèi)?ài)跳的坑。平臺(tái)差異也需要注意在 Linux 上如果用inotify事件里修改可能不會(huì)激活綁定如果用輪詢實(shí)現(xiàn)要自己控制poll間隔。如果監(jiān)聽(tīng)到事件后立刻去讀文件有可能文件還沒(méi)寫(xiě)完最好結(jié)合ENTRY_MODIFY的多個(gè)事件做延遲處理比如等 200ms 或等文件大小不再變化。4.4 把 ZIP 包當(dāng)成文件系統(tǒng)java.nio.file 的抽象能力可以通過(guò)FileSystems.newFileSystem體驗(yàn)。下面這段代碼打開(kāi)一個(gè) ZIP 文件把內(nèi)部條目當(dāng)作路徑訪問(wèn)URI zipUri URI.create(jar: Paths.get(app.zip).toUri()); try (FileSystem zipFs FileSystems.newFileSystem(zipUri, Collections.emptyMap())) { Path zipRoot zipFs.getPath(/); Files.walk(zipRoot) .filter(p - Files.isRegularFile(p)) .forEach(System.out::println); }這個(gè)方式特別適合做資源包校驗(yàn)。原來(lái)我要用ZipInputStream手動(dòng)讀條目還得維護(hù) ZipEntry 狀態(tài)現(xiàn)在用統(tǒng)一的FilesAPI代碼邏輯和本地文件操作完全一致。需要留意 ZIP 文件系統(tǒng)的文件屬性很多是從壓縮表里推導(dǎo)的修改時(shí)間精度可能有限而且寫(xiě)入 ZIP 會(huì)重新打包整個(gè)文件性能不如直接流寫(xiě)。5. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄5.1 Files.createTempDirectory 刪除失敗Files.createTempDirectory創(chuàng)建的臨時(shí)目錄在 Windows 上默認(rèn)帶了只讀屬性嗎不一定。我遇到過(guò)最經(jīng)典的問(wèn)題是用Files.walkFileTree刪除臨時(shí)目錄時(shí)因?yàn)檫€有句柄沒(méi)關(guān)閉導(dǎo)致刪除失敗。異常通常是DirectoryNotEmptyException或FileSystemException出現(xiàn)在 Windows 上更多。處理方式很簡(jiǎn)單在刪除前確保所有DirectoryStream、FileChannel、StreamPath都已經(jīng) close。如果仍然失敗可以加FileVisitResult.TERMINATE打印具體路徑。還有一個(gè)隱蔽問(wèn)題創(chuàng)建臨時(shí)目錄時(shí)指定前綴很短多個(gè)線程同時(shí)創(chuàng)建可能撞名JDK 內(nèi)部的沖突重試機(jī)制雖然存在并發(fā)很高時(shí)仍可能頻繁沖突。建議前綴帶上線程名或隨機(jī)數(shù)減少碰撞。5.2 路徑比較與 toString 的認(rèn)知偏差很多人以為Path.toString()就是傳給Paths.get的原始字符串。實(shí)際上Path實(shí)現(xiàn)類(lèi)可能對(duì)絕對(duì)路徑做了規(guī)范化。比如多次調(diào)用dir.resolve(child)后toString結(jié)果可能包含冗余分隔符但不會(huì)把..自動(dòng)消掉。要生成可打印的路徑字符串調(diào)用toAbsolutePath().normalize().toString()更穩(wěn)妥。在跨平臺(tái)系統(tǒng)上要特別注意絕對(duì)路徑的判斷。Linux 的/tmp/a是絕對(duì)路徑Windows 的C:\tmp\a也是但Paths.get(/tmp).isAbsolute()在 Windows 平臺(tái)會(huì)返回 false因?yàn)楦皇窃摫P(pán)符。如果代碼要同時(shí)跑多個(gè)平臺(tái)統(tǒng)一用 URI 或FileSystem.getPath處理會(huì)更可靠。5.3 WatchService 事件丟失與重復(fù)事件丟失多發(fā)生在目錄創(chuàng)建后立刻注冊(cè)的場(chǎng)景。比如你Files.createDirectory后馬上調(diào)用register理論上沒(méi)問(wèn)題但如果是程序外部創(chuàng)建的目錄權(quán)限或 mount 時(shí)機(jī)可能導(dǎo)致注冊(cè)失敗。第二個(gè)常見(jiàn)丟失場(chǎng)景是監(jiān)聽(tīng)目錄本身被移動(dòng)或刪除無(wú)法繼續(xù)收到父目錄內(nèi)該子目錄的事件。解決方式是監(jiān)聽(tīng)父目錄并自行維護(hù)子目錄注冊(cè)表動(dòng)態(tài) add/remove。事件重復(fù)則是因?yàn)橐淮挝募薷目赡苡|發(fā)多個(gè) ENTITY_MODIFY。比如一個(gè)文件寫(xiě)入 10 次可能積壓 10 條事件。處理思路是以“最終狀態(tài)”為準(zhǔn)事件到達(dá)后做去重和延遲聚合而不是每來(lái)一個(gè)事件就立刻處理。5.4 異常類(lèi)型對(duì)照速查java.nio.file 的異常體系很清晰但只要不熟悉一開(kāi)始容易被FileSystemException弄懵。它是許多文件操作異常的基類(lèi)NoSuchFileException、FileAlreadyExistsException、DirectoryNotEmptyException、AtomicMoveNotSupportedException都是它的子類(lèi)。捕獲時(shí)盡量精確捕獲比如FileAlreadyExistsException不要捕獲成IOException一次性處理否則無(wú)法針對(duì)性重試。還有一個(gè)偏門(mén)異常AccessDeniedException通常來(lái)自系統(tǒng)權(quán)限不足。在 Windows 上如果文件被資源管理器占用刪除時(shí)會(huì)拋出FileSystemException且消息為進(jìn)程占用在 Linux 上是文本“Permission denied”。處理時(shí)可以統(tǒng)一轉(zhuǎn)成業(yè)務(wù)自定義異常帶上路徑和操作類(lèi)型方便排查。5.5 Stream 資源泄漏問(wèn)題Files.walk、Files.list、Files.lines都返回Stream這些 Stream 內(nèi)部持有目錄流或文件通道。如果忘記 close輕則 fd 耗盡重則導(dǎo)致目錄句柄無(wú)法釋放。用 try-with-resources 是基本要求。有人會(huì)問(wèn) stream 的onClose會(huì)不會(huì)自動(dòng)注冊(cè)其實(shí)內(nèi)部確實(shí)注冊(cè)了 close handler但只有你關(guān)閉流時(shí)才會(huì)調(diào)用。我在排查一個(gè)服務(wù)問(wèn)題時(shí)發(fā)現(xiàn) fd 數(shù)量漲到幾千后來(lái)定位到是某個(gè)后臺(tái)任務(wù)用Files.list掃描目錄后沒(méi)有關(guān)閉流目錄句柄一直被占用。修復(fù)方法很簡(jiǎn)單把流放到 try-with-resources 里并且所有中間過(guò)濾和收集操作放在 try 塊內(nèi)完成。這里沒(méi)有玄學(xué)就是紀(jì)律。5.6 符號(hào)鏈接導(dǎo)致的遞歸死循環(huán)遍歷目錄樹(shù)時(shí)如果目錄里有指向祖先目錄的符號(hào)鏈接Files.walk默認(rèn)不會(huì)無(wú)限遞歸因?yàn)樵谀J(rèn)的FileVisitOption里沒(méi)有FOLLOW_LINKS。但如果你主動(dòng)加了FOLLOW_LINKS就可能形成環(huán)。這時(shí)要用visitFileFailed捕獲FileSystemLoopException。這個(gè)異常是專門(mén)為目錄循環(huán)設(shè)計(jì)的捕獲后返回CONTINUE或SKIP_SUBTREE。還有一點(diǎn)加了FOLLOW_LINKS后Files.readAttributes可能跳過(guò)鏈接本身導(dǎo)致無(wú)法獲取鏈接屬性。需要同時(shí)用NOFOLLOW_LINKS單獨(dú)訪問(wèn)。權(quán)限比較緊張的環(huán)境里最好默認(rèn)不跟隨鏈接只在確定安全的業(yè)務(wù)場(chǎng)景里使用。寫(xiě)在最后的一點(diǎn)經(jīng)驗(yàn)我實(shí)際使用中發(fā)現(xiàn)java.nio.file 最大的價(jià)值不是某一個(gè)類(lèi)方法而是它把文件系統(tǒng)操作整理成了一組語(yǔ)義清晰、可組合、可擴(kuò)展的抽象。Path、Files、FileSystemProvider三層結(jié)構(gòu)讓我寫(xiě)文件工具類(lèi)時(shí)不自覺(jué)地考慮跨平臺(tái)和異常處理代碼也更容易測(cè)試。如果你剛開(kāi)始接觸這套 API不要急著去背方法名先把Path和Files之間的關(guān)系搞熟再嘗試用FileVisitor重寫(xiě)一個(gè)舊的遞歸刪除。這個(gè)過(guò)程會(huì)逼你理解符號(hào)鏈接、目錄流關(guān)閉、異常分類(lèi)這些底層細(xì)節(jié)。等你能把WatchService的 reset 狀態(tài)機(jī)講明白NIO.2 基本就入門(mén)了。最后再分享一個(gè)小技巧寫(xiě)文件操作代碼時(shí)盡量把所有可能拋 IOException 的操作集中到一個(gè)方法里用業(yè)務(wù)異常包裝底層異常同時(shí)保留原始異常鏈。這樣日志里能看到是哪一步系統(tǒng)調(diào)用失敗而不是整屏的Caused by層層嵌套。這套經(jīng)驗(yàn)不一定出現(xiàn)在手冊(cè)里但排查線上問(wèn)題時(shí)會(huì)幫你省很多時(shí)間。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日韩三级在线观看mp4| 99热97| 97色欧洲| 人妻熟女午夜精品在线| 91丨国产丨白浆秘 洗澡动漫| 色噜噜婷婷| 99少妇| 91天天综合在线观看| 精品久久无码午夜福利| 亚州色阁| 亚洲五月天激情| 97香蕉网| 亚洲日韩资源| 五月婷婷六月色| 欧美性爱日韩高清| 男人天堂毛片| 91蜜臀在线久久久久| 99在线无码精品秘 入口黑人| 97天天在线| 亚洲精品国产熟女| 热99re69精品8在线播放| n1038 一二三区| 试看日韩黄片| 好湿好紧视频| 久久久国产精品人妻丝袜| 精品一区二区综合熟妇| 欧美天天| 久久久久国产| 欧美日日夜夜| 五月综合视频| 天天躁日日躁xxxxx| 欧美一级A一级a爱片久久| 99re95| av九九| 亚洲国产一级精品毛一级精品看免费视频| 性一级黄色录像片网站导航| 五十路熟女工口| 中文高清一区二区的| 日韩三级天堂在线观看| 人人干黄色| 日韩欧美~中文字| 人妻精品一区二区全免费| 99激情视频| 日韩熟女操逼| 91综合色噜噜| 精人妻一区二区三区| 国产成人天堂| 国产午夜视频| 白丝被操91| 一区二区三区四区姦女| www.zbzhongsen.com| 久久久久久久免费A片国产成a人亚洲精∨品无码 | 亚洲永久永久永久永久一级一级一级精品 | 人人看黄色视频| 97国产精选| 四虎在线观看网站| 欧美男人亚洲天堂| 熟妇高潮一区二区免费视频| 欧州色图区| 五月丁香综合激情| 久久综合日韩亚洲欧美| 亚洲色性情三级| 欧美久久婷| 97欧美精品综合| 啊啊啊啊二区好大| 内射卯月麻衣| 欧美人妻色| 91美女在线视频| 一本久久精品中文字| 亚洲丝袜天堂| 淫乱图区 | 中文字幕人妻丝袜| 欧美91精彩| 夜夜狠狠躁日日躁色视频| 色婷婷综合久久久久中文一区二区| 99re8免费高清在线| 丝袜喷水在线| 夜夜狠狠躁日日躁色视频| 97一区二区三区视频| 男人天堂无码| 日本高清视频xxxx| 无遮挡h肉动漫在线观看| 3028国产精品| 蜜臀在线免费观看在线免费观看| 欧美伦乱爱| 青草园大香蕉| 精品性爱无码在线播放| 国产亚洲精品第一最新| 亚洲天堂另类小说男人| 天天日天天屌天天操| 97少妇人妻中文字幕久久| 亚洲春色欧美| 国产精品无码久久久久2028| 大香蕉人妻| 9久精品| 性色高清在线| 国模91| 97 色综合| 两女互慰AV高潮喷水在线观看| 免费操逼91| 嫖老熟女A片一二三区| 91在线欧色| 在线观看A啊啊啊| 亚洲 欧美 第一页| 欧美午夜一区二区三区| 91成人国产综合久久精品蜜月| 午夜AV污污污| 日本不卡一二区| 日韩午夜精品一区二区三区电影| 青青久操| 国产又粗又大硬免费色网视频| 国产亚洲禁久一区二区| 欧美夜夜狠| 91欧美综合在线| 无码直播久久久| 桃色六月天| 五月天亚洲网| 国产午夜无码片在线观看影视| 色噜噜综合网| 亚州综合色图| 围产精品一区二区三区视频播放| 99黄页网站| 女欧美一区二三区| 人人污日韩一区二区| 清纯唯美亚洲综合| 九九色婷婷| 麻豆区久久久久亚| 欧美人妻久久精品二区三区| 熟女中出视频| 欧美一区二区三区另类精品| 2017大香蕉国产精品久久| 一级AV性爱| 嗯嗯嗯,草死我| 国产精品乱码久久| 曰韩欧美国产传媒麻豆第一区| 久久久精选| 中日高清无码操逼视频| 亚洲精品九九九| 色婷婷丁香五月| 久久久久国色αv免费观看| 影音先锋国产精品| 性色A∨91| 久久人人妻| 亚洲 无码 偷拍| 人妻日日夜夜精品| 日韩偷拍一区二区三区| 青青草九九九九九| 国产精品久久久久久照片| 久久九九99| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 一本久道久久综合狠狠爱一密臀精| 欧美午夜一区二区三区| 日日做夜狠狠爱欧美黑人| 美女91在线| 大胆91| 狠狠爱综合网| 校园春色家庭伦理欧美激情| 国产又色又爽又舒服的三级视频| 欧美性暴力猛交| 日日干夜夜干| 日韩人妻播放| 成年人黄色视频免费| 色墦五月丁香| 国模艳艳啪啪一区| 久久久久久久久久久久久久久久9| 亚洲综合一区二区| 91人人| 亚洲精品国产AV天美传媒| 日韩免费中文字幕视频| 亚洲丝袜二区在线| 国产乱人妻精品入口| 亚洲一本大道中文字幕无码在线| 探花精品 一区二区| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 嗯……啊…嗯嗯…啊…好舒服| 韩国一级做A片免费的| 国产嫩草精品A88AV| 丝袜无码a片| 日本一区视频在线观看| 五十路三区在线| 国产精品夜夜夜| 日韩精品9999| 精品人妻二区三区| 亚洲精品影视老司机| 亚洲AV免费在线观看| 亚洲欧美另类少妇精品| 久操视频免费在线观看| 高清在线偷拍自拍视频| 强奸乱伦大香蕉| 免费观看成人www精品视频| 亚洲欧美变态| 一本色道久久综合亚洲二区三区| 夜夜夜夜爽| 91天天c| 九九热免费视频| AAA久久| 秋霞成人做爱| 亚洲精品一区二区日本| 亚洲国产精品99久久久| 天堂俺去俺来也www久久婷婷| 在线观看亚洲成人精品| 凹凸 69堂 在线播放| 干妹子| 青青草原成人| 一区二区乱码福利| 久久久久久久97| 欧美姓爱综合网| 成人久久久| 秋霞网无码| 涩涩久久精品| 天美传媒av在线| 亚洲免费日韩在线一区二区| 午夜AV污污污| 亚洲第二页| 亚洲黄色网址| 91欧美情色| 色婷婷香蕉| 天天日天天爽| 伊人操操| 91热| 白丝AV| 国产日韩欧美中文在线播放| 婷婷干黄色| 嫖老熟女A片一二三区| 久久曰曰| 婷婷六月色| 后入人妻一区| 大茄子熟女AV导航| 久久国产熟女影院| 人妻啊啊人妻啊| 国产精品不卡一区二区三区| 97爱| 啊啊啊不要好疼视频| 97啪啪| 和协影院中文字幕三区| 亚洲中文字幕av | 大香蕉综合| 日日摸日日弄日日拍| 日韩免费簧片| 久久亚洲不卡| 亚洲双插| 午夜福利免费福利视频| 日本一天色道久久久精品视频| 偷拍99| 久久久久久亚洲Av无码| 中文字暮97| 大香蕉草草| 艹精品| 久草视频分类在线| 97碰碰日本乱偷人妻中文的| www.yeyecao| 欧美性生活综合| 中文字幕第23区| 日韩熟女操逼| 天堂精品小草| 永久免费观看的毛片的网站| 天天综合网~91综合网| av 模特一区了| 日本精品中文字幕视频| 草b在线| 亚洲综合97| 久7色| 蜜臀va69| 天天爽天天操| 欧美成人性活片| 情侣开房子拍 日韩无码 女的很漂亮| 91插B网站| 国产亚洲国产超碰| 精品人妻一区二区免费看| 新版天堂中文资源8在线| 国产亚洲日本| 黑人精品成人一区二区三区| 日日夜夜免费| 欧美永久激情一区二区| 欧美亚洲尤物久久| 久草电影网| 欧美自拍偷拍免费观看| 男人的天堂va在线| AV老汉| 日本一级特级毛片视频| 美女诱惑在线一区| 欧美黄色片AAAAA| 大地资源在线观看中文第二页 | 激情综合网激情综合| 9久久久久久| 亚洲欧美999| 久久国产精品,久久国产| 翔田千里无码一区| 一区二区三区成人 | 在线观看视频91| 日韩噜噜69| 老司机老司机午夜影院| 国产成人五月天丁香花| 99999精品视频| 色情五月丁香| 黄色人人| 九九九九精品精| 一区二区三区成人| 99热这里是精品| 精品久久无码午夜福利| 密臀国产在线| 欧美亚州色的图| 亚洲不卡AV在线| 久久首页| 亚洲九九九九| 亚洲天在线| 亚洲瓯美色图| 久色网| 亚洲欧美自拍偷拍| 91欧洲国产成人久久精品网站| 老女人老91妇女老热女| 91丝袜美女| 久久精品中文字幕观看| 久久久久久久强迫| 国产激情视频一区区三区| 大香蕉伊然在亚洲91| 强奸少妇AV导航网| 屌逼麻豆| 围产精品一区二区三区视频播放| 亚洲精品官网在线观看| 99色在线| 国产精品一区二区密臀| 亚洲高清欧美总合| 久久久97| 隔壁邻居波多野结衣中文字幕| 东北少妇高潮zzzz| 日本成a人v网站在线观看| 99色在线| 黄久在线| 伊人网在线点播| 日夜伊人网| 黄色视频高清无码网站| 日韩免费看在线黄色片| 18禁的网站在线| 国产色综合亚洲色综合吹潮| 在线观看色视频| 亚洲无码一区二区三区三州| 国产67194| 蜜桃视频精品一区二区| 丝袜无码a片| 欧美在线|亚洲| 操人妻视频| 亚洲欧美国产中文视频| 亚洲色图欧美视频| 日韩人妻少妇中文字幕| 99蜜桃臀久久久欧美精品网站| 欧美体内射精| 日逼97| 大香蕉一区二区在线观看.| 综合伊人激情| 亚洲国产无码精品首页久久久| 后入美女国产| 久久久久久中文版| 亚洲自拍青操视频| 69av一区二区三区| 婷婷伊人綜合中文字幕| 久久婷婷欧美| 精品人妻免费观看| 夜夜嗨av午夜成人| 性色av蜜臀av色欲aV| 99后入| 色噜噜国产在线| 婷婷情色综合网| 91人妻丝袜无码| 日韩精品一区二区三区色欲| 丁香五月成人| 午夜天堂网| 九九天堂| 久久久久久中文字幕中文字幕最新| 欧美|91色综合| 欧美 亚洲 大香| 狠狠爱AV| 欧美黄色大片在线观看| 丝袜熟女一区二区三区| 920日本午夜免费| 色综合中文字幕不卡| 亚洲自拍青操视频| 青草成人免费视频一com| 一区不卡在线观看av| 美女被艹尤物视频| 欧美少妇色综合| 成人无码欧美一级A片狼牙直播| 午夜操一视频一区| 欧美 日韩 亚洲 春色| 亚洲国产成人高清在线| 日日夜夜噜| 99久久久| 爱做久久久久久| 在线中文AV| 高清有码一区二区| 先锋精品av色鲁| 亚洲网污污污污| 中文字幕一区二区无码成人 | 91xingse| 久久久91福利姬| 国产亚洲色停停久久99精品91| 日本亚洲熟女视频| 久9综合在线| 日韩国产欧美伦理在线| 能看的AV| 熟妇熟女一区二区三区| 国产对白刺激视频| 97青青操视频| 日韩性爱小视频| 激情五月天色播| 91黑丝操| 影音先锋每日最新资源在线观看| 日本三级日本三级三级人妇四虎| 人人妻人人玩人人澡人人爽| 深夜激情无码| 男女性扦B| 欧美日韩操操操| 久久综合18p| 色97综合中文字幕| 日韩免费福利在线观看| 97色欧州| 逼逼逼逼操操操操操操操操操午夜剧场| 熟女啪啪视频| 亚洲成a人v欧美综合天堂下载| 激情综合婷婷| 91中文字幕在线观看| 黄色性爱网网| 九九热av| 色999人与兽| 日本淫乱女一区二区三区视频| 国产免费一区二区三区最新不卡| 天天伊人| 欧美三级免费伊人| 搡老女人老妇女AAA一VU麻豆| 插老姨肥穴| 樱花蜜乳av| 色婷婷蜜臀av| 黄色一区二区秘书性感| 亚洲欧美综合网 | 久久国产视频性吧| 蜜桃久久一区二区| 国产女上位好爽在线| 91人妻精华帖| 精品一二三区四视频| 国产女人操逼视频| 91精品国产综合久久久蜜臀酒店| 啊啊啊不要好爽日韩无码一区| 黄色激情电影在线观看| 伊人9| 久久久一热在线播放| 蜜乳中文字幕a在线| 国产精品天干天干综合网麻豆| 久久老子无码午夜伦不卡| 日韩中文9| 殴美,日韩国产伦精品| 国产亚洲精品美女久久久| 三四中文字幕| 91美女国产在线| 欧美美女自慰一区二区三区| 女人被男人桶爽视频网站| 成人久久久| 91久久国产综合精品| 91黑丝在线播放| 久草网站免费在线观看| 黄片视频观看| 草草草草视频| 97在线播放 | 九九综合九九综合| 99rre在线精品99re8| 人妻酒店出差被中出免费在线播放| 亚洲αv一区二区三区| 综合网91| 97就爱干| 97中文综合| 校园春色亚洲无码| 女优视频第10页| 国产亚洲精品美女久久久m| 亚州综合色| 少妇一区二区三区| 黄色片A级一区二区三区| 亚洲综合色在线| 欧美久久人妻少妇一区二区| 精久久久91| 久久久久久久 九九九九九九九| 91free福利| 久久无码成人| 国产日韩精品suv| 国产精品97视频| 午夜啊啊| 国产99999| 欧美亚洲清纯| 欧美日韩97在线| 精久久久| 91亚州| 国产主播福利| 国内偷自视频区视频综合| 成人a大片在线观看| 大香蕉www.超碰| 强奸乱伦AV网址| 一本色道久久天天射天天干| 亚洲无码国产精品久久| 淫荡熟女乱伦网| 免费看国产曰批40分钟怎么下载| 精品人妻一区二区视频| 国产精品欧美日韩久久| 国产一级αv免费看片| 色婷婷影院| 超碰午夜在线| 97se综合| 夜夜爽夜夜高潮夜夜爽| 97碰| www.大香| 久久五月视频| 久久天天躁日日躁狠狠躁| 清清草影| 色九久| 国产偷拍网站| 日韩无码专区| 无码外流操逼视频| 欧美性生活综合| 性色国产东北露脸精品视频| 男人天堂新在线| 国产一区二区三区精品观看啪| 成人无码专区精品视频| 3PAV乱伦视频| 成人夜夜爽| 黑人精品久久97| 1769国内精品视频| 欧美熟妇人体| 伊人久久综合影院精品久久久| 性色avv| 日本大香蕉综合网| 欧美少妇熟女| 色欲天天综合久久久无码网中文| 亚洲欧美九九| 91免费看一区二区三区| 丰满少妇人妻久久久久久| 日日干日日摸| 伊人成人中文字幕久久网| 欧美啪啪天堂| 国产精品一区二区三区在线密挑| 久久久久久久9| 日韩美女久久一区二区三区| 久久久久久亚洲Av无码精| 久久亚州高清| 精品人体无圣光凹凸| 少妇内射视频| 99综合视频一体| 69一区二区三区| www四虎| 家庭乱伦国产| 天美麻豆黄色录像| 国产三级日产三级韩国三级| 亚洲情色 自拍| 亚州精人品大香蕉| 天天操人人操狠狠插| 另类专区加勒比| 一块操欧美| 久久专区| 国产亚热在线久久| 很很干很很操| 中文字幕一区电影在线观看| 国产嫩草精品A88AV| 后X久久| 亚洲一级特黄大片在线播放91| 性欧美999| 欧美婷婷久久| 亚洲欧美精品91| 天天色,天天干,天天干| 操人妻视频| 久久宗合亚洲| 成年男人的天堂| 1禁看欧美黄片免费看| 96久久久久| 东北操逼| 久久精品—区二区三区内射| 91美女中出| 亚洲情色中文字幕一区| 色欲Av人妻精品一区二| 四虎av在线| 超碰免费欧美7| 亚州操操穴网| 国产成人免费观看在线视频| 久久透逼视频| 草草草视频在线免费看| 久久久精品网| 国产蜜臀精品一区二区尤物| 国产人妻精品一区二区三区秋霞| 97中文天堂| 99热最新| 中文字幕性感少妇av| 秋霞Av理论一级在线| 日日夜夜骑| 97操97干| 51一区二区三区| 死我十八禁| 国产精品不卡一区二区三区| 诱惑人妻欧美一区在线播放| 欧美专利1区2区3区4区5区免费| 五月丁香在线| 欧美A√综合网| 熟女精品一区二区三区| 欧美天天射| 99国产精品久久久在线播放| 熟女精品一区二区在线观看| 国产精品不卡一区二区三区| 亚洲AV无码天美传媒一区| 家庭乱伦网站国产| 天天日天天插| 伊人网免费视频| 天堂九九九九九九九九九| 男女啪啪网站免费视频| 91色综合色| 欧美天天在线| 蜜桃网熟妇| 精品无码少妇| 色悠久| 黄骗免费网站| 天天日天天舔东京热| 又粗又长又爽在线观看| 久欲AV| 性爱综合网| 热99这里有精品综合久久 | 亚洲国产麻豆一区二区三区| 国产熟女| 天堂中文资源在线bt| 日本黄色天堂| 志村玲子视频一区二区| 日韩免费福利在线观看| 天天操天天7| 九九热免费视频| 天天谢天天干| 大香蕉宅男伊人| 欧美性爱伊人| 色牛aV| 偷拍色图| 国产原创精品| 国产精品久久久无码AV网站| 大香蕉99999| 国产精品suv一区| 97人人干| 亚洲国产奇米影视久久| 九九九九亚洲| 金典av| 日本99久久| 日本久久女同性恋视频| 99re在线视频国产| 99热综合在线| 久久久国产亚洲精品系列| 9丨久久九九九| 亚洲精品不卡一二三区| 欧美性巨大╳╳╳╳╳高跟鞋| 欧美色图亚洲色| av东京热男人的天堂| 国产av尤物| 色yeye成人免费视频| 一级毛片电影免费看| 97综合久第一页| 九九热五区| 色吧综合网| 日本操大逼| 一区二区乱码福利| 亚洲图片视频小说| 欧美国产一区二区三区麻豆传媒| 蜜桃臀av在线观看| 色区97| 男人的天堂2019AV| 无色无码| 久久久精品91八戒| 亚洲熟妇A V黑人| 国产精品久久久久久久久久久久久久久久 | 嗯嗯啊在线视频| 综合网少妇| 你操综合| 色欲天天综合网| 97精品熟女少妇一区| 蜜臀久久99精品久久久久久成人小说 | 久久久精品网| 亚洲免费人妻在| 91n.欧美| 久热九九| 春色91| 骚逼高潮久久精品| 91丝袜在线观看| 亚洲熟女国产综合另类| 涩综合导航| 欧美在线视频99| 九九九九久久久| 国内操逼视频二区| 日韩激情中文字幕有码| 国产成人亚洲精品无码最新在线| 亚洲蜜臀懂色| 蜜乳av一区二区三区| 国产内射爽爽大片| 麻豆福利视频导航| 女人被男人桶爽视频网站| 天天天操天天天爱| 狠狠色色| 麻豆成人影音在线| 午夜天堂网| 97人人干| 亚洲美腿丝袜香蕉影视欧美成人| 麻豆久久久久久久久丝袜| 春色校园综合网| WWW啪啪的com| 欧美视频激情久久久久久| 免费看黄视频亚洲网站| 一本色道综合久久欧美日韩精品| 亚洲日韩熟女人妻高清在线| 亚洲A曰本VA欧美VA视频| 一区二区三区四区免费视频| www国产精品| 超碰碰97| 26uuu欧美| 精品女同一区| 小视频玖玖| 97超碰欧美中文字幕| 性欧美| 偷窥自拍亚洲色图| 欧美激情亚洲色图| 日韩人妻资源在线看| 五月天婷婷基地| 无套内射性感少妇视频| 丰满人妻一区二区三区四区| 校园春色五月天| 人妻熟女一区二区| 天天色悠悠激情| 天天日天天干天天整| 日韩欧美性爱电影在线观看| 久久露脸国产老熟女| 亚洲国产日韩欧美熟妇在线| 欧美亚洲韩国视频十五区| 亚洲色吧网| www鬼畜国产男人的天堂| 国产11页| 久久手机视直播| 欧美老妇女内射网址| 国产丝袜美女诱惑| 亚洲va综合va国产va中文| 中日韩久久久| 青青草无码视频| 99热思思| 天天操天天射青青草| 九九九九九九亚洲| 嗯嗯啊啊视频一区二区三区| 中文一区在线日| 丰满少妇精品一区二区| 久久97视频| 精品国产一区二区三区香蕉欧美| 亚洲无码国产探花在线观看| 超碰97网站| 熟妇人妻丰满久久久久久久无码| 日本五十路在线| 日逼五月天| 啊啊啊啊啊操我视频| 加勒比综合在线| 97久久精品国产| 男人天堂一区二区| 国模限制级电影| 人妻干天天| 伊人性在线视频| 啊啊啊啊啊舒服| 日本国产高清色www视频在线| 亚洲人妻在线精品| jazzjazz国产精品麻豆| 国产精品久久久久久久黄无码| 久久99精品视频| 国产热RE99久久6国产精品首 | 先锋精品av色鲁| 亚洲男人bt天堂| 五月综合婷婷久久网站| 亚洲AV操| 小草三级久久观看| 久草精品国产蜜臀 | 草草影院在线视频| 欧美影院一区二区三区| 少妇啪啪自拍| 在线观看AV不卡| 91黑丝美女| 免费在线看黄片av| 亚洲 欧美 手机在线观看| 艹我哪美一区无码| 性色一线| 97看操| 亚洲天堂资源网| 中文字幕精品一区二| 殴美大黄片| 欧美成人免费在线观看| 色欲av国内精品久久久久久| 国产免费一区2区3区| 国产精品一级片在线看| 色九月婷婷| 97精品视频在线播放| 成人av性爱电影在线观看| 欧美强奸乱能| 91 丝袜在线| 久久久久久久9| 青青久日| 亚洲欧美色图| 国内毛片欧美香蕉精品| 影音先锋日本一区二区| 成人怡红院| 欧美亚洲宗合色性图| 久热色情精品| 性爱欧美五月| 欧美在线啊啊| 男人a天堂手机在线版| 污啪啪啪视频| 国产免费小视频| 欧美自拍偷拍综合图片| 国产一级不卡在线观看| 网站A V在线| 丁香五月性| Aa东京男人的天堂| 福利天堂| 日韩在线电影| 3p国产欧美99热| 狠狠躁天天躁日日躁| 中文字幕精品码亚洲| 日本在线播放不卡一区| 少妇与黑人高潮在线| 尤物一级在线免费观看| 久久精品国产亚洲AV无码做| 熟妇视频一区二区三区在线观看| 亚洲高清男人天堂| 欧美日韩精品青青| 91综合色噜噜| 一区二区三区机械有限公司| 成人精品一区二区三区| 精品人妻免费观看| 91n欧美| 亚洲欧洲久久天堂| 日韩AV电影网站| 久久九操在线观看| 精品无码不卡视频| 大香蕉男人的天堂| 天天爽夜夜爽夜夜爽精| 日韩一级二级三级免费看完整版国语版 | av在线播放国产一区| 人妻啊啊人妻啊| 欧美同性恋 的搜索结果 - 91n| 色色香蕉| 亚洲综合校园春色| 伦伦成年午夜免费视频| 天操老女人| 无码人妻一区二区三区色欲aⅴ| 好吊色在线观看| 国产内射爽爽大片| 美女啪欧美一区| 操逼逼一区视频| 欧美78| 五月丁香综合激情| 精品制服美女中文一区二区三区| 天天干天天狼在线视频| 丝袜美腿欧美| 天美传媒精品一区二区| 97中文天堂| 久久国产精品视频| 无码少妇精品一区二区60岁老人| 97网站在线观看 | 亚洲情色1区| 日韩性爱一级片| 久久久激情| 亚洲天堂男| 中文字幕黑人大片| 亚洲图片欧美色图| 夜夜肏2021| 欧美乱伦专区| 美国久久一二三四| 久久一区无码| 欧美18老人禁| 日韩操啪| 九九热精彩视频| 天天插天天射| 亚州综合网| 久久成人午夜狠狠| 大香蕉伊人网WWWn0n| 人妻乱仑一区二区三区| 日韩性爱小视频在线观看| 中日992视频| 6080yy午夜理论三级一区二区三区无码| 天天插网| 97欧美日韩中文| 亚洲一区二区三区欧美日韩| 992大香蕉| 九九英色视频| 综合自拍| 国产久久久久久| 精品乱子一区二区三区99| 国产精品免费美女视频| 久草午夜| 亚洲欧美97| 人妻熟女一区二区| 婷婷成人五月天| 无码一区二区精品视频久久久春药 | 91人妻做a观看视频| 校园春色美腿丝袜| www.狠狠干.coom| 国产一区二区视频在线播放| 婷婷午夜成人色中色| 另类图片天天影视| 久久久禁| 狠狠综合| 成年人网站在线免费观看| 欧色综合| 99激情视频| 99热伊人| 欧美网站免费| 天天看,天天做| 插日本熟女视频| 九九干| 丁香六月激情| 亚洲成熟国产精品美女| 8x福利精品第一福利视频导航| 国产福利电影| 亚洲天堂7777| 精品无码一区二区三区| 野狼福利社区| 国产精品久久久视频| 无码在线亚洲| 夜夜骑夜夜操| 日日AAvv| 密臀视频一区二区三区| 丁香五月激情综合国产| 综合久久欧美| 伊人五月天| 偷拍 精品 另类 四区| 97人肏| 裸体1区| 婷婷精品国产一区二区三区日韩| 亚洲另类久操网| 在线看片国产精品每日更新| 青娱乐手机日韩在线视频| 黑人性欧美| 大乔未久88一区| 国产乱婷婷精品二区三区| 日本在线不卡v二区| 中字幕人妻一区二区三区| 屁股久久久久久久久| 色一射色一射| www.天天干| 国产人妖视频一区在线观看| 亚洲最新Av| 久久人妻熟女一区二区| 久久精品99| 亚洲不卡不卡中文字幕不卡| 91粉嫩萝控精品福利网站_精品影音先锋国 | 91日韩在线| JIZZJIZZ国产精品喷水| 久久久久久电影| 国产一级高清免费观看| 亚洲精品黄码久久久久| 黑人干亚洲| 国产精品天干天干综合网麻豆| 91AV老熟女视频| 亚洲国产尤物yw在线观看| 亚洲āv网址在线观看| 蜜臀99久| 日日躁夜夜躁狠狠躁超爽| 综合熟妇一区二区三区| 久久久免费懂色| 国产精品欧美激在线| 亚洲欧美色综合| 好爽,再快点啊哈嗯嗯嗯嗯| 亚洲aV无码成人在线观看| 不卡av在线中文字幕| 欧美一区二区三区互相| 色网站导航大全| 精品人妻免费观看| 青草成人免费视频一com| 天天日日本| 久久精品操| 色噜噜精品一区二区三| 少妇极品熟妇人妻无码| 亚洲天堂男人的天堂| 伊人黄色视频免费观看| 加勒比av中文| 国产无码高清操逼视频| 97精品国产97久久久久久免费| 色色色日本| 亚洲瓯美色图| 天天操天天射青青草| 亚洲av强奸乱伦| 91精品久久久久五月天精品| 91搞逼视频| 2017人人操,人人摸| 国产精品点击进入在线影院| 一起草在线视频| 久久男人天堂| 亚洲国产成人精品久久久国产成人一区二区| 亚洲成a人v欧美综合天堂下载| 超碰4A| 日韩精品一区二区人人人| 老鸭窝成人免费毛片视频| 男人的天堂va| 97超碰日韩| 上特色A在线| 综合伊人网12色| 国产精品视频自拍在线| 桃花色综合影院| 370p日韩欧美亚洲精品| 亚洲熟女性高潮久久久| 久久久久久精品免费看A级| aⅴ日韩成人电影av在线免费看av大全 | 大香蕉免费3| 尤物黄色在线观看网站| 国产中文精品一区二区在线观看| 亚洲啪啪视频一区二区| 亚洲操人| 久久精品一区二区三区不卡| 亚洲情色五月天 | 久久久久久十| 大香蕉一级黄色片久久| 久久天天艹| 国产操逼逼网| 强奸a片网| 超碰超碰欧美| 亚洲Av噜噜一区二区三区妖精| 91痴汉| 欧洲精品区| 91精品操美女| 国产91 丝袜在线播放00-百度| 日本一级真人黄色性爱视频| 国产一区二区在线播放量| 日美免费黄片| 色婷视频| 精品无码久久久| 人妻熟妇久草在线| 亚洲第一男人天堂| 日韩一级二级三级免费看完整版| 国产精品久久久吖| www.99中文字幕| 99热婷婷| 超碰1024久久| 夜夜嗨免费视频| 91综合色| 秋霞蝌科网日本一区| 综合色图区| 亚洲s在线观看| 大屁股熟女一区二区三区| 欧美性夜| 巨爆乳一区二区爆乳区| 自拍偷拍2025在线观看| 96精品在线| 日韩精品人妻中文字有码在线| 日韩精品 欧美激情| 97国产超碰| 精品中文字幕一区二区| 婷婷五月天成人| 啊啊啊啊啊操我视频| 欧美日本视频一区| 97精品久久| 天天操天天干一区二区| 天天摸,夜夜摸| 久久久久斤小| 久热热| 韩国黄片aaaa| 2001天天操| 九一国产精品| 欧美亚洲首页| 国产免费操逼| www久久99| 欧美色图下一页| 色欧美综合| 日本精品中文字幕视频| 日本午夜久久电影| 欧美一区二区成人一卡| 亚洲欧美不卡线| 日韩美女操b| 亚洲色欲一区二区三区| 国产9熟妇视频网站| 热无码中文亚洲H一道本一区二区| 免费一级视频特黄色大片| 亚洲男人的天堂AV| 96国产精品| 乱伦1色页| 亚洲欧洲美腿丝袜| 夜夜操中文字幕| 秋霞怕怕片| 人人操人人狠狠操| 不卡九肏| 91殴美| 天天做日日做天天欢。| 欧亚第一综合网| 高清视频一区| 免费一级毛片在线视频观看| 欧美日韩大陆黑人少妇99| 亚洲色人阁| 东北丰满熟女国产一区| 婷婷六月色| 超碰碰小说97| 7777奇米影视久久| 中亚精品极乱| 嗯嗯啊啊啊啊轻点视频| 欧美视频一区二区三区| 精品黄色电影| av爱爱爱| 亚洲成?V人片在线观看福利| 日韩内射视频| 1769国内精品视频| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 97超级色碰碰| 免费的黄片wwwwww| 97久久超碰亚洲| 免费一级特黄特色大片在线观看看| 亚洲宅男天堂| 校园春色欧美色图| 无码人妻丰满熟妇区毛片| 97视频网站| 人人性爱视频免费| 久久久精品成人国产| 国产有码一区| 欧美色图电影| 欧亚综合一卡二卡中文字幕| 中文字幕二区| 日本狂喷奶水在线播放212| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 91欧美情色| 91P0RNY大屁股人妻| 久久国产99精品72福利| 国产熟女自拍| 大香蕉丝袜一级片| 91精品在线播放| 国产精品一二三在线看| 中文字幕免费观看| av在线播放国产一区| 91肏屄网| 国产97在线视频| 嗯嗯啊啊视频在线看| 国产 大胆 对白| 尹人免费观看视频在线| 国产精品麻豆成人AV艾秋| 人妻精品一区二区三区| 成人八戒网站| 久久伦理视频久久大香蕉视频| 在线播放成人高清免费视频| 日韩伦理视频| 伊人影院日本| 伊人青青草久久| 欧美视频中文字幕区| 性色aV一区二区三区噜噜| 免费视频在线观看啊啊啊啊啊| 中文字幕一区二区三区50路| 亚洲精品亚洲人成在线麻豆| 人妻丰满熟妇av无码区蜜桃| 五月天综合在线| 成人性交午夜免费片| 碰碰在线视频| 粉嫩av平台| 天天综合,91入口| 涩爱AV在线| 99re99| 国产av白丝| 黄色无码高清黄色无码网站| 久久精品亚洲东京热色播| 一起草三级AV电影在线观看| 啊好爽受不了无码| 国产精品久久久久久久电影渣男| 吉川爱美亚洲二区在线| 日本性爱少妇| 欧美综合中文| 久久免费中文字幕在线观看| 成人无码在线视频网站| 久久久一区二区| 女人高潮抽搐喷水视频网站|