Các chương trình của Java sử dụng mã Unicode để biểu diễn cho tập các ký tự.
Nhưng trong các chương trình ứng dụng của bạn chạy trên những máy khác nhau, có thể sử dụng những mã khác nhau, ví dụ như mã ASCII, chẳng hạn. Phần lớn những tập mã đó chỉ là tập con của Unicode.
Java cung cấp các lớp trừu tượng Reader, Writer làm sở để mở rộng thành các lớp con làm nhiệm vụ đọc, ghi các ký tự của Unicode.
Lớp Reader sử dụng những hàm sau để đọc các ký tự Unicode:
int read() throws IOException
int read(char cbuf[]) throws IOException
int read(char cbuf[], int off, int len) throws IOException
Đọc các ký tự Unicode có mã trong khoảng 0 - 65535 (0x0000 - 0xFFFF). Các hàm này nhận trị -1 khi ở cuối tệp.
long skip(long n) throws IOException Chuyển đầu đọc đi n ký tự.
Lớp Writer sử dụng những hàm sau để ghi các ký tự Unicode:
void write(int c) throws IOException
Ghi lên tệp 16 bit thấp của giá trị c kiểu int (32 bit).
void write(char cbuf[]) throws IOException
void write(char cbuf[], int off, int len) throws IOException void write(String str, int off, int len) throws IOException void write(String str) throws IOException
Ghi các ký tự từ mảng các ký tự hay xâu ký tự lên tệp. Ghi các tệp văn bản
Khi viết văn bản (text) vào tệp mà sử dụng các mã ký tự mặc định, chúng ta có thể sử dụng một trong các cách sau:
Khởi tạo đối tượng của PrintWriter dựa trên OutputStreamWriter và được kết nối với FileOutputStream: Tạo ra đối tượng của FileOutputStream có tên tệp “info.txt”:
Tạo ra đối tượng PrintWriter để liên kết với outStream:
PrintWriter printWriter = new PrintWriter(outStream, true).
Khởi tạo PrintWriter dựa trên FileOutputStream:Tạo ra đối tượng của FileOutputStream:
FileOutputStream outFile = new FileOutputStream(“info.txt”);
Tạo ra đối tượng của PrintWriter để kết nối với outFile:
PrintWriter printWriter = new PrintWriter(outFile, true).
Khởi tạo đối tượng của PrintWriter dựa trên lớp con của
OutputStreamWriter:
Tạo ra đối tượng của FileWriter, lớp con của OutputStreamWriter: FileWriter fileWriter = new FileWriter(“info.txt”);
Tạo ra đối tượng PrintWriter để liên kết với fileWriter:
PrintWriter printWriter = new PrintWriter(fileWriter, true).
Khi đọc văn bản (text) từ tệp mà sử dụng các mã ký tự mặc định, chúng ta có thể sử dụng một trong các cách sau: Khởi tạo đối tượng của InputStreamReader để kết nối với FileInputStream: Tạo ra đối tượng của FileInputStream có tên tệp “info.txt”:
FileOutputStream inFile = new FileOutputStream(“info.txt”);
Tạo ra đối tượng của InputStreamReader để liên kết với outFile:
InputStreamReader reader = new InputStreamReader (inFile);
Khởi tạo đối tượng của FileReader dựa trên lớp con của InputStreamReader: Tạo ra đối tượng của FileReader, lớp con của OutputStreamWriter:
FileReader fileReader = new FileReader(“info.txt”);
Ví dụ 8.3 Sử dụng các lớp Reader và Writer để đọc, ghi các ký tự theo các mã chuẩn.
import java.io.*;
public class CharEncodingDemo { public static void main(String args[])
throws IOException, NumberFormatException {
// Ghi lên tệp các ký tự theo mã chuẩn ISO8859_1.
FileOutputStream outputFile = new
FileOutputStream("info.txt");
OutputStreamWriter writer = new
OutputStreamWriter(outputFile,"8859_1");
BufferedWriter bufferedWriter1 = new BufferedWriter(writer); PrintWriter printWriter = new PrintWriter(bufferedWriter1, true) ;
System.out.println("Ghi len tep theo ma chuan:" + writer.getEncoding());
// Ghi các giá trị nguyên thủy lên tệp theo từng dong ; (2) printWriter.println(true); printWriter.println('A'); printWriter.println(Byte.MAX_VALUE); printWriter.println(Short.MIN_VALUE); printWriter.println(Integer.MAX_VALUE); printWriter.println(Long.MIN_VALUE); printWriter.println(Float.MAX_VALUE); printWriter.println(Math.PI); // Đóng tệp (3)
printWriter.close();
// Tạo ra đối tượng của BufferedReader sử dụng mã ISO8859_1 (4)
FileInputStream inputFile = new FileInputStream("info.txt");
InputStreamReader reader=new
InputStreamReader(inputFile,"8859_1");
BufferedReader bufferedReader = new BufferedReader(reader);
System.out.println("Doc theo ma chuan:" + reader.getEncoding());
// Đọc ra các giá trị nguyên thủy từ tệp (5)
boolean v = bufferedReader.readLine().equals("true")? true : false; char c = bufferedReader.readLine().charAt(0); byte b = (byte)Integer.parseInt(bufferedReader.readLine()); short s = (short)Integer.parseInt(bufferedReader.readLine()); int i = Integer.parseInt(bufferedReader.readLine()); long l = Long.parseLong(bufferedReader.readLine()); float f = Float.parseFloat(bufferedReader.readLine()); double d = Double.parseDouble(bufferedReader.readLine()); // Đóng tệp mở ra để đọc bufferedReader.close(); // Hiển thị các giá trị ra màn hình
System.out.println("Cac gia tri duoc doc ra:"); System.out.println(v); System.out.println(c); System.out.println(b); System.out.println(s); System.out.println(i); System.out.println(l); System.out.println(f); System.out.println(d); } }
Vào / ra trên các thiết bị chuẩn
Thiết bị chuẩn để đưa dữ liệu ra là màn hình thường được thực hiện bởi đối tượng System.out của PrintStream.
Thiết bị chuẩn để nhập dữ liệu vào là bàn phím và thường được thực hiện bởi đối tượng System.in của InputStream. Các lỗi chuẩn vào/ra có thể sử dụng đối tượng System.err của lớp PrintStream để xử lý.
Để đọc và chuyển các ký tự về các giá trị tương ứng một cách chính xác và hiệu quả thì đối tượng System.in phải được kết hợp với InputStreamReader thông qua buffer:
InputStreamReader inStream = new InputStreamReader(System.in); BufferedReader stdInStream = new
Ngoài ra Java còn cung cấp lớp java.text.NumberFormat để xử lý các dữ liệu theo các format của từng vùng, như java.util.Local.US - theo format dữ liệu địa phương của Mỹ.
Ví dụ 8.4 Viết chương trình nhập dữ liệu vào từ bàn phím và hiển thị lên màn hình theo format của Mỹ (Local.US).
import java.io.*; import java.text.*; import java.util.*;
// Xây dựng lớp để nhập dữ liệu từ bàn phím và hiển thị chúng lên màn hình
public final class Stdin {
// Tạo ra đối tượng của BufferedReader kết nối với InputStreamReader
private static BufferedReader reader = new BufferedReader( // (1)
new InputStreamReader(System.in));
// Đọc vào một dòng và kết quả nhận được là xâu public static String readline() {
while(true) try { return reader.readLine(); } catch(IOException ioe) { reportError(ioe); } } // Đọc vào một số nguyên public static int readInteger() {
while(true) try { return Integer.parseInt(reader.readLine()); } catch(IOException ioe) { reportError(ioe); } catch(NumberFormatException nfe) { reportError(nfe); } } // Đọc vào một số double
public static double readDouble() { while(true) try { return Double.parseDouble(reader.readLine()); } catch(IOException ioe) { reportError(ioe); } catch(NumberFormatException nfe){ reportError(nfe); } }
// Hiển thị một thông báo lỗi
private static void reportError(Exception e) { System.err.println("Loi nhap du lieu:" + e); System.err.println("Hay nhap lai du lieu!"); }
// Chương trình chính
public static void main(String args[]) {
System.out.print("Nhap vao mot xau: "); String str = Stdin.readline();
System.out.print("Nhao vao so nguyen:"); int i = Stdin.readInteger();
System.out.print("Nhap vao so double:"); double d = Stdin.readDouble();
// Tạo ra format để hiển thị theo qui định của Mỹ (java.util.Local.US) NumberFormat formatter = NumberFormat.getInstance(Locale.US); System.out.println("Data read:"); System.out.println(str); System.out.println(formatter.format(i)); System.out.println(formatter.format(d)); } }
Chương IX: Kết nối các cơ sở dữ liệu với JDBC và lập trình trên mạng
Nội dung:
Tổng quan về kết nối CSDL với ODBC và JDBC; Xây dựng ứng dụng dựa trên JDBC;
Phương pháp lập trình trên mạng và đa luồng; Các lớp Sockets của Java và các ứng dụng.