Posts Tagged ‘ Java IO

[Java] การใช้งาน Batch Updates/Insert

มีงานที่ต้องอ่านข้อมูลขนาดใหญ่จาก text file(ประมาณไฟล์ละ 800M) แล้วทำการบันทึกลงฐานข้อมูล ซึ่งต้องใช้เวลามาก นอกจากวิธีนี้ก็ไม่รู้จะใช้วิธีการแบบไหนในการนำข้อมูลขนาดใหญ่(กลางๆ) แบบนี้ลงไปในฐานข้อมูลได้เพราะข้อมูลที่จัดเก็บนั้นต้องตรวจสอบว่าตรงตามเงื่อนไขหรือไม่ ก่อนทำการบันทึก ทดลองใช้ insert แบบธรรมดาสามัญสุดๆ แล้วก็พบว่าแทบตายครับช้ามาก กว่าจะอ่านเสร็จแต่ละไฟล์ และ บันทึกข้อมูลเสร็จ เลยทดลองมาใช้ Batch Update/Insert แทน ซึ่งเร็วกว่าเดิมมาก แต่มาติดปัญหาตรง
1. เวลาข้อมูลซ้ำกับที่ Insert ไปแล้วก็ไม่ต้องสนใจ ข้ามไปยังรายการถัดไปเลย แต่ Batch Update ทำไมไ่ด้ครับ เช่น เราเคยบันทึกข้อมูล

1001
1002 

ไปแล้ว เมื่อต้องบันทึกข้อมูลดังกล่าวซ้ำไปอีก แต่เป็น

1003 
1001 
1004

รายการ 1003 ลงได้ปกติ 1001 จะเกิด Exception ทำให้รายการ 1004 ไม่ลงไปด้วย ผมก็ลองสรรหาวิธีทำให้ Batch Insert ทำรายการต่อไปถึงแม้จะเกิด Exception ลองอ่านเอกสารของ executeBatch() ได้ใจความว่า

If one of the commands in a batch update fails to execute properly, this method throws a BatchUpdateException, and a JDBC driver may or may not continue to process the remaining commands in the batch. However, the driver’s behavior must be consistent with a particular DBMS, either always continuing to process commands or never continuing to process commands……

จากนั้นไปทดลองใช้ Class ของ Oracle เองก็ไม่ได้เหมือนกัน หมดหวังกันที่เดียวเลย สุดถ้ายก็กลับไปตายด้วยวิธีเดิม

หมายเหตุ : จากงานนี้ทำให้รู้ว่า เวลาจะประมวลผลอะไรใหญ่ๆ หนักๆ ควรจะรัน Java ใน Server Mode และกำหนดหน่วยความจำเพิ่มขึ้นเช่น

java -server -Xms512m -Xmx1024m com/fun4station/BatchExecute

แหล่งข้อมูล
java – the Java application launcher
Performance Extensions
Java HotSpot VM Options
Batch Updates
Statement

[java]เขียนภาษาไทยลง Text File

สืบเนื่องจากหัวข้อก่อนหน้านี้ [อ่านข้อมูลภาษาไทยจาก Text File] พอจะเขียนข้อมูลลง Text file ก็ไม่ถูกต้องอีก ประยุกต์ข้อมูลในการ Encode จากตัวอย่างก่อนหน้านี้ เขียนเป็น

/**
 * File Name : WriteUTF8Data.java
 * Created Date : Jul 27, 2010 : 13:11:19 PM
 */
package com.fun4station.example;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;

public class WriteUTF8Data {
	private static final String FILE_ENCODE = "UTF-8";
	
	public static void main(String[] args) {
		String file = "D:/data/thai.txt";
		String data = "";
		try {
			Writer out = new BufferedWriter(
					new OutputStreamWriter(new FileOutputStream(file), FILE_ENCODE));
			out.write(data);
			out.close();
			out = null;
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

แล้วก้แก้ปัญหาได้อีกครั้ง จบงานไปอีกหนึ่ง

[java] อ่านข้อมูลภาษาไทยจาก Text File

มีปัญหาในการอ่านข้อมูลภาษาไทยจาก Text file อ่านมาแล้ว เป็น “??” จากการขอความช่วยเหลือ อ.google ได้ตัวอย่างมาดังนี้

/**
 * File Name : ReadUTF8Data.java
 * Created Date : Jul 27, 2010 : 09:37:17 AM
 */
package com.fun4station.example;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class ReadUTF8Data {
	private static final String FILE_ENCODE = "UTF-8";
	
	public static void main(String[] args) {
		String data = null;
		BufferedReader dataIns = null;
		String file = "";
		try {
			dataIns = new BufferedReader(new InputStreamReader(
					new FileInputStream(file), FILE_ENCODE));
			
			while ((data = dataIns.readLine()) != null) {
				System.out.println("Line 1 :" + data);
			}
			dataIns.close();
			dataIns = null;
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

ซึ่งสามารถใช้ได้ดี ไม่มีปัญหา

Java : ลบ directory

ปัญหาอย่างหนึ่งในภาษา Java(หรือเป็นทุกภาษาก็ไม่รู้) ก็คือไม่สามารถลบ directory ที่ต้องการได้ถ้ายังไม่ได้ลบไฟล์ภายในออกให้หมด ดังนั้นถ้าต้องการลบ directory ต้องทำการลบไฟล์ออกให้หมดก่อน ดังนี้

/**
 * File Name : DeleteDir.java
 * Created Date : Mar 29, 2010 : 9:34:33 AM
 */
package com.fun4station.example;
import java.io.File;

/**
 * @Author Supot Saelao 
 * @Version 1.0
 */
public class DeleteDir {

	public static void main(String[] args) {
		deleteDir(new File("/usr/tmp"));
	}

	private static void deleteDir(File dir) {
	    if (dir.isDirectory()) {
	        String[] subDirs = dir.list();
			for (int i = 0; i < subDirs.length; i++) {
				//Call Recursive for delete sub dirs
	           deleteDir(new File(dir, subDirs[i]));
	        }
	    }
	    //Delete main dir
		dir.delete();
	}
}

อ้างอิง & ลอกมาจาก
Deleting a Directory
Recursion

Move File

ตัวอย่าง code การ ย้ายไฟล์

/**
 * File Name : MoveFile.java
 * Created Date : Nov 12, 2009 : 10:39:43 AM
 * Copyright © 2009 www.fun4station.com
 */
package com.fun4station.example;

import java.io.File;

/**
 * @Author Supot Saelao 
 * @Version 1.0
 */
public class MoveFile {

	public static void main(String[] args) {
		File file = new File("fileMove.txt");
		File dir = new File("C:/data");
		
		//If want to change new file name
		String newFileName = file.getName();
		
		if(file.renameTo(new File(dir, newFileName))){
			System.out.println("Move file success....");
		}else{
			System.out.println("Move file fail....");
		}
	}

}

ข้อมูลจาก
Moving a File or Directory to Another Directory