Bài 29-Xử lý Text File trong Kotlin

[polldaddy poll=9764234]

Trong tất cả các ngôn ngữ lập trình thì xử lý file rất quan trọng, hầu như ta phải gặp trong các dự án. Tui sẽ trình bày chuỗi 4 bài xử lý file: Text File, Serialize File, XML File, JSon File để các bạn có nhiều lựa chọn trong quá trình xử lý tập tin.

Tại sao phải lưu trữ dữ liệu? Như chúng ta đã biết trong kiến trúc máy tính, một chương trình muốn hoạt động thì mọi tài nguyên phải được nạp lên bộ nhớ, cụ thể là trên thanh RAM. Mà nguyên lý của RAM là bộ nhớ tạm, khi tắt phần mềm, tắt máy… thì dữ liệu trong bộ nhớ sẽ không còn nữa. Giả sử chúng ta đang nhập liệu 100 Sản phẩm thì tự nhiên cúp điện, nếu không có cơ chế lưu dữ liệu từ bộ nhớ RAM xuống ổ cứng thì sẽ mất toàn bộ dữ liệu.

Text File là cách lưu trữ dữ liệu dạng thô, ta có thể mở tập tin lên xem cấu trúc, nội dung và chỉnh sửa được.

Kotlin dùng các thư viện JVM để tương tác File nên nó giống y xì như Java, từ Kotlin ta sẽ triệu gọi các thư viện Java. Do đó để bổ trợ tốt cho Kotlin thì các bạn nên đăng ký tham gia học Java trước.

Để lưu và đọc Text File, tương tự như Java thì Kotlin sẽ phải import các thư viện sau:

import java.io.BufferedWriter
import java.io.OutputStreamWriter
import java.io.FileOutputStream
import java.io.BufferedReader
import java.io.InputStreamReader
import java.io.FileInputStream

Giả sử ta có một cấu trúc dữ liệu (class) Sản phẩm như sau:

[code language=”groovy”]

/**
* Created by cafe on 02/06/2017.
*/
class SanPham {
var ma:Int=0
var ten:String=””
var donGia:Double=0.0
constructor()
constructor(ma: Int, ten: String, donGia: Double) {
this.ma = ma
this.ten = ten
this.donGia = donGia
}
override fun toString(): String {
return “$ma\t$ten\t$donGia”
}
}

[/code]

Bây giờ ta sẽ viết Lớp để lưu danh sách Sản phẩm như sau (Lớp TextFileFactory):

[code language=”groovy”]

import java.io.BufferedWriter
import java.io.OutputStreamWriter
import java.io.FileOutputStream
import java.io.BufferedReader
import java.io.InputStreamReader
import java.io.FileInputStream

/**
* Created by cafe on 02/06/2017.
*/
class TextFileFactory {
/**
* @author Trần Duy Thanh
* @param data: Dữ liệu là Danh sách sản phẩm muốn lưu
* @param path: Đường dẫn lưu trữ
* @return true nếu lưu thành công, false nếu lưu thất bại
*/
fun LuuFile(data:MutableList,path:String):Boolean
{
try {
val fos = FileOutputStream(path)
val osw = OutputStreamWriter(fos, “UTF-8”)
val bw = BufferedWriter(osw)
for (sp in data) {
bw.write(sp.toString());
bw.newLine();
}
bw.close();
osw.close();
fos.close();
return true
}
catch (ex:Exception)
{
ex.printStackTrace()
}
return false
}

/**
* @author Trần Duy Thanh
* @param path:đường dẫn muốn đọc dữ liệu
* @return Danh sách sản phẩm MutableList
*/
fun DocFile(path:String):MutableList
{
var data:MutableList = mutableListOf()
try {
val fis = FileInputStream(path)
val isr = InputStreamReader(fis, “UTF-8”)
val br = BufferedReader(isr)

var line = br.readLine()
while (line != null) {
var arr = line.split(“\t”)
if (arr.size == 3) {
var sp: SanPham = SanPham()
sp.ma = arr[0].toInt()
sp.ten = arr[1]
sp.donGia = arr[2].toDouble()
data.add(sp)
}
line = br.readLine()
}
br.close()
isr.close()
fis.close()
}
catch (ex:Exception)
{
ex.printStackTrace()
}
return data
}
}

[/code]

Bây giờ ta tạo hàm main trong tập tin app_test_textfile.kt để test lưu và đọc danh sách Sản phẩm dạng Text File:

[code language=”groovy”]

/**
* Created by cafe on 02/06/2017.
*/
fun main(args: Array) {
var data:MutableList = mutableListOf()
var sp1=SanPham(1,”Coca cola”,15.5)
data.add(sp1)
var sp2=SanPham(2,”Sting”,25.0)
data.add(sp2)
var sp3=SanPham(3,”Redbull”,17.0)
data.add(sp3)
var kqLuu=TextFileFactory().LuuFile(data,”d:/dulieusanpham.txt”)
if(kqLuu)
{
println(“Lưu text file thành công”)
}
else
{
println(“Lưu text file thất bại”)
}
}

[/code]

Khi chạy hàm main ở trên thì ta có kết quả sau:

Lưu text file thành công

Bây giờ ta vào ổ D xem tập tin dulieusanpham.txt có được lưu thành công hay chưa:

Rõ ràng kết quả đã lưu thành công, bây giờ ta sẽ gọi hàm đọc thông tin lên nhé:

[code language=”groovy”]

fun main(args: Array) {
var data:MutableList = TextFileFactory().DocFile(“d:/dulieusanpham.txt”)
for (sp in data)
println(sp)
}

[/code]

Khi chạy hàm main ở trên thì ta có kết quả sau:

1 Coca cola 15.5
2 Sting 25.0
3 Redbull 17.0

Như vậy ta đã lưu và đọc Text File thành công, các bạn tự áp dụng vào các dự án cụ thể nhé, Lưu cấu trúc Text File như thế nào là do quyết định của bạn, bài trên Tui lưu mỗi đối tượng là 1 dòng, và các thuộc tính ngăn cách bởi 1 dấu tab.

Các bài sau Tui sẽ trình bày về Xử lý Serialize File trong Kotlin rất quan trọng trong quá trình xử lý lưu trữ dữ liệu

Các bạn có thể tải source code bài này ở đây: http://www.mediafire.com/file/tnyg7czel2zx7oy/HocTextFile.rar

Hẹn gặp các bạn ở những bài tiếp theo

Chúc các bạn thành công!

Trần Duy Thanh (http://communityuni.com/)