Sunday, December 18, 2016

Bab 9. Java Teori dan Implementasi



Bab. 9 String dan Teks




9.1 Introduksi
Dalam pemrograman akan sering dijumpai masalah-masalah yang melibatkan pemrosesan file, file masukan, dan file keluaran. Misalnya, Anda ingin membuat suatu program yang menghitung jumlah perulangan karakter di dalam suatu file, lalu bagaimanakah Anda melakukannya?. Bab ini mengenalkan string dan file teks, yang akan membantu Anda menyelesaikan masalah seperti ini.


9.2 Kelas String

Suatu string merupakan runtun karakter. Dalam banyak bahasa pemrograman, string diperlakukan sebagai suatu array karakter, tetapi dalam JAVA, string adalah suatu objek. Kelas String memiliki 11 konstruktor dan lebih dari 40 metode untuk memanipulasi string. Bukan hanya berguna dalam pemrograman, tetapi juga merupakan contoh yang baik dalam mempelajari kelas dan objek.


9.2.1 Menciptakan String
Anda bisa menciptakan suatu objek string dari suatu literal string atau dari suatu array karakter. Untuk menciptakan suatu objek string dari literal string, gunakan sintaks berikut ini:

String stringBaru = new String(literalString);

Argumen literalString merupakan suatu runtun karakter yang diapit oleh kutip ganda. Statemen berikut ini menciptakan suatu objek String, pesan, dari literal string “JAVA itu Tangguh!”:

String pesan = new String("JAVA itu Tangguh!");

JAVA memperlakukan suatu literal string sebagai objek String. Jadi, statemen berikut ini adalah valid:

String pesan = " JAVA itu Tangguh!";

Anda juga bisa menciptakan suatu string dari sembarang array karakter. Sebagai contoh, statemen berikut ini menciptakan string “Danau Toba”:

char[] arrayChar = {'D', 'a', 'n', 'a', 'u ', ‘ ’, 'T', 'o', 'b', ‘a’};
String pesan = new String(arrayChar);

Suatu variabel String memuat suatu referensi kepada suatu objek String yang menyimpan nilai string. Dengan kata yang tepat, istilah variabel String, objek String, dan nilai string adalah berbeda, tetapi dalam banyak kesempatan perbedaan ini bisa diabaikan. Untuk penyederhanan, istilah string akan merujuk kepada variabel String, objek String atau nilai string.


9.2.2 String Immutable
Suatu string dikatakan immutable karena isinya tidak bisa diubah. Apakah kode berikut ini mengubah isi string?

String s = "JAVA";
s = "HTML";

Jawabannya adalah tidak. Statemen pertama menciptakan suatu objek String dengan isi “JAVA” dan menugaskan referensinya kepada s. Statemen kedua menciptakan suatu objek String dengan isi “HTML” dan menugaskan referensinya kepada s. Objek String yang pertama masih ada setelah penugasan pada statemen kedua, tetapi tidak bisa lagi diakses karena sekarang variabel s menunjuk kepada objek yang baru, seperti ditampilkan pada Gambar 9.1.

Gambar 9.1 String immutable; setelah diciptakan, tidak bisa diubah


Karena isi string tidak bisa diubah dan sangat sering dijumpai dalam pemrograman, JVM menggunakan suatu instans unik untuk literal string yang memiliki runtun karakter sama untuk meningkatkan efisiensi dan menghemat memori. Sebagai contoh, statemen berikut ini:


 menampilkan

s1 == s2 adalah false
s1 == s3 adalah true

Terlihat bahwa s1 dan s3 menunjuk kepada string yang sama “JAVA itu Tangguh!”, oleh karena itu s1 == s3 bernilai true. Akan tetapi, s1 == s2 bernilai false, karena s1 dan s2 adalah dua objek String yang berbeda, meskipun keduanya memiliki isi yang sama.


9.2.3 Perbandingan String
Kelas String menyediakan beberapa metode untuk membandingkan string, seperti yang ditunjukkan pada Gambar 9.2:

Gambar 9.2 Kelas String memuat beberapa metode untuk membandingkan string

Bagaimana Anda membandingkan isi dari dua string? Anda mungkin tergoda untuk menggunakan operator ==, sebagai berikut:

if (string1 == string2)
  System.out.println("string1 dan string2 adalah objek yang sama");
else
  System.out.println("string1 dan string2 adalah objek yang berbeda");

Akan tetapi, operator == hanya memeriksa apakah string1 dan string2 menunjuk kepada objek yang sama; tetapi hal ini tidak memberitahukan Anda apakah keduanya memiliki isi yang sama. Oleh karena itu, Anda tidak bisa menggunakan operator == untuk memeriksa apakah dua variabel string memuat konten yang sama. Solusinya adalah Anda bisa menggunakan metode equals. Kode yang diberikan ini, misalnya, dapat dipakai untuk membandingkan dua string:

if (string1.equals(string2))
  System.out.println("string1 dan string2 memiliki konten yang sama");
else
  System.out.println("string1 dan string2 tidak sama");

Sebagai contoh,

String s1 = new String("JAVA itu Tangguh!");
String s2 = "JAVA itu Tangguh!";
String s3 = "C++ juga Tangguh!";
System.out.println(s1.equals(s2)); // true
System.out.println(s1.equals(s3)); // false

Metode compareTo dapat juga dipakai untuk membandingkan dua string. Sebagai contoh, perhatikan kode berikut ini:

s1.compareTo(s2)

Metode ini mengembalikan nilai 0 jika s1 sama dengan s2, suatu nilai lebih kecil dari 0 bila s1 lebih kecil dari (urutan secara Unicode) s2, dan suatu nilai lebih besar dari 0 jika lebih besar dari (urutan secara Unicode) s2.

Nilai aktual yang dikembalikan oleh metode compareTo bergantung pada offset atas dua karakter berbeda yang pertama kali ditemukan. Misalnya, s1 adalah “abc” dan s2 adalah “abg”, maka s1.compareTo(s2) akan menghasilkan nilai balik -4. Dua karakter yang pertama (a versus a) dari s1 dan s2 dibandingkan. Karena keduanya sama, maka dua karakter kedua (b versus b) dibandingkan. Karena keduanya sama, maka dua karakter ketiga (b versus g) dibandingkan. Karena karakter c lebih kecil 4 dari g (urutan secara Unicode), maka hasil perbandingan menghasilkan nilai balik -4.

Kelas String juga menyediakan metode equalsIgnoreCase, compareToIgnoreCase, dan regionMatches untuk membandingkan string. Metode equalsIgnoreCase dan compareToIgnoreCase mengabaikan sensitifitas huruf besar atau huruf kecil ketika membandingkan dua string. Metode regionMatches membandingkan bagian dari dua string. Anda juga bisa menggunakan str.startsWith(prefiks) untuk memeriksa apakah string str dimulai dengan suatu prefiks tertentu, dan str.endsWith(suffiks) untuk memeriksa apakah string str diakhiri dengan suatu suffiks tertentu.


9.2.4 Panjang String, Karakter, dan Penggabungan String
Kelas String menyediakan beberapa metode untuk mendapatkan panjang, mengambil karakter individual, dan menggabungkan string, seperti yang ditampilkan pada Gambar 9.3:

Gambar 9.3 Kelas String memuat beberapa metode untuk mendapatkan panjang, mengambil karakter individual, dan menggabungkan string

Anda dapat memperoleh panjang suatu string dengan memanggil metode length(). Sebagai contoh, pesan.length() mengembalikan panjang string pesan.

Metode charAt() dapat digunakan untuk mengambil suatu karakter tertentu di dalam suatu string s, dimana memiliki indeks 0 sampai s.length() – 1. Sebagai contoh, pesan.charAt(0) mengembalikan karakter T, seperti yang ditampilkan pada Gambar 9.4.


Gambar 9.4 Suatu string Objek direpresentasikan oleh array secara internal


Anda bisa menggunakan metode concat untuk menggabungkan dua string. Statemen berikut ini, misalnya, menggabungkan string s1 dan s2 menjadi s3:

String s3 = s1.concat(s2);

Karena penggabungan string sangat sering digunakan dalam pemrograman, JAVA menyediakan cara yang mudah untuk melakukannya. Anda bisa menggunakan tanda plus (+) untuk menggabungkan dua atau lebih string. Jadi, statemen di atas ekivalen dengan

String s3 = s1 + s2;

Kode berikut ini menggabungkan string pesan, “ dan “, dan “HTML” menjadi satu string:

String stringKu = pesan + " dan " + "HTML";

Ingat bahwa tanda plus juga dapat digunakan untuk menggabungkan string dan angka. Pada kasus ini, angka dikonversi menjadi suatu string dan dilakukan penggabungan. Perhatikan bahwa harus ada minimal satu operand string agar penggabungan bisa dilakukan.


9.2.5 Mendapatkan Substring
Anda bisa mendapatkan suatu karakter tunggal dari suatu string menggunakan metode charAt, seperti ditunjukkan pada Gambar 9.3. Anda juga bisa mengambil suatu substring dari suatu string menggunakan metode substring dalam kelas String, seperti ditampilkan pada Gambar 9.4:

Gambar 9.5 Kelas String memuat beberapa metode untuk mendapatkan substring


Gambar 9.6 Metode substring mendapatkan suatu substring dari suatu string

Sebagai contoh,

String pesan = "Teknik Elektro!".substring(0, 11) + "Infor";

String pesan sekarang menjadi “Teknik ElekInfor”.


9.2.6 Mengubah, Mengganti, dan Memecah String
Kelas String menyediakan beberapa metode untuk mengubah, mengganti dan memecah string, seperti yang ditunjukkan pada Gambar 9.7:

Gambar 9.7 Kelas String menyediakan beberapa metode untuk mengubah, mengganti dan memecah string

Begitu suatu string diciptakan, isinya tidak bisa diubah. Metode-metode toLowerCase, toUpperCase, trim, replace, replaceFirst, dan replaceAll mengembalikan suatu string baru yang berasal dari string asli (tanpa mengubah string yang asli). Metode toLowerCase dan toUpperCase mengembalikan suatu string baru dengan mengubah semua karakter dalam string menjadi huruf kecil atau huruf besar. Metode trim mengembalikan suatu string baru dengan menghilangkan karakter-karakter kosong pada string asli. Beberapa versi metode replace disediakan untuk mengganti suatu karakter atau suatu substring dalam string asli dengan suatu karakter baru atau suatu string baru.

Sebagai contoh,

"Teknik".toLowerCase() mengembalikan suatu string baru, teknik.
"Teknik".toUpperCase() mengembalikan suatu string baru, TEKNIK.
"  Teknik  ".trim() mengembalikan suatu string baru, Teknik.
"Teknik".replace('e', 'A') mengembalikan suatu string baru, TAknik.
"Teknik".replaceFirst("e", "AB") mengembalikan suatu string baru, TABknik.
"Teknik".replace("k", "AB") mengembalikan suatu string baru, TeABniAB.
"Teknik".replace("ek", "AB") mengembalikan suatu string baru, TABnik.

Metode split dapat digunakan untuk mengekstrak token-token dari suatu string dengan delimiter tertentu. Sebagai contoh, kode berikut ini

String[] token = "JAVA#HTML#Perl".split("#", 0);
for (int i = 0; i < token.length; i++)
  System.out.print(token[i] + " ");

menampilkan

JAVA HTML Perl



9.2.7 Mecocokkan, Mengganti, dan Memecah dengan Pola
Anda bisa mencocokkan, mengganti, atau memecah suatu string dengan pola tertentu. Fitur ini sangat penting dan berguna, dikenal dengan ekspresi reguler. Ekspresi reguler kelihatan sulit bagi programmer pemula.
Dimulai dengan metode matches dalam kelas String. Pada pandangan pertama, metode matches sama dengan metode equals. Sebagai contoh, dua statemen berikut ini menghasilkan evaluasi true:

"JAVA".matches("JAVA ");
"JAVA".equals("JAVA ");

Akan tetapi, metode matches jauh lebih berguna. Metode ini bisa mencocokkan tidak hanya string ukuran tetap, tetapi juga sekelompok string yang mengikuti suatu pola. Sebagai contoh, hasil evaluasi terhadap semua statemen berikut ini bernilai true:

"JAVA itu menyenangkan".matches("JAVA.*" )
"JAVA itu keren".matches("JAVA.*" )
"JAVA itu berguna".matches("JAVA.*")

JAVA.*” dalam tiga statemen di atas merupakan suatu ekspresi reguler, yang menjelaskan bahwa suatu pola string yang dimulai dengan JAVA dan diikuti oleh sembarang karakter lainnya.

Metode-metode replaceAll, replaceFirst, dan split dapat digunakan pada ekspresi reguler.  Sebagai contoh, statemen berikut ini mengembalikan suatu string baru yang menggantikan $, +, atau # dalam “a+b$#c” dengan string NNN:

String s = "a+b$#c".replaceAll("[$+#]", "NNN");
System.out.println(s);

Ekspresi reguler di sini [$+#] menentukan suatu pola yang cocok dengan $, +, atau #. Jadi, keluarannya adalah aNNNbNNNNNNc.

Statemen berikut ini memecah string menjadi suatu string yang memuat beberapa string yang ditandai dengan tanda baca.

String[] token = "JAVA,C?C#,C++".split("[.,:;?]");
for (int i = 0; i < token.length; i++)
  System.out.println(token[i]);

Di sini ekspresi reguler [. , : ; ?] yang menentukan suatu pola yang cocok dengan ., ,, :, ;, atau ?. Tiap karakter ini merupakan pembatas atau delimiter untuk memecah string. Sehingga, string dipecah menjadi JAVA, C, C#, dan C++, yang disimpan pada array token.


9.2.8 Mencari Suatu Karakter atau Suatu Substring dalam Suatu String
Kelas String menyediakan beberapa metode teroverload indexOf dan lastIndexOf untuk mencari suatu karakter atau suatu substring di dalam suatu string, seperti ditampilkan pada Gambar 9.8:

Sebagai contoh,

"Welcome to Java".indexOf('W') mengembalikan 0.
"Welcome to Java".indexOf('o') mengembalikan 4.
"Welcome to Java".indexOf('o', 5) mengembalikan 9.
"Welcome to Java".indexOf("come") mengembalikan 3.
"Welcome to Java".indexOf("Java", 5) mengembalikan 11.
"Welcome to Java".indexOf("java", 5) mengembalikan -1.
"Welcome to Java".lastIndexOf('W') mengembalikan 0.
"Welcome to Java".lastIndexOf('o') mengembalikan 9.
"Welcome to Java".lastIndexOf('o', 5) mengembalikan 4.
"Welcome to Java".lastIndexOf("come") mengembalikan 3.
"Welcome to Java".lastIndexOf("Java", 5) mengembalikan -1.
"Welcome to Java".lastIndexOf("Java") mengembalikan 11.


Gambar 9.8 Kelas String memuat beberapa metode untuk mencocokkan string


9.2.9 Konversi Antara String dan Array
String bukan array, tetapi suatu string dapat dikonversi menjadi suatu array, dan sebaliknya. Untuk mengkonversi suatu string menjadi suatu array karakter, gunakan metode toCharArray. Sebagai contoh, statemen berikut ini mengkonversi string “JAVA” menjadi suatu array:

char[] kar = "JAVA".toCharArray();

Jadi, kar[0] adalah ‘J’, kar[1] adalah ‘A’, kar[2] adalah ‘V’, dan kar[3] adalah ‘A’.

Anda juga bisa menggunakan metode getChars(int srcAwal, int srcAkhir, char[ ] salin, int salinMulai) untuk menyalin suatu substring dari string dengan indeks srcAwal sampai srcAkhir - 1 ke dalam suatu array karakter salin dimulai dari indeks salinMulai. Sebagai contoh, kode berikut ini menyalin substring “3720” dari string “CS3720” dimulai dari indeks 2 sampai indeks 6-1 ke dalam karakter salin dimuali dari indeks 4:

char[] salin = {'J', 'A', 'V', 'A', '1', '3', '0', '1'};
"CS3720".getChars(2, 6, salin, 4);

Jadi, array salin menjadi {‘J’, ‘A’, ‘V’, ‘A’, ‘3’, ‘7’, ‘2’, ‘0’}.

Untuk mengkonversi suatu array karakter menjadi suatu string, digunakan konstruktor String(char[ ]) atau metode valueOf(char[ ]). Sebagai contoh, statemen berikut ini menciptakan suatu string dari suatu array menggunakan konstruktor String:

String str = new String(new char[]{'J', 'a', 'v', 'a'});

Statemen berikutnya menciptakan suatu string dari suatu array menggunakan metode valueOf:

String str = String.valueOf(new char[]{'J', 'a', 'v', 'a'});



9.2.10 Mengubah Karakter dan Nilai Numerik Menjadi String
Metode statik valueOf dapat digunakan untuk mengkonversi suatu array karakter menjadi suatu string. Terdapat beberapa versi teroverload dari metode valueOf yang dapat dipakai untuk mengkonversi suatu karakter dan nilai numerik menjadi string dengan berbagai tipe berbeda char, double, long, int, dan float, seperti ditunjukkan pada Gambar 9.9.

Gambar 9.9 Kelas String memuat beberapa metode statik untuk menciptakan string dari nilai-nilai tipe primitif

Sebagai contoh, untuk mengkonversi suatu nilai double 5.44 menjadi suatu string, gunakan String.valueOf(5.44). Nilai baliknya adalah suatu string yang memuat karakter-karakter ‘5’, ‘.’, ‘4’, dan ‘4’.


9.2.11 Memformat String
Kelas String memuat metode statik format untuk menciptakan suatu string terformat. Sintaks untuk memanggil metode ini adalah:

String.format(format, item1, item2, ..., itemk)

Metode ini sama dengan metode printf kecuali bahwa metode format memberikan nilai balik suatu string terformat, sedangkan metode printf menampilkan string terformat. Sebagai, contoh

String s = String.format("%5.2f", 45.556);

menciptakan suatu string terformat “45.56”.


9.2.12 Masalah: Memeriksa Palindrome
Suatu string dikatak palindrome jika dibaca dari belakang maupun depan akan menghasilkan string yang sama. Kata seperti “ada” dan “anna” adalah dua contoh palindrome.

Tantangannya di sini adalah menulis suatu program yang meminta pengguna untuk memasukkan suatu string dan yang melaporkan apakah string tersebut palindrome atau bukan. Salah satu solusi adalah memeriksa apakah karakter pertama sama dengan karakter terakhir. Jika ya, diperiksa kembali apakah karakter kedua sama dengan karakter kedua terakhir. Pemeriksaan seperti ini secara berulang dilakukan sampai ketidakcocokan ditemukan atau sampai semua string diperiksa dan dibandingkan, kecuali karakter tengah bila jumlah karakter ganjil.

Untuk mengimplementasikan ide ini, digunakan dua variabel, atas dan bawah, untuk menandai posisi dua karakter pada awal dan akhir suatu string s, seperti ditunjukkan pada kode9.1 (baris 22 dan 25). Awalnya, bawah diinisialisasi dengan 0 dan atas diinisialisasi dengan s.length() – 1. Jika dua karakter pada dua posisi ini cocok, maka bawah diinkremen sebesar 1 dan atas didekremen sebesar 1 (baris 31 - 32). Proses ini berlanjut sampai (bawah >= atas) atau sampai ditemukannya ketidakcocokan.


Kode9.1 PeriksaPalindrome.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.util.Scanner;

public class PeriksaPalindrome {
  /** Metode utama */
  public static void main(String[] args) {
    // Menciptakan Scanner
    Scanner masukan = new Scanner(System.in);

    // Meminta pengguna memasukkan suatu string
    System.out.print("Masukkan suatu string: ");
    String s = masukan.nextLine();

    if(apaPalindrome(s))
      System.out.println(s + " adalah suatu palindrome");
    else
      System.out.println(s + " bukan suatu palindrome");
  }

  /** Memeriksa apakah suatu string adalah suatu palindrome */
  public static boolean apaPalindrome(String s) {
    // Indeks pertama dalam string
    int bawah = 0;

    // Indeks terkahir string
    int atas = s.length()- 1;

    while (bawah < atas) {
      if(s.charAt(bawah) != s.charAt(atas))
        return false; // Bukan suatu palindrome

      bawah++;
      atas--;
    }

    return true; // The string is a palindrome
  }
}

Keluaran:

Masukkan suatu string: abba
abba adalah suatu palindrome

Masukkan suatu string: anda
anda bukan suatu palindrome

Metode nextLine() di dalam kelas Scanner pada baris 11 membaca satu baris ke dalam s, kemudian apaPalindrome() memeriksa apakah s suatu palindrome atau tidak.


9.2.13 Masalah: Konversi Heksadesimal Menjadi Desimal
Bagian 5.7 memberikan suatu program untuk mengkonversi desimal menjadi heksadesimal. Bagian ini akan menyajikan suatu program yang melakukan konversi dari angka heksadesimal menjadi desimal.

Diberikan suatu angka desimal
Nilai desimal ekivalennya adalah




Sebagai contoh, angka heksadesimal AB8C memiliki nilai desimal ekivalen:




Program ini akan meminta pengguna untuk memasukkan suatu angka desimal sebagai string dan mengkonversinya menjadi desimal menggunakan metode berikut ini:

public static int hexKeDesimal(String hex)

Perhatikan bahwa




Pengamatan ini mengarah pada algoritma efisien untuk mengkonversi suatu string heksadesimal menjadi angka desimal:

int nilaiDesimal = 0;
for (int i = 0; i < hex.length(); i++) {
  char hexKar = hex.charAt(i);
  nilaiDesimal = nilaiDesimal * 16 + hexKarKeDesimal(hexKar);
}

i
hexKar
hexKarKeDesimal
nilaiDesimal
sebelum loop

setelah iterasi pertama

setelah iterasi kedua

setelah iterasi ketiga

setelah iterasi keempat


A

B

8

C


10

11

8

12
0

10

10*16+11

(10*16+11)*16+8

((10*16+11)*16+8)*16+12

Kode9.2 memberikan program utuh.

Kode9.2 KonversiHexKeDesimal.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.util.Scanner;

public class KonversiHexKeDesimal {
  /** Metode utama */
  public static void main(String[] args) {
    // Menciptakan Scanner
    Scanner masukan = new Scanner(System.in);

    // Meminta pengguna untuk memasukkan suatu string
    System.out.print("Masukkan suatu angka heksadesimal: ");
    String hex = masukan.nextLine();

    System.out.println("Nilai desimalnya "
     + hex + " adalah "+ hexKeDesimal(hex.toUpperCase()));
  }

  public static int hexKeDesimal(String hex){
    int nilaiDesimal = 0;
    for (int i = 0; i < hex.length(); i++) {
      char hexKar = hex.charAt(i);
      nilaiDesimal = nilaiDesimal * 16 + hexKarKeDesimal(hexKar);
    }

    return nilaiDesimal;
  }

  public static int hexKarKeDesimal(char ch) {
    if (ch >= 'A' && ch <= 'F')
      return 10 + ch - 'A';
    else // ch adalah '0', '1', ..., atau '9'
      return ch - '0';
  }
}

Keluaran:

Masukkan suatu angka heksadesimal: f3ad
Nilai desimalnya f3ad adalah 62381

Masukkan suatu angka heksadesimal: AF458
Nilai desimalnya AF458 adalah 717912


Program membaca suatu string dari konsol (baris 11), dan memanggil metode hexKeDesimal untuk mengkonversi suatu string heksadesimal menjadi angka desimal (baris 14). Karakter-karakter dapat berupa huruf kecil maupun huruf besar, karena terlebih dahulu dikonversi menjadi huruf besar menggunakan metode toUpperCase() sebelum memanggil metode hexKeDesimal.

Metode hexKeDesimal didefinisikan pada baris 17-25 untuk menghasilkan suatu integer. Panjang string ditentukan dengan memanggil hex.length() pada baris 19.

Metode hexKarKeDesimal didefinisikan pada baris 27-32 untuk mengembalikan suatu nilai desimal untuk suatu karakter heksadesimal. Karakter bisa berupa huruf besar ataupun huruf kecil. Ingat bahwa mengurangi dua karakter sama artinya dengan mengurangi Unicodenya.


9.3 Kelas Character
JAVA menyediakan kelas untuk semua tipe primitif. Kelas-kelas tersebut adalah Character, Boolean, Byte, Short, Integer, Long, Float, dan Double untuk tipe char, boolean, byte, short, int, long, float, dan double. Semua kelas ini ada dalam paket java.lang. Kelas-kelas ini memampukan nilai-nilai tipe primitif diperlakukan sebagai objek. Kelas-kelas ini juga memuat beberapa metode yang penting untuk memproses nilai-nilai primitif.
Kelas Character memiliki suatu konstruktor dan beberapa metode untuk menentukan kategori karakter (huruf besar, huruf kecil, dijit, dan seterusnya) dan untuk mengkonversi karakter-karakter tersebut menjadi huruf kecil, dan sebaliknya, seperti ditampilkan pada Gambar 9.10.

Anda bisa menciptakan suatu objek Character dari suatu nilai char. Sebagai contoh, statemen berikut ini menciptakan suatu objek Character dari karakter ‘a’:

Character karakter = new Character('a');

Metode charValue mengembalikan nilai karakter dalam objek Character. Metode compareTo membandingkan karakter ini dengan karakter lain dan mengembalikan suatu integer yang merupakan perbedaan Unicode antara kedua karakter. Metode equals mengembalikan true jika dan hanya jika dua karakter sama. Sebagai contoh, diberikan karObjek menggunakan new Character(‘b’), maka

karObjek.compareTo(new Character('a')) mengembalikan 1
karObjek.compareTo(new Character('b')) mengembalikan 0
karObjek.compareTo(new Character('c')) mengembalikan –1
karObjek.compareTo(new Character('d')) mengembalikan –2
karObjek.equals(new Character('b')) mengembalikan true
karObjek.equals(new Character('d')) mengembalikan false


Gambar 9.10 Kelas Character menyediakan beberapa metode untuk memanipulasi karakter

Kebanyakan metode dalam kelas Character merupakan metode statik. Metode isDigit(char ch) mengembalikan true bila karakter adalah suatu dijit. Metode isLetter(char ch) memberikan true bila karakter adalah huruf. Metode isLetterOrDigit(char ch) mengembalikan true bila karakter huruf atau dijit. Metode isLowerCase(char ch) mengembalikan true bila karakter adalah huruf kecil. Metode isUpperCase(char ch) mengembalikan true bila karakter adalah huruf besar. Metode toLowerCase(char ch) mengembalikan huruf kecil untuk karakter yang diberikan, dan metode toUpperCase(char ch) mengembalikan huruf besar untuk karakter yang diberikan.


9.3.1 Masalah: Menghitung Huruf dalam String
Tantangannya di sini adalah menulis suatu program yang meminta pengguna memasukkan suatu string dan yang menghitung jumlah perulangan setiap huruf di dalam string, tanpa memandang huruf besar atau huruf kecil. Berikut merupakan beberapa langkah untuk menyelesaikan masalah ini:
1.     Konversi semua huruf besar di dalam string menjadi huruf kecil menggunakan metode toLowerCase di dalam kelas String.
2.     Menciptakan suatu array, sebut saja hitung yang memuat 26 nilai-nilai int, yang masing-masing menghitung perulangan setiap huruf. Yaitu, hitung[0] menghitung perulangan ‘a’, hitung[1] menghitung perulangan ‘b’, dan seterusnya.
3.     Untuk setiap karakter di dalam string, periksa apakah huruf atau tidak. Jika ya, perhitungan yang terlibat diinkremen.
Kode9.3 memberikan program utuh untuk menyelesaikan tantangan ini.

Kode9.3 HitungSetiapHuruf.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.util.Scanner;

public class HitungSetiapHuruf {
  /** Metode utama */
  public static void main(String[] args) {
    // Menciptakan Scanner
    Scanner masukan = new Scanner(System.in);

    // Meminta pengguna memasukkan suatu string
    System.out.print("Masukkan suatu string: ");
    String s = masukan.nextLine();

    // Memanggil metode hitungHuruf untuk menghitung setiap huruf
    int[] hitung = hitungHuruf(s.toLowerCase());

    // Menampilkan hasil
    for (int i = 0; i < hitung.length; i++) {
      if (hitung[i] != 0)
      System.out.println((char)('a' + i) + " muncul " +
        hitung[i] + " kali" );
    }
  }

  /** Menghitung setiap huruf di dalam string */
  public static int[] hitungHuruf(String s) {
    int[] hitung = new int[26];

    for (int i = 0; i < s.length(); i++) {
      if(Character.isLetter(s.charAt(i)))
        hitung[s.charAt(i) - 'a']++;
    }

    return hitung;
  }
}

Keluaran

Masukkan suatu string: Pematang Siantar
a muncul 4 kali
e muncul 1 kali
g muncul 1 kali
i muncul 1 kali
m muncul 1 kali
n muncul 2 kali
p muncul 1 kali
r muncul 1 kali
s muncul 1 kali
t muncul 2 kali

Metode main membaca sebaris masukan (baris 11) dan menghitung jumlah perulangan setiap huruf di dalam string dengan memanggil metode hitungHuruf (baris 14). Program menggunakan metode toLowerCase untuk mengkonversi string menjadi huruf kecil semua dan melewatkan string baru itu kepada metode hitungHuruf.

Metode hitungHuruf (baris 25-34) mengembalikan suatu array beranggotakan 26 elemen. Setiap elemen dipakai untuk menghitung jumlah perulang suatu huruf di dalam string s. Metode ini memproses setiap karakter di dalam string. Jika karakter adalah suatu huruf, maka perhitungan yang terkait diinkremen sebesar 1. Sebagai contoh, jika karakter (s.charAr(i)) adalah ‘a’, perhitungannya adalah hitung[‘a’ - ‘a’] (hitung[0]). Jika karakter (s.charAr(i)) adalah ‘b’, perhitungannya adalah hitung[‘b’ - ‘a’] (hitung[1]), karena Unicode ‘b’ adalah 1 lebih besar dari Unicode ‘a’. Jika karakter (s.charAr(i)) adalah ‘z’, perhitungannya adalah hitung[‘z’ - ‘a’] (hitung[25]), karena Unicode ‘z’ adalah 25 lebih besar dari Unicode ‘a’.

9.4 Kelas StringBuilder/StringBuffer
Kelas StringBuilder/StringBuffer merupakan alternatif dari kelas String. Secara umum, kelas StringBuilder/StringBuffer dapat digunakan kapan saja suatu string digunakan. Kelas StringBuilder/StringBuffer lebih fleksibel dibandingkan kelas String. Anda bisa menyambung isi baru ke dalam suatu objek StringBuilder atau objek StringBuffer, sedangkan nilai suatu objek String adalah tetap dan tidak bisa diubah.

Kelas StringBuilder sama dengan kelas StringBuffer kecuali bahwa metode-metode untuk memodifikasi buffer di dalam StringBuffer telah disinkronisasi. Gunakan StringBuffer jika diakses oleh beberapa pekerjaan secara bersamaan. Penggunaan StringBuilder lebih efisien bila hanya diakses oleh satu pekerjaan. Konstruktor dan metode dalam StringBuilder dan StringBuffer hampir semua sama. Bagian ini akan merangkum StringBuilder. Anda bisa saja mengganti StringBuilder dengan StringBuffer, program akan berjalan normal tanpa perlu melakukan perubahan apapun.

Kelas StringBuilder memiliki tiga konstruktor dan lebih dari 30 metode. Anda bisa menciptakan suatu string builder kosong atau menciptakan suatu string builder dari suatu string menggunakan konstruktor-konstruktor yang ditampilkan pada Gambar 911.

Gambar 9.11 Kelas StringBuilder yang memuat tiga konstruktor untuk menciptakan instans dari StringBuilder


9.4.1 Modifikasi String di dalam StringBuilder
Anda bisa menyambung konten baru di ujung akhir suatu string builder, menyisipkan konten baru pada posisi tertentu di dalam suatu string builder, dan menghapus atau mengganti karakter-karakter di dalam suatu string builder, menggunakan metode-metode yang ditampilkan pada Gambar 9.12:

Gambar 9.12 Kelas StringBuilder memuat beberapa metode untuk memodifikasi string builder


Kelas StringBuilder menyediakan beberapa metode teroverload untuk menyambung boolean, char, array char, double, float, int, long, dan String ke dalam suatu string builder. Sebagai contoh, kode berikut ini menyambungkan string dan karakter ke dalam stringBuilder untuk membentuk suatu string baru, “JAVA itu Tangguh!”:

StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("JAVA");
stringBuilder.append(' ');
stringBuilder.append("itu");
stringBuilder.append(' ');
stringBuilder.append("Tangguh!");

Kelas StringBuilder memuat beberapa metode teroverload untuk menyisipkan boolean, char, array char, double, float, int, long, dan String ke dalam suatu string builder. Perhatikan kode berikut ini:

stringBuilder.insert(5, "dan HTML ");

Seandainya stringBuilder memuat “JAVA itu Tangguh!” sebelum metode insert diterapkan. Kode tersebut menyisipkan “dan HTML “ pada posisi 5 dalam stringBuilder (tepat sebelum i). stringBuilder yang baru adalah “JAVA dan HTML itu Tangguh!”.

Anda juga bisa menghapus beberapa karakter dari suatu string di dalam string builder menggunakan dua metode delete, membalikkan string menggunakan metode reverse, mengganti karakter menggunakan metode replace, atau menetapkan suatu karakter baru di dalam suatu string menggunakan metode setCharAt.

Sebagai contoh, dimisalkan stringBuilder memuat “JAVA itu Tangguh!” sebelum tiap statemen ini diterapkan:

stringBuilder.delete(4, 7) mengubah builder menjadi JAVA Tangguh!.
stringBuilder.deleteCharAt(5) mengubah builder menjadi JAVA tu Tangguh!.
stringBuilder.reverse() mengubah builder menjadi !huggnaT uti AVAJ.
stringBuilder.replace(0, 3, "HTML") mengubah builder menjadi HTML itu Tangguh!.
stringBuilder.setCharAt(0, 'j') menetapkan builder menjadi jAVA itu Tangguh!.

Semua metode modifikasi kecuali setCharAt melakukan dua hal berikut:
1.     Mengubah isi string builder.
2.     Mengembalikan referensi dari string builder.
Sebagai contoh,

StringBuilder stringBuilder1 = stringBuilder.reverse();

membalikkan string di dalam builder dan menugaskan referensi builder kepada stringBuilder1. Jadi, sekarang stringBuilder dan stringBuilder1 sama-sama menunjuk kepada objek StringBuilder yang sama.


9.4.2 Metode toString, capacity, length, setLength, dan charAt
Kelas StringBuilder menyediakan beberapa metode tambahan untuk memanipulasi suatu string builder, seperti ditunjukkan pada Gambar 9.13.

Gambar 9.13 Kelas StringBuilder menyediakan beberapa metode tambahan untuk memanipulasi suatu string builder


Metode capacity() mengembalikan ukuran kapasitas suatu string builder. Kapasitas adalah jumlah karakter yang mampu disimpan tanpa harus menambah ukurannya.

Metode length() mengembalikan jumlah karakter yang disimpan di dalam string builder. Metode setLength(newLength) menetapkan panjang string builder. Jika newLength kurang dari panjang string builder saat ini, maka string builder dipotong persis untuk memuat sejumlah karakter yang diberikan argumen newLength. Jika newLength lebih dari atau sama dengan panjang string builder saat ini, maka karakter-karakter null (‘\u0000’) disambungkan secukupnya ke dalam string builder sehingga length menjadi sama dengan newLength.

Metode charAt(index) mengembalikan karakter pada indeks index di dalam string builder. Indeks dimulai dari 0. Karakter pertama dalam string builder adalah pada indeks 0, berikutnya indeks 1, dan seterusnya. Argumen index harus lebih besar atau sama dengan 0, dan lebih kecil dari panjang string builder.


9.4.3 Masalah: Mengabaikan Karakter Nonalfanumerik
Kode9.1, PeriksaPalindrome.java, mempertimbangkan semua karakter di dalam suatu string untuk memeriksa apakah palindrome atau tidak. Tantangannya di sini adalah menulis suatu program yang mengabaikan karakter-karakter nonalfanumerik di dalam pencarian string palindrome.

Berikut merupakan langkah-langkah penyelesaian masalah:
1.     Memfilter string dengan menghapus semua karakter nonalfanumerik. Hal ini bisa dilakukan dengan menciptakan suatu string builder kosong, menambahkan setiap karakter alfanumerik di dalam string ke dalam suatu string builder, dan mengembalikan string dari string builder. Anda bisa menggunakan metode isLetterOrDigit(ch) dalam kelas Character untuk memeriksa apakah ch karakter atau dijit.
2.     Mendapatkan suatu string baru yang merupakan kebalikan dari string yang terfilter. Kemudian string yang terbalik dibandingkan dengan string terfilter menggunakan metode equals.
Program utuh ditampilkan pada kode9.4.

Kode9.4 PalindromeAbaikanNonalfanumerik.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import java.util.Scanner;

public class PalindromeAbaikanNonAlfanumerik {
  /** Metode utama */
  public static void main(String[] args) {
    // Menciptakan Scanner
    Scanner masukan = new Scanner(System.in);

    // Meminta pengguna memasukkan suatu string
    System.out.print("Masukan suatu string: ");
    String s = masukan.nextLine();

    // Menampilkan hasil
    System.out.println("Mengabaikan karakter-karakter alfanumerik,
     \napakah "  + s + " suatu palindrome? " + apaPalindrome(s));
  }

  /** Mengembalikan true bila suatu string adalah palindrome */
  public static boolean apaPalindrome(String s) {
    // Menciptakan string baru dengan menghapus karakter nonalfanumerik
    String s1 = filter(s);

    // Menciptakan suatu string baru yang berkebalikan dari s1
    String s2 = balik(s1);

    // Membandingkan jika string terbalik sama dengan string asli
    return s2.equals(s1);
  }

  /** Menciptakan string baru, menghapus karakter nonalfanumerik */
  public static String filter(String s) {
    // Menciptakan suatu string builder
    StringBuilder stringBuilder = new StringBuilder();

    // Memeriksa setiap char di dalam string
    for (int i = 0; i < s.length(); i++) {
      if(Character.isLetterOrDigit(s.charAt(i))) {
        stringBuilder.append(s.charAt(i));
      }
    }

    // Mengembalikan suatu string terfilter yang baru
    return stringBuilder.toString();
  }

  /** Menciptakan string baru dengan membalikkan string tertentu */
  public static String balik(String s) {
    StringBuilder stringBuilder = new StringBuilder(s);
    stringBuilder.reverse(); //Memanggil metoder reverse dalam  StringBuilder
    return stringBuilder.toString();
  }
}

Keluaran

Masukan suatu string: ab<c>cb?a
Mengabaikan karakter-karakter alfanumerik,
apakah ab<c>cb?a suatu palindrome? true

Masukan suatu string:abcc><?cab
Mengabaikan karakter-karakter alfanumerik,
apakah bcc><?cab suatu palindrome? false

Metode filter(String s) (baris 31-44) memeriksa setiap karakter di dalam string s dan menyalinnya ke dalam suatu string builder jika karakter huruf atau dijit. Metode filter mengembalikan string di dalam builder. Metode balik(String s) (baris 47-52) menciptakan suatu string baru yang membalikkan string s. Metode filter dan balik keduanya mengembalikan suatu string baru. String asli tidak tersentuh dan tidak berubah.

Program pada kode9.1 memeriksa apakah string suatu palindrome atau tidak dengan membandingkan pasangan karakter pada kedua ujung string. Kode9.4 menggunakan metode reverse di dalam kelas StringBuilder untuk membalikkan string, kemudian membandingkan apakah kedua string sama dalam memutuskan palindrome atau bukan.


9.5 Argumen Command - Line
Mungkin Anda telah memperhatikan deklarasi yang tidak biasa pada metode main, yang memiliki parameter args bertipe String[ ]. Jelaslah bahwa args merupakan suatu array string. Metode main sama seperti metode reguler dengan parameter. Anda bisa memanggil metode reguler dengan melewatkan parameter aktual. Pertanyaannya adalah dapatkah Anda melewatkan argumen kepada main? Jawabannya Ya, tentu saja. Sebagai contoh, metode main dalam kelas TestMain dipanggil oleh suatu metode A, seperti ditampilkan berikut ini:


Metode main sama seperti metode biasa. Selanjutnya, Anda bisa melewatkan argumen dari command line.


9.5.1 Melewatkan String Kepada Metode Main
Anda bisa melewatkan string kepada metode main dari command line ketika Anda menjalankan program. Command line berikut ini, misalnya, menjalankan program dengan TestMain dengan tiga string:

java TestMain arg0 arg1 arg2

arg0, arg1, dan arg2 adalah string, tetapi ketiganya tidak perlu diapit oleh kutip ganda pada command line. String dipisahkan oleh spasi. Suatu string yang memuat spasi harus diapit oleh kutip ganda. Perhatikan command line berikut ini:

java TestMain "Bandung Tarutung" Jogja 1977

Command line tersebut menjalankan program dengan tiga string: “Bandung Tarutung”, Jogja, dan 1977, suatu string numerik. Karena “Bandung Tarutung” adalah suatu string, maka harus diapit oleh kutip ganda. Perhatikan bahwa 1977 diperlakukan sebagai string.

Ketika metode main dipanggil, JVM menciptakan suatu array untuk menampung argumen-argumen command line dan melewatkan referensi array tersebut kepada args. Sebagai contoh, jika Anda memanggil suatu program dengan n argumen, JVM akan menciptakan suatu array seperti ini:

args = new String[n];

JVM kemudian melewatkan args kepada metode main.


9.5.2 Masalah: Kalkulator
Dimisalkan Anda akan membuat suatu program yang melakukan operasi-operasi aritmatika terhadap integer. Program menerima tiga argumen: suatu integer yang diikuti oleh suatu operator dan suatu integer lain. Sebagai contoh, untuk menambahkan dua integer, gunakan perintah ini:

java Kalkulator 2 + 3

Program kemudian menampilkan keluaran berikut:

2 + 3 = 5

Gambar 9.14 menampilkan contoh ketika program dijalankan.

Gambar 9.14 Program mengambil tiga argumen (operand1 operator operand2) dari command line dan menampilkan ekspresi dan hasil operasi aritmatika

String-string yang dilewatkan kepada metode main disimpan dalam args, yang merupakan suatu array string. String pertama disimpan dalam args[0], dan args.length adalah jumlah string yang dilewatkan. Berikut adalah beberapa langkah di dalam program:
·         Gunakan args.length untuk menentukan apakah ketiga argumen telah disediakan pada command line. Jika tidak, program dihentikan menggunakan System.exit(0).
·         Lakukan operasi aritmatika biner terhadap operand args[0] dan args[2] menggunakan operator yang dispesifikasi dalam args[1].
Program utuh diberikan pada kode9.5.

Kode9.5 Kalkulator.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class Kalkulator {
  /** Metode utama */
  public static void main(String[] args) {
    // Memeriksa jumlah string yang dilewatkan
    if (args.length != 3) {
      System.out.println(
      "Usage: java Kalkulator operand1 operator operand2");
      System.exit(0);
    }

    // Hasil operasi
    int hasil = 0;

    // Menentukan operator
    switch(args[1].charAt(0)) {
      case '+': hasil = Integer.parseInt(args[0]) +
                        Integer.parseInt(args[2]);
                break;
      case '-': hasil = Integer.parseInt(args[0]) -
                        Integer.parseInt(args[2]);
                break;
      case '*': hasil = Integer.parseInt(args[0]) *
                        Integer.parseInt(args[2]);
                break;
      case '/': hasil = Integer.parseInt(args[0]) /
                        Integer.parseInt(args[2]);
    }

    // Menampilkan hasil
    System.out.println( args[0] + ' '+ args[1] + ' ' + args[2]
     + " = " + hasil);
 }
}

Integer.parseInt(args[0]) (baris 16) mengubah suatu string menjadi integer. String tersebut harus memuat dijit. Jika, tidak maka program akan berhenti secara abnormal.


9.6 Kelas File
Data yang disimpan dalam variabel, array, dan objek bersifat sementara, karena akan hilang ketika program berhenti. Untuk menyimpan data secara permanen di dalam suatu program, Anda perlu menyimpannya dalam suatu file. File tersebut dapat dikirim dan dibaca oleh program lainnya. Bagian ini mengenalkan pada Anda bagaimana menggunakan kelas File untuk mendapatkan watak file dan untuk menghapus dan menamai-ulang file. Bagian selanjutnya akan mengenalkan Anda bagaimana membaca/menulis data dari/ke file teks.

Gambar 9.15 Kelas File dapat digunakan untuk mendapatkan watak file dan direktori dan untuk menghapus dan menamai-ulang file


Setiap file ditempatkan pada suatu direktori dalam sistem file. Suatu nama file absolut memuat suatu file dengan direktori lengkap. Misalnya, c:\buku\Kalkulator.java adalah nama file absolut untuk file Kalkulator.java pada sistem operasi Windows. Di sini c:\buku dikatakan sebagai jalur direktori (directory path)  untuk file.

Kelas File dimaksudkan untuk menyediakan suatu abstraksi yang berhubungan dengan kompleksitas file. Kelas ini memuat metode-metode untuk mendapatkan watak file dan untuk menghapus dan menamai-ulang file, seperti ditunjukkan pada Gambar 9.15. Akan tetapi, kelas File tidak memuat metode-metode untuk membaca dan menulis isi file.

Nama file adalah suatu string. Sebagai contoh, new File(“c:\\buku”) menciptakan suatu objek File untuk direktor c:\\buku, dan new File(“c:\\buku\\test.data”) menciptakan suatu objek File untuk direktor c:\\buku\\test.data, keduanya pada sistem Windows. Anda bisa menggunakan isDirectory() dari kelas File untuk memeriksa apakah suatu objek merepresentasikan suatu direktori, dan metode isFile() untuk memeriksa apakah objek merepresentasikan suatu file.

Kode9.6 mendemonstrasikan bagaimana menciptakan suatu objek File dan menggunakan metode-metode dalam kelas File untuk mendapatkan wataknya. Program menciptakan suatu objek File untuk file yamaguchi.bmp.

Kode9.6 TestKelasFile.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class TestKelasFile {
  public static void main(String[] args) {
    java.io.File file = new java.io.File("yamaguchi.bmp");
    System.out.println("Apakah file ini ada? "+ file.exists());
    System.out.println("File memiliki " + file.length() + " byte");
    System.out.println("Dapatkah file ini dibaca? " + file.canRead());
    System.out.println("Dapatkah file ini ditulis? " + file.canWrite());
    System.out.println("Apakah ini direktori? " + file.isDirectory());
    System.out.println("Apakah ini suatu file? " + file.isFile());
    System.out.println("Apakah ini nama absolut? " + file.isAbsolute());
    System.out.println("Apakah file ini hidden? " + file.isHidden());
    System.out.println("Absolute path adalah " +
      file.getAbsolutePath());
    System.out.println("Terakhir kali dimodifikasi " +
      new java.util.Date(file.lastModified()));
  }
}

Keluaran

Apakah file ini ada? true
File memiliki 589878 byte
Dapatkah file ini dibaca? true
Dapatkah file ini ditulis? true
Apakah ini direktori? false
Apakah ini suatu file? true
Apakah ini nama absolut? false
Apakah file ini hidden? false
Absolute path adalah E:\BUKU SELESAI DITULIS\DRAFT BUKU PEMROGRAMAN JAVA\Kumpulan KODE JAVA\yamaguchi.bmp
Terakhir kali dimodifikasi Thu Jun 07 06:13:54 ICT 2012

Metode lastModified() mengembalikan tanggal dan waktu kapan file dimodifikasi terakhir kalinya, dihitung dalam milidetik, sejak 1 Januari 1970. Kelas Date digunakan untuk menampilkannya dalam format yang mudah dibaca (baris 14-15).

Gambar 9.16 Keluaran pada sistem Windows


9.7 Masukan dan Keluaran File
Suatu objek File mengenkapsulasi watak suatu file atau suatu path tetapi tidak memuat metode-metode untuk menciptakan suatu file atau untuk membaca/menulis dari/ke suatu file. Untuk melakukan operasi I/O, Anda perlu menciptakan objek menggunakan kelas-kelas I/O JAVA secara tepat. Bagian ini akan mengenalkan Anda bagaimana membaca/menulis string dan nilai numerik dari/ke suatu file teks menggunakan kelas Scanner dan kelas PrintWriter.


9.7.1 Menulis Data Menggunakan PrintWriter
Kelas java.io.PrintWriter dapat digunakan untuk menciptakan suatu file dan menulis data ke suatu file teks. Pertama, Anda harus menciptakan suatu objek PrintWriter untuk suatu file teks sebagai berikut:

PrintWriter keluaran = new PrintWriter(namafile);

Kemudian Anda bisa memanggil metode print, println, dan printf pada objek PrintWriter untuk menulis data ke suatu file. Gambar 9.17 menyimpulkan metode-metode yang sering dipakai dalam kelas PrintWriter.

Gambar 9.17 Kelas PrintWriter memuat beberapa metode untuk menulis data ke suatu file teks


Kode9.7 menyajikan suatu contoh yang menciptakan suatu instans PrintWriter dan menulis dua baris teks ke dalam file skor.txt. Setiap baris berisi nama pertama (suatu string), inisial nama tengah (suatu karakter), nama akhir (suatu string), dan skor (suatu integer).

Kode9.7 TulisData.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class TulisData {
  public static void main(String[] args) throws Exception {
    java.io.File file = new java.io.File("skor.txt");
    if (file.exists()) {
      System.out.println("File sudah ada");
      System.exit(0);
    }

    // Menciptakan suatu file
    java.io.PrintWriter keluaran = new java.io.PrintWriter(file);
   
    // Menulis keluaran terformat ke dalam file
    output.print("Rismon H Sianipar ");
    output.println(90);
    output.print("Rebecca V Siahaan ");
    output.println(85);
   
    // Menutup file
    keluaran.close();
  }
}

Keluaran


Baris 3-7 memeriksa apakah file skor.txt ada atau tidak. Jika ada, program keluar (baris 6).

Memanggil konstruktor PrintWriter akan menciptakan suatu file baru jika file belum ada. Jika file sudah ada, isi file saat itu akan dibuang.

Memanggil konstruktor PrintWriter akan melempar suatu eksepsi I/O. JAVA memaksa Anda untuk menuliskan kode untuk mengatasi masalah seperti ini. Anda akan belajar penanganan eksepsi pada Bab. 13. Untuk sementara ini, Anda hanya perlu mendeklarasikan throws Exception pada header metode (baris 2).

Anda telah menggunakan metode System.out.print dan System.out.println untuk menuliskan teks kepada konsol. System.out adalah suatu objek JAVA standar untuk konsol. Anda bisa menciptakan untuk menuliskan teks ke dalam sembarang file menggunakan print, println, dan printf (baris 13-16).
Metode close() harus digunakan untuk menutup file. Jika metode ini tidak dipanggil, maka data tidak akan disimpan secara layak di dalam file.


9.7.2 Membaca Data Menggunakan Scanner
Kelas java.util.Scanner digunakan untuk membaca string dan nilai primitif dari konsol pada bagian 2.3. Suatu Scanner memecah masukan menggunakan delimiter atau pembatas karakter spasi putih. Untuk membaca dari papan ketik, Anda menciptakan suatu Scanner untuk System.in, sebagai berikut:

Scanner masukan = new Scanner(System.in);

Untuk membaca suatu file, Anda perlu menciptakan suatu Scanner untuk file, sebagai berikut:

Scanner masukan = new Scanner(new File(namafile));

Gambar 9.18 menyimpulkan beberapa metode yang paling sering digunakan dalam kelas Scanner.


Gambar 9.18 Kelas Scanner memuat beberapa metode untuk membaca data

Kode9.8 menyajikan suatu contoh yang menciptakan suatu instans dari Scanner dan membaca data dari file skor.txt.

Kode9.8 BacaData.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.Scanner;

public class BacaData {
  public static void main(String[] args) throws Exception {
    // Menciptakan suatu instans File
    java.io.File file = new java.io.File("skor.txt");

    // Menciptakan suatu Scanner untuk file
    Scanner masukan = new Scanner(file);

    // Membaca data dari file
    while (masukan.hasNext()) {
      String namaPertama = masukan.next();
      String namaTengah = masukan.next();
      String namaAkhir = masukan.next();
      int skor = masukan.nextInt();
      System.out.println(
       namaPertama + " " + namaTengah + " " + namaAkhir + " " + skor);
    }

    // Menutup file
    masukan.close();
  }
}

Keluaran

Rismon H Sianipar 90
Rebecca V Siahaan 85

Perhatikan bahwa new Scanner(String) menciptakan suatu Scanner untuk string yang diberikan. Untuk menciptakan suatu Scanner untuk membaca data dari file, Anda harus menggunakan kelas java.io.File untuk menciptakan suatu instans File menggunakan konstruktor new File(namafile) (baris 6), dan menggunakan new Scanner(File) untuk menciptakan suatu Scanner bagi file tersebut (baris 9).

Memanggil konstruktor new Scanner(File) menyebabkan pelemparan eksepsi I/O. Jadi metode main mendeklarasikan throws Exception pada baris 4.

Setiap iterasi dalam loop while membaca nama pertama, inisial nama tengah, nama belakang, dan skor dari file teks (baris 12-19). File ini ditutup pada baris 22.


9.7.3 Bagaimana Scanner Bekerja?
Metode nextByte(), nextShort(), nextInt(), nextLong(), nextFloat(), nextDouble(), dan next() dikenal sebagai metode pembaca-token, karena semuanya membaca token yang dipisahkan oleh pembatas/delimiter. Secara default, pembatas adalah spasi putih. Anda bisa menggunakan useDelimiter-(String) untuk menetapkan pola delimiter yang baru.

Bagaimana suatu metode masukan bekerja? Suatu metode pembaca-token akan melompati setiap delimiter, kemudian membaca setiap string yang diakhiri oleh delimiter. Token secara otomatis dikonversi menjadi suatu nilai bertipe byte, short, int, long, float, atau double pada metode nextByte(), nextShort(), nextInt(), nextLong(), nextFloat(), dan nextDouble(). Untuk metode next(), tidak ada konversi yang dilakukan. Jika token tidak sesuai dengan tipe yang diharapkan, maka ekspesi runtime java.util.InputMismatchException akan dilemparkan.

Kedua metode next() dan nextLine() membaca suatu string. Metode next() membaca suatu string yang dipisahkan oleh delimiter, tetapi nextLine() membaca sebaris teks yang diakhiri dengan pemisah baris (line separator).

Metode pembaca-token tidak membaca delimiter setelah token. Jika metode nextLine() dipanggil, maka metode tersebut membaca karakter-karakter mulai dari delimiter pertama dan diakhiri dengan pemisah baris. Pemisah baris dibaca tetapi tidak menjadi bagian dari string yang dikembalikan oleh nextLine().
Seandainya diberikan suatu file teks, test.txt, memuat sebaris data

34 567

Setelah kode berikut ini dieksekusi,

Scanner masukan = new Scanner(new File("test.txt"));
int nilaiInt = masukan.nextInt();
String baris = masukan.nextLine();

nilaiInt akan memuat 34 dan baris akan memuat ‘ ‘, ‘5’, ‘6’, ‘7’.

Apa yang terjadi jika masukan dientrikan dari papan ketik? Jika dimisalkan Anda mengentrikan 34, kunci ENTER, 567, dan kunci ENTER untuk kode berikut ini:

Scanner masukan = new Scanner(System.in);
int nilaiInt = masukan.nextInt();
String baris = masukan.nextLine();

Maka Anda akan mendapati nilaiInt memuat 34 dan suatu string kosong pada baris. Kenapa? Berikut alasannya. Metode pembaca-token nextInt() membaca 34 dan berhenti setelah delimiter, pada kasus ini adalah suatu pemisah baris (kunci ENTER). Metode nextLine() mulai membaca pada saat delimiter pertama (kunci ENTER), tetapi karena kunci ENTER juga merupakan pemisah baris, maka metode ini berhenti membaca.


9.7.4 Masalah: Mengganti Teks
Dimisalkan Anda akan menulis suatu program bernama GantiTeks.java yang mengganti suatu string di dalam file teks dengan suatu string baru. Nama file dan kedua string dilewatkan sebagai argumen command line sebagai berikut:

java GantiTeks fileSumber fileTarget stringLama stringBaru

Misalnya, memanggil

java GantiTeks FormatString.java t.txt StringBuilder StringBuffer

akan mengganti semua kemunculan StringBuilder dengan StringBuffer di dalam file FormatString.java dan menyimpan hasilnya pada file baru, t.txt.

Kode9.9 memberikan solusi terhadap masalah ini. Program memeriksa jumlah argumen yang dilewatkan kepada metode main (baris 7-11), memeriksa apakah file sumber dan file target sudah ada atau tidak (baris 14-25), menciptakan suatu Scanner untuk file sumber (baris 28), menciptakan suatu PrintWriter untuk file target, dan secara berulang membaca sebaris teks dari file sumber (baris 32), mengganti teks (baris 33), dan menulis teks baru satu baris ke dalam file target (baris 34). Anda harus menutup file (baris 38) untuk memastikan bahwa data akan disimpan secara benar.

Kode9.9 GantiTeks.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import java.io.*;
import java.util.*;

public class GantiTeks {
  public static void main(String[] args) throws Exception {
    // Memeriksa parameter command-line
    if (args.length != 4) {
      System.out.println(
      "Usage: java GantiTeks fileSumber fileTarget stringLama stringBaru");
      System.exit(0);
    }

    // Memeriksa apakah file sumber sudah ada
    File fileSumber = new File(args[0]);
    if(!fileSumber.exists()) {
      System.out.println("File Sumber " + args[0] + " belum ada");
      System.exit(0);
    }

    // Memeriksa apakah file target sudah ada
    File fileTarget = new File(args[1]);
    if(fileTarget.exists()) {
      System.out.println("File target " + args[1] + " belum ada");
      System.exit(0);
    }

    // Menciptakan Scanner untuk masukan dan PrintWriter untuk keluaran
    Scanner masukan = new Scanner(fileSumber);
    PrintWriter keluaran = new PrintWriter(fileTarget);

    while(masukan.hasNext()) {
      String s1 = masukan.nextLine();
      String s2 = s1.replaceAll(args[2], args[3]);
      keluaran.println(s2);
    }

    masukan.close();
    keluaran.close();
  }
}


9.8 Dialog File (GUI) 
JAVA menyediakan kelas java.swing.JFileChooser untuk menampilkan suatu dialog file, seperti yang ditampilkan pada Gambar 9.19. Dari kotak dialog ini, pengguna dapat memilih suatu file.

Kode9.10 menyajikan suatu program yang meminta pengguna untuk memilih suatu file dan menampilkan isinya. pada konsol.

Kode9.10 BacaFileMenggunakanJFileChooser.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.util.Scanner;
import javax.swing.JFileChooser;

public class BacaFileMenggunakanJFileChooser {
  public static void main(String[] args) throws Exception {
    JFileChooser pemilihFile = new JFileChooser();
    if (pemilihFile.showOpenDialog(null)
    == JFileChooser.APPROVE_OPTION) {
      // Mendapatkan file yang dipilih
      java.io.File file = pemilihFile.getSelectedFile();

      // Menciptakan suatu Scanner untuk the file
      Scanner masukan = new Scanner(file);

     // Membaca teks dari file
     while (masukan.hasNext()) {
       System.out.println(masukan.nextLine());
     }

     // Menutup file
     masukan.close();
    }
    else {
      System.out.println("Tidak ada file yang dipilih");
    }
  }
}


Gambar 9.19 JFileChooser dapat digunakan untuk menampilkan suatu dialog file untuk membuka file.

Program menciptakan suatu JFileChoose pada baris 6. Metode showOpenDialog(null) menampilkan suatu kotak dialog, seperti yang ditunjukkan pada Gambar 9.19. Metode mengembalikan suatu nilai int, APPROVE_OPTION atau CANCEL_OPTION, yang mengindikasikan apakah tombol Open atau tombol Cancel yang ditekan.

Metode getSelectedFile() (baris 10) mengembalikan file yang dipilih dari kotak dialog file. Baris 13 menciptakan suatu Scanner untuk file tersebut. Program secara berulang membaca baris demi baris dari file dan menampilkannya pada konsol (baris 16-18).

1 comment:

  1. Buat program yang mengambil array karakter yang berisi string sebagai argumen dan mencetak
    string dari belakang. Gunakan metode String toCharArray, yang tidak memerlukan argumen, untuk
    mendapatkan array char yang berisi karakter dalam String. Masukan adalah sebuah string.
    a. dengan metode recursive stringReverse
    b. dengan iterasi

    tolong bantuannya kak, terimakasih

    ReplyDelete