unisbadri.com » Python Java Golang Typescript Kotlin Ruby Rust Dart PHP
I/O

I/O #

Penanganan Input/Output (I/O) dalam bahasa Dart mencakup operasi untuk membaca data dari berbagai sumber (seperti file, keyboard, jaringan, dll.) dan menulis data ke berbagai tujuan (seperti file, layar, jaringan, dll.). Dart menyediakan pustaka dart:io yang digunakan untuk penanganan I/O sinkron dan asinkron pada aplikasi server atau command-line. Untuk aplikasi web, I/O biasanya ditangani melalui pustaka lain atau API web.

Berikut ini adalah penjelasan lengkap mengenai penanganan I/O dalam bahasa Dart.

Mengenal Pustaka dart:io #

Pustaka dart:io adalah pustaka bawaan dalam Dart yang menyediakan berbagai kelas dan fungsi untuk bekerja dengan file, direktori, proses, soket, dan operasi I/O lainnya. Pustaka ini tidak tersedia untuk aplikasi yang dijalankan di browser (karena browser memiliki model I/O yang berbeda), tetapi sangat berguna dalam pengembangan aplikasi server dan CLI.

Mengimpor Pustaka dart:io:

import 'dart:io';

Membaca dan Menulis File #

Operasi yang paling umum dalam penanganan I/O adalah membaca dari dan menulis ke file. Dart menyediakan cara yang mudah dan efisien untuk melakukan operasi ini, baik secara sinkron maupun asinkron.

Membaca File #

  • Membaca File Secara Sinkron: Untuk membaca file secara sinkron, Anda bisa menggunakan metode readAsStringSync() atau readAsBytesSync() dari kelas File.

    Contoh:

    import 'dart:io';
    
    void main() {
      var file = File('data.txt');
      try {
        String contents = file.readAsStringSync();
        print(contents);
      } catch (e) {
        print('Terjadi kesalahan: $e');
      }
    }
    
  • Membaca File Secara Asinkron: Membaca file secara asinkron menggunakan metode readAsString() atau readAsBytes() yang mengembalikan Future.

    Contoh:

    import 'dart:io';
    
    void main() async {
      var file = File('data.txt');
      try {
        String contents = await file.readAsString();
        print(contents);
      } catch (e) {
        print('Terjadi kesalahan: $e');
      }
    }
    
  • Menulis File Secara Sinkron: Anda dapat menulis ke file secara sinkron menggunakan metode writeAsStringSync() atau writeAsBytesSync().

    Contoh:

    import 'dart:io';
    
    void main() {
      var file = File('data.txt');
      try {
        file.writeAsStringSync('Ini adalah teks yang disimpan.');
        print('Berhasil menulis ke file.');
      } catch (e) {
        print('Terjadi kesalahan: $e');
      }
    }
    
  • Menulis File Secara Asinkron: Untuk menulis ke file secara asinkron, gunakan metode writeAsString() atau writeAsBytes().

    Contoh:

    import 'dart:io';
    
    void main() async {
      var file = File('data.txt');
      try {
        await file.writeAsString('Ini adalah teks yang disimpan.');
        print('Berhasil menulis ke file.');
      } catch (e) {
        print('Terjadi kesalahan: $e');
      }
    }
    

Operasi pada Direktori #

Selain file, Anda juga dapat melakukan operasi pada direktori menggunakan kelas Directory. Anda bisa membuat, menghapus, dan menjelajahi direktori secara sinkron atau asinkron.

Membuat Direktori #

  • Membuat Direktori Secara Sinkron: Anda bisa membuat direktori menggunakan metode createSync().

    Contoh:

    import 'dart:io';
    
    void main() {
      var dir = Directory('contoh');
      if (!dir.existsSync()) {
        dir.createSync();
        print('Direktori dibuat.');
      }
    }
    
  • Membuat Direktori Secara Asinkron: Untuk membuat direktori secara asinkron, gunakan metode create().

    Contoh:

    import 'dart:io';
    
    void main() async {
      var dir = Directory('contoh');
      if (!await dir.exists()) {
        await dir.create();
        print('Direktori dibuat.');
      }
    }
    

Menjelajahi Direktori #

Anda bisa menjelajahi isi direktori menggunakan metode listSync() secara sinkron atau list() secara asinkron.

  • Menjelajahi Direktori Secara Sinkron: Contoh:

    import 'dart:io';
    
    void main() {
      var dir = Directory.current;
      var files = dir.listSync();
      for (var file in files) {
        print(file.path);
      }
    }
    
  • Menjelajahi Direktori Secara Asinkron: Contoh:

    import 'dart:io';
    
    void main() async {
      var dir = Directory.current;
      await for (var file in dir.list()) {
        print(file.path);
      }
    }
    

Menghapus Direktori #

Anda bisa menghapus direktori menggunakan metode deleteSync() untuk sinkron atau delete() untuk asinkron.

Contoh:

import 'dart:io';

void main() {
  var dir = Directory('contoh');
  if (dir.existsSync()) {
    dir.deleteSync(recursive: true);
    print('Direktori dihapus.');
  }
}

Penanganan I/O dengan Socket #

Dart mendukung penanganan jaringan menggunakan soket, baik TCP maupun UDP. Ini memungkinkan Anda untuk membangun aplikasi yang bisa berkomunikasi melalui jaringan.

Membuat Server Socket #

  • Membuat TCP Server: Anda bisa membuat server TCP menggunakan ServerSocket.bind().

    Contoh:

    import 'dart:io';
    
    void main() async {
      var server = await ServerSocket.bind(InternetAddress.anyIPv4, 4040);
      print('Server dimulai di ${server.address.address}:${server.port}');
    
      await for (var socket in server) {
        socket.write('Hello dari server!');
        await socket.close();
      }
    }
    

Membuat Client Socket #

  • Membuat TCP Client: Untuk terhubung ke server TCP, gunakan Socket.connect().

    Contoh:

    import 'dart:io';
    
    void main() async {
      var socket = await Socket.connect('localhost', 4040);
      print('Terhubung ke server');
    
      socket.listen((data) {
        print(String.fromCharCodes(data));
      });
    
      socket.write('Hello dari client!');
      await Future.delayed(Duration(seconds: 2));
      await socket.close();
    }
    

Operasi Standar I/O (Input/Output Standar) #

Dart juga menyediakan cara untuk bekerja dengan input/output standar, seperti membaca input dari pengguna melalui keyboard dan menulis output ke layar.

Membaca Input dari Keyboard #

Untuk membaca input dari pengguna, Anda bisa menggunakan stdin.readLineSync() untuk operasi sinkron.

Contoh:

import 'dart:io';

void main() {
  stdout.write('Masukkan nama Anda: ');
  String? nama = stdin.readLineSync();
  print('Halo, $nama!');
}

Untuk menulis output ke layar, Anda bisa menggunakan print() atau stdout.write().

Contoh:

void main() {
  print('Ini adalah output standar.');
  stdout.write('Ini adalah output tanpa baris baru.');
  stdout.write(' Melanjutkan di baris yang sama.');
}

Exception Handling dalam I/O #

Penanganan I/O sering melibatkan potensi kegagalan, seperti file yang tidak ditemukan atau koneksi jaringan yang gagal. Oleh karena itu, penting untuk menggunakan penanganan eksepsi untuk menangani kesalahan dengan aman.

Contoh Penanganan Eksepsi:

import 'dart:io';

void main() {
  try {
    var file = File('data.txt');
    String contents = file.readAsStringSync();
    print(contents);
  } catch (e) {
    print('Terjadi kesalahan: $e');
  }
}

Pemrograman Asinkron dalam I/O #

Dart mendukung pemrograman asinkron secara penuh, yang sangat berguna dalam penanganan I/O. Dengan menggunakan Future dan async/await, Anda dapat menulis kode yang responsif dan tidak memblokir thread utama.

Contoh:

import 'dart:io';

Future<void> main() async {
  var file = File('data.txt');
  try {


    String contents = await file.readAsString();
    print(contents);
  } catch (e) {
    print('Terjadi kesalahan: $e');
  }
}

Kesimpulan #

Penanganan I/O dalam Dart menyediakan alat yang kuat dan fleksibel untuk mengelola berbagai jenis operasi input dan output, mulai dari operasi file sederhana hingga penanganan jaringan yang lebih kompleks. Dengan pemahaman mendalam tentang pustaka dart:io, sinkronisasi dan pemrograman asinkron, serta penanganan eksepsi, Anda dapat membangun aplikasi Dart yang efisien dan handal dalam berbagai skenario.

« Multithreading
Socket »