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:
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:
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).
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.
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.
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");
}
}
}
|
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).
Buat program yang mengambil array karakter yang berisi string sebagai argumen dan mencetak
ReplyDeletestring 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