Rss

13 thg 9, 2015

Input/Ouput trong Java


1.1 Khái niệm

Luồng đơn giản là một lộ trình mà dữ liệu sẽ di chuyển giữa chương trình và các thiết bị nhập xuất, nó là một sự biểu diễn trừu tượng (cấu trúc dữ liệu, lớp) để dữ liệu có thể trao đổi giữa chương trình và các thiết bị vật lý. 

Trong java, luồng được thiết kế thành nhiều lớp những tất cả chúng được dẫn xuất ra từ hai lớp trừu tượng đó là InputStream và OutputStream trong gói java.io. Có hai loại luồng trong java đó là luồng ký tự và luồng bytes. Tất cả các task liên quan đến các lớp nhập xuất trong java nếu có lỗi sẽ quăng ra một IOException.

1.2 Những lớp Ouput stream

OutputStream là lớp trừu tượng và cơ bản nhất để tất cả các lớp xử lý luồng xuất byte kế thừa.Nó có 3 phương thức chính là:
  • write ghi những byte dữ liệu tới luồng xuất
  • flush xả luồng để tất cả các vùng nhớ (buffer) của luồng trong trạng thái trống sẵn sàng cho việc ghi
  • close đóng luồng xuất và giải phóng tất cả tài nguyên hệ thống liên quan đến luồng xuất này
ByteArrayOutputStream là một lớp kế thừa từ lớp OutputStream, nó được dùng để ghi dữ liệu trong một mảng byte, vùng nhớ (buffer) dữ liệu sẽ tự động tăng khi chúng ta ghi dữ liệu vào.


Một số hàm căn bản của lớp này:
  • toByteArray lấy dữ liệu từ stream trong một mảng byte
  • toString lấy dữ liệu từ stream trong một chuỗi
  • size lấy kích của buffer hiện tại trong stream
  • reset chuyển buffer về trạng thái rỗng (count=0).
  • writeTo ghi dữ liệu tới một stream khác
FileOutputStream là lớp kế thừa từ lớp OutputStream, được dùng để ghi dữ liệu tới tập tin.
Ví dụ:
public static void main(String[] args) throws IOException {ByteArrayOutputStream f = new ByteArrayOutputStream();String s = "ByteArrayOutputStream";byte buf[] = s.getBytes(); //get byte array from string
f.write(buf); //write data to streamSystem.out.println(f.toString()); //get data from stream and print to screen
byte[] b = f.toByteArray(); //get data in byte arrayfor (int i = 0; i < b.length; i++) {System.out.print((char) b);//print characters to screen}
OutputStream f2 = new FileOutputStream("output.txt");//create a FileOutputStreamf.writeTo(f2); //write data to other stream
f2.close(); //close streamf.close(); //close stream}

Kết quả: 
ByteArrayOutputStream
ByteArrayOutputStream
Và một tập tin là “output.txt” được tạo ra trong thư mục project với nội dung ByteArrayOutputStream
BufferedOutputStream kế thừa từ lớp FilterOutputStream, nó dùng để hỗ trợ việc ghi dữ liệu trong vùng đệm nhằm cải tiến performance khi ghi dữ liệu.
DataOutputStream giúp ứng dụng ghi những kiểu dữ liệu cơ bản (primitive types) như boolean, int, float,… tới stream. Lớp này sinh ra nhằm giúp dễ dàng hơn trong việc ghi dữ liệu có nhiều kiểu như số nguyên, số thực, ký tự…

1.3 Những lớp Input stream

InputStream là một lớp trừu tượng dùng để các lớp xử lý nhập byte dữ liệu kế thừa. InputStream có các hàm sau:
  •  available trả về số lượng byte có thể được đọc từ inputStream này
  • read đọc byte dữ liệu kế tiếp từ input stream
  • mark đánh dấu vị trí hiện tại trong input stream
  • skip không đọc n byte dữ liệu từ input stream
  • reset khởi động lại việc đọc từ vị trí trong phương thức mark
  • close đóng input stream là giải phóng toàn bộ tài nguyên hệ thống liên quan đến stream này
ByteArrayInputStream là lớp dùng để chứa những byte có thể được đọc bởi các stream khác, chúng ta có thể đọc từng ký tự hoặc nhiều ký tự từ stream này. Còn nếu đọc từ ByteArrayOutputStream chúng ta chỉ có thể lấy ra một mảng byte.
FileInputStream dùng để đọc byte dữ liệu từ một tập tin trong ổ đĩa.
Ví dụ đọc một file tên là “output.txt” trong cùng thư mục project, đọc lần lượt từng ký tự cho đến khi hết file.
public static void main(String[] args) throws IOException {File file = new File("output.txt");StringBuffer strContent = new StringBuffer("");int character;
try {FileInputStream f = new FileInputStream(file);
/*read byte until finish file*/while( (character = f.read()) != -1) {strContent.append((char)character);}
f.close();} catch (FileNotFoundException e) {System.out.println("File " + file.getAbsolutePath() + " could not be found on FileSystem");} catch (IOException e) {System.out.println("Error during read file " + e);}
System.out.println("content of file: " + strContent);}
Kết quả là in ra nội dung file, ví dụ: content of file: ByteArrayOutputStream

BufferedInputStream là một lớp kế thừa từ lớp FilterInputStream, nó dùng để hỗ trợ việc đọc dữ liệu trong vùng đệm nhằm cải tiến performance khi đọc dữ liệu.
DataInputStream là lớp kế thừa từ filterInputStream, nó giúp ứng dụng đọc dữ liệu có kiểu là các kiểu nguyên thủy (primitive types) như int, float, boolean, …

1.4 Những lớp Reader và Writer

Những lớp thuộc nhóm Reader và Writer dùng để giúp việc nhập xuất các luồng ký tự (character) giữa ứng dụng và các thiết bị vật lý.
  • Các lớp Reader: Reader, BufferedReader, CharArrayReader, FilterReader, InputStreamReader, StringReader, PipedReader, FileReader, LineNumberReader, PushBackReader
  • Các lớp Writer: Writer, BufferedWriter, CharArrayWriter, FilterWriter, OutputStreamWriter, FileWriter, PipedWriter, PrinterWriter, StringWriter, File, RandomAccessFile, FileDescriptor, FilePermission, StreamTokenizer
Reader và Writer là hai lớp trừu tượng được dùng để các lớp nhập xuất luồng ký tự kế thừa. Reader cho việc đọc, còn Writer cho việc ghi.

Reader có các phương thức:
read đọc dữ liệu từ luồng (có thể đọc một ký tự, nhiều ký tự, hoặc đọc tất cả các ký tự) ready kiểm tra luồng đã sẵng sàng cho việc đọcmark đánh dấu skip hủy bỏ đọc các ký tựreset reset lại luồng
Writer có các phương thức
append chèn thêm ký tự hoặc chuỗi ký tự vào luồngwrite ghi dữ liệu vào luồngflush xóa dữ liệu trong luồng, đưa các buffer về trạng thái trống sẵn sàng cho việc ghi dữ liệuclose đóng luồng
Ví dụ đọc một lần cả file dùng BufferedReader rồi in ra màn hình như sau:
File file = new File("output.txt");BufferedReader br = new BufferedReader(new FileReader(file));String str;
while ((str = br.readLine()) != null) {System.out.println(str);}
br.close();

Ví dụ ghi 2 chuỗi vào file với mỗi chuỗi nằm trên những dòng mới.
String str = "Nguyen Anh Kien";String str1 = "Luvina software JSC, 1001 Hoang Quoc Viet, Cau Giay, Ha Noi";
File file = new File("output.txt");BufferedWriter fw = new BufferedWriter(new FileWriter(file));
fw.write(str);fw.newLine();fw.write(str1);fw.close();
Kết quả file output.txt là:
Nguyen Anh KienLuvina software JSC, 1001 Hoang Quoc Viet, Cau Giay, Ha Noi

1.5 Thao tác với tập tin và thư mục

File (java.io.File) là lớp giúp ứng dụng java thao tác với tập tin và thư mục trong hệ thống. Một số hàm của lớp này như:
isFile kiểm tra đúng là tập tin hay không? (giúp phân biệt tập tin và thư mục)isDirectory kiểm tra phải thư mụcexists kiểm tra tập tin hay thư mục có tồn tạicanRead kiểm tra quyền đọc của tập tin hay thư mụccanWrite kiểm tra có quyền ghi khôngsetReadable cài đặt quyền đọc cho tập tin hoặc thư mụcsetWritable cài đặt quyền ghi cho tập tin hoặc thư mụcmkdir tạo một thư mục tại đường dẫn đórenameTo đổi tên tập tin hay thư mụcdelete xóa tập tin hoặc thư mục createNewFile tạo tập tin
Ví dụ: Đọc thư mục document rồi in ra kết quả đường dẫn của các file
File myDocumentFolder = new File("C:/Documents and Settings/nguyenanhkien/My Documents");
if(myDocumentFolder.exists() && myDocumentFolder.isDirectory() && myDocumentFolder.canRead()) {File[] files = myDocumentFolder.listFiles();for(File f : files) {System.out.println(f);}}
Kết quả:
C:\Documents and Settings\nguyenanhkien\My Documents\Default.rdpC:\Documents and Settings\nguyenanhkien\My Documents\desktop.iniC:\Documents and Settings\nguyenanhkien\My Documents\DownloadsC:\Documents and Settings\nguyenanhkien\My Documents\My Chat LogsC:\Documents and Settings\nguyenanhkien\My Documents\My MusicC:\Documents and Settings\nguyenanhkien\My Documents\My PicturesC:\Documents and Settings\nguyenanhkien\My Documents\My Received FilesC:\Documents and Settings\nguyenanhkien\My Documents\tmp
Nguồn: congdongjava.com - Theo bloger: nguyenanhkien :smug 2:

0 nhận xét:

Đăng nhận xét

Được tạo bởi Blogger.