dart:io
dart:io 函式庫提供處理檔案、目錄、程序、Socket、WebSocket 以及 HTTP 用戶端和伺服器的 API。
一般而言,dart:io 函式庫實作並推廣非同步 API。同步方法可能會輕易地封鎖應用程式,使其難以擴展。因此,大多數操作會透過 Future 或 Stream 物件傳回結果,這是一種在現代伺服器平台(例如 Node.js)中常見的模式。
dart:io 函式庫中少數的同步方法會在方法名稱上清楚地標示 Sync 字尾。這裡不涵蓋同步方法。
若要使用 dart:io 函式庫,您必須匯入它
import 'dart:io';
檔案和目錄
#I/O 函式庫可讓命令列應用程式讀取和寫入檔案以及瀏覽目錄。您有兩種選擇可讀取檔案的內容:一次全部讀取或串流讀取。一次讀取整個檔案需要足夠的記憶體來儲存檔案的所有內容。如果檔案非常大,或者您想在讀取時處理它,您應該使用串流,如串流檔案內容中所述。
將檔案讀取為文字
#當讀取使用 UTF-8 編碼的文字檔時,您可以使用 readAsString()
讀取整個檔案內容。當單獨的行很重要時,您可以使用 readAsLines()
。在這兩種情況下,都會傳回一個 Future 物件,該物件會以一個或多個字串的形式提供檔案的內容。
void main() async {
var config = File('config.txt');
// Put the whole file in a single string.
var stringContents = await config.readAsString();
print('The file is ${stringContents.length} characters long.');
// Put each line of the file into its own string.
var lines = await config.readAsLines();
print('The file is ${lines.length} lines long.');
}
將檔案讀取為二進位
#以下程式碼會將整個檔案以位元組形式讀取到整數清單中。對 readAsBytes()
的呼叫會傳回一個 Future,當結果可用時,它會提供結果。
void main() async {
var config = File('config.txt');
var contents = await config.readAsBytes();
print('The file is ${contents.length} bytes long.');
}
處理錯誤
#為了捕獲錯誤,以免導致未捕獲的例外,您可以在 Future 上註冊 catchError
處理常式,或者(在 async
函式中)使用 try-catch
void main() async {
var config = File('config.txt');
try {
var contents = await config.readAsString();
print(contents);
} catch (e) {
print(e);
}
}
串流檔案內容
#使用串流一次讀取檔案的一小部分。您可以使用 Stream API 或 await for
,這是 Dart 的非同步支援的一部分。
import 'dart:io';
import 'dart:convert';
void main() async {
var config = File('config.txt');
Stream<List<int>> inputStream = config.openRead();
var lines = utf8.decoder.bind(inputStream).transform(const LineSplitter());
try {
await for (final line in lines) {
print('Got ${line.length} characters from stream');
}
print('file is now closed');
} catch (e) {
print(e);
}
}
寫入檔案內容
#您可以使用 IOSink 將資料寫入檔案。使用 File openWrite()
方法來取得您可以寫入的 IOSink。預設模式 FileMode.write
會完全覆寫檔案中現有的資料。
var logFile = File('log.txt');
var sink = logFile.openWrite();
sink.write('FILE ACCESSED ${DateTime.now()}\n');
await sink.flush();
await sink.close();
若要新增至檔案末尾,請使用選用的 mode
參數指定 FileMode.append
var sink = logFile.openWrite(mode: FileMode.append);
若要寫入二進位資料,請使用 add(List<int> data)
。
列出目錄中的檔案
#尋找目錄的所有檔案和子目錄是非同步操作。當遇到檔案或目錄時,list()
方法會傳回一個發出物件的串流。
void main() async {
var dir = Directory('tmp');
try {
var dirList = dir.list();
await for (final FileSystemEntity f in dirList) {
if (f is File) {
print('Found file ${f.path}');
} else if (f is Directory) {
print('Found dir ${f.path}');
}
}
} catch (e) {
print(e.toString());
}
}
其他常見功能
#File 和 Directory 類別包含其他功能,包括但不限於
- 建立檔案或目錄:File 和 Directory 中的
create()
- 刪除檔案或目錄:File 和 Directory 中的
delete()
- 取得檔案的長度:File 中的
length()
- 取得檔案的隨機存取權限:File 中的
open()
如需完整的方法清單,請參閱 File 和 Directory 的 API 文件。
HTTP 用戶端和伺服器
#dart:io 函式庫提供命令列應用程式可用於存取 HTTP 資源以及執行 HTTP 伺服器的類別。
HTTP 伺服器
#HttpServer 類別提供用於建置 Web 伺服器的低階功能。您可以比對要求處理常式、設定標頭、串流資料等等。
以下範例 Web 伺服器會傳回簡單的文字資訊。此伺服器會在連接埠 8888 和位址 127.0.0.1 (localhost) 上接聽,並回應路徑 /dart
的要求。對於任何其他路徑,回應的狀態碼為 404(找不到頁面)。
void main() async {
final requests = await HttpServer.bind('localhost', 8888);
await for (final request in requests) {
processRequest(request);
}
}
void processRequest(HttpRequest request) {
print('Got request for ${request.uri.path}');
final response = request.response;
if (request.uri.path == '/dart') {
response
..headers.contentType = ContentType(
'text',
'plain',
)
..write('Hello from the server');
} else {
response.statusCode = HttpStatus.notFound;
}
response.close();
}
HTTP 用戶端
#您應避免直接使用 dart:io
來發出 HTTP 要求。dart:io
中的 HttpClient 類別與平台相關,並與單一實作繫結。請改用較高階的函式庫,例如 package:http
。
從網際網路擷取資料教學說明如何使用 package:http
發出 HTTP 要求。
更多資訊
#此頁面說明如何使用 dart:io 函式庫的主要功能。除了本節討論的 API 之外,dart:io 函式庫還提供程序、 Socket 和 WebSocket 的 API。如需伺服器端和命令列應用程式開發的更多資訊,請參閱伺服器端 Dart 概觀。
除非另有說明,否則本網站的文件反映的是 Dart 3.6.0。頁面上次更新時間為 2024-11-17。 檢視原始碼 或 回報問題。