다트에서 파일 입출력(I/O)은 어떻게 하나요?
_____A1: 다트에서 파일을 읽으려면 `dart:io` 패키지의 `File` 클래스를 사용합니다. 예를 들어, 파일 내용을 문자열로 읽으려면 아래와 같이 작성합니다.
```dart
import 'dart:io';
void main() async {
final file = File('example.txt');
try {
String contents = await file.readAsString();
print(contents);
} catch (e) {
print('파일 읽기 실패: $e');
}
}
```
`readAsString()`은 비동기 메서드이므로 `await`과 함께 사용해야 하며, `main()` 함수에 `async` 키워드를 붙입니다.
---
Q2: 다트에서 파일에 쓰려면 어떻게 하나요?
A2: 파일에 텍스트를 쓰려면 `File` 클래스의 `writeAsString` 메서드를 사용합니다. 예시는 다음과 같습니다.
```dart
import 'dart:io';
void main() async {
final file = File('output.txt');
try {
await file.writeAsString('안녕하세요, 다트 파일 쓰기 예제입니다!');
print('파일에 텍스트를 성공적으로 작성했습니다.');
} catch (e) {
print('파일 쓰기 실패: $e');
}
}
```
기본적으로 `writeAsString`은 기존 내용을 덮어씁니다. 추가 모드로 쓰려면 `mode: FileMode.append` 옵션을 줄 수 있습니다.
---
Q3: 파일을 바이트 단위로 읽고 쓸 수도 있나요?
A3: 네, `File` 클래스의 `readAsBytes()` 와 `writeAsBytes()` 메서드를 사용해서 바이트 데이터로 파일을 읽고 쓸 수 있습니다.
읽기 예:
```dart
Uint8List bytes = await file.readAsBytes();
```
```dart
await file.writeAsBytes([0x48, 0x65, 0x6C, 0x6C, 0x6F]); // "Hello"
```
---
Q4: 파일이 존재하는지 확인하는 방법은?
A4: `File` 객체의 `exists()` 메서드를 사용해서 해당 경로에 파일이 존재하는지 확인할 수 있습니다.
```dart
bool exists = await File('somefile.txt').exists();
print(exists ? '파일 존재' : '파일 없음');
```
---
Q5: 파일 삭제는 어떻게 하나요?
A5: `File` 클래스의 `delete()` 메서드를 사용하여 파일을 삭제할 수 있습니다.
```dart
await File('somefile.txt').delete();
print('파일이 삭제되었습니다.');
```
---
Q6: 파일 경로를 다루는 추천 방식은?
A6: 경로를 직접 문자열로 작성할 수 있으나, 플랫폼 의존성을 줄이려면 `dart:io` 패키지의 `path` 패키지를 사용하는 것을 권장합니다.
```dart
import 'package:path/path.dart' as p;
String path = p.join('folder', 'file.txt');
```
이를 통해 윈도우와 리눅스/맥의 파일 구분자 차이를 걱정하지 않고 경로를 생성할 수 있습니다.
---
요약:
- `dart:io` 패키지의 `File` 클래스를 사용하여 파일 입출력 가능
- `readAsString()`, `readAsBytes()`로 파일 읽기
- `writeAsString()`, `writeAsBytes()`로 파일 쓰기
- `exists()`로 존재 여부 확인
- `delete()`로 파일 삭제
- `path` 패키지로 플랫폼 독립적 경로 생성
파일 I/O는 네이티브 환경에서만 지원되므로, Flutter 웹 같은 환경에서는 다른 방식을 사용해야 합니다.
이 라이브러리는 파일 시스템과 상호작용할 수 있는 다양한 기능을 제공합니다.
파일을 읽고 쓰는 기본적인 방법을 살펴보겠습니다.
1. `dart:io` 라이브러리 임포트 파일 입출력을 위해서는 먼저 `dart:io` 라이브러리를 임포트해야 합니다.
다음과 같이 코드를 시작할 수 있습니다: ```dart import 'dart:io'; ```
2. 파일 쓰기 파일에 데이터를 쓰기 위해서는 `File` 클래스를 사용합니다.
`File` 클래스의 인스턴스를 생성하고, `writeAsString` 또는 `writeAsBytes` 메서드를 사용하여 데이터를 파일에 쓸 수 있습니다.
예제: 문자열을 파일에 쓰기 ```dart void main() async { // 파일 경로 설정 final file = File('example.txt'); // 파일에 문자열 쓰기 await file.writeAsString('Hello, Dart!'); print('파일에 데이터가 성공적으로 작성되었습니다.
'); } ``` 위의 예제에서는 `example.txt`라는 파일에 "Hello, Dart!"라는 문자열을 작성합니다.
`writeAsString` 메서드는 비동기적으로 작동하므로 `await` 키워드를 사용하여 완료될 때까지 기다립니다.
3. 파일 읽기 파일에서 데이터를 읽기 위해서는 `readAsString` 또는 `readAsBytes` 메서드를 사용할 수 있습니다.
이 메서드들은 파일의 내용을 읽어 문자열 또는 바이트 배열로 반환합니다.
예제: 파일에서 문자열 읽기 ```dart void main() async { // 파일 경로 설정 final file = File('example.txt'); // 파일에서 문자열 읽기 String contents = await file.readAsString(); print('파일 내용: $contents'); } ``` 위의 예제에서는 `example.txt` 파일에서 내용을 읽어와서 출력합니다.
4. 파일 존재 여부 확인 파일이 존재하는지 확인하려면 `exists` 메서드를 사용할 수 있습니다.
이 메서드는 파일이 존재하면 `true`, 그렇지 않으면 `false`를 반환합니다.
예제: 파일 존재 여부 확인 ```dart void main() async { final file = File('example.txt'); if (await file.exists()) { print('파일이 존재합니다.
'); } else { print('파일이 존재하지 않습니다.
'); } } ```
5. 파일 삭제 파일을 삭제하려면 `delete` 메서드를 사용할 수 있습니다.
이 메서드는 파일을 비동기적으로 삭제합니다.
예제: 파일 삭제 ```dart void main() async { final file = File('example.txt'); // 파일 삭제 await file.delete(); print('파일이 삭제되었습니다.
'); } ```
6. 디렉토리 작업 파일뿐만 아니라 디렉토리 작업도 가능합니다.
`Directory` 클래스를 사용하여 디렉토리를 생성, 삭제, 목록 조회 등을 수행할 수 있습니다.
예제: 디렉토리 생성 ```dart void main() async { final directory = Directory('example_dir'); // 디렉토리 생성 if (!(await directory.exists())) { await directory.create(); print('디렉토리가 생성되었습니다.
'); } else { print('디렉토리가 이미 존재합니다.
'); } } ```
7. 예외 처리 파일 입출력 작업은 다양한 이유로 실패할 수 있으므로, 예외 처리를 통해 오류를 관리하는 것이 중요합니다.
`try-catch` 블록을 사용하여 예외를 처리할 수 있습니다.
예제: 예외 처리 ```dart void main() async { final file = File('non_existent_file.txt'); try { String contents = await file.readAsString(); print('파일 내용: $contents'); } catch (e) { print('오류 발생: $e'); } } ``` 결론 Dart에서 파일 입출력은 `dart:io` 라이브러리를 통해 간단하게 수행할 수 있습니다.
파일을 읽고 쓰는 기본적인 방법을 익히면, 다양한 파일 관련 작업을 수행할 수 있습니다.
비동기 프로그래밍을 활용하여 효율적으로 파일 작업을 처리할 수 있으며, 예외 처리를 통해 안정성을 높일 수 있습니다.
작성자:
김현수 [비회원]
| 작성일자: 1년 전
2024-09-19 01:52:39
조회수: 182 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 182 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.