Lập trình Kotlin - Xử lý Text File
Xử lý Text File trong Kotlin
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.
Để 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:
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"
}
}
Bây giờ ta sẽ viết Lớp để lưu danh sách Sản phẩm như sau (Lớp TextFileFactory):
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 {
/**
* @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
}
}
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:
/**
* 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")
}
}
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é:
fun main(args: Array) {
var data:MutableList = TextFileFactory().DocFile("d:/dulieusanpham.txt")
for (sp in data)
println(sp)
}
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
hư 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.