Lập Trình Cơ Sở Dữ Liệu Java Swing Cơ Bản – Ôn Tập 6

I. Nhập Cơ Sở Dữ Liệu


--
-- Cơ sở dữ liệu: `mybook`
--

-- --------------------------------------------------------

--
-- Cấu trúc bảng cho bảng `theloai`
--

CREATE TABLE `theloai` (
`MATL` varchar(10) NOT NULL,
`TENTL` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

II. Tạo lớp DBConnection

package laptrinhcsdl;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

public class DBConnection {

//Đối tượng connect
private Connection conn;
//Đối tượng statement
public Statement stm;

public DBConnection() throws ClassNotFoundException {
try {
//Tải driver
Class.forName("com.mysql.jdbc.Driver");
//Lấy kết nối
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mybook?useUnicode=true&characterEncoding=UTF-8","root","");
stm=conn.createStatement();

} catch (SQLException ex) {
Logger.getLogger(DBConnection.class.getName()).log(Level.SEVERE, null, ex);
}
}
}

III. Giao diện và sự kiện

Code tham khảo: (có sửa đổi)


package laptrinhcsdl;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BoxLayout;
import javax.swing.*;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.table.DefaultTableModel;

/**
*
* @author USER
*/
public class JFrameTheLoai extends JFrame implements ActionListener {

//Khai bao component
JLabel jlbMATL, jlbTENTL;

JTextField jtxtMATL, jtxtTENTL;

DefaultTableModel model;
JTable jtbTheLoai;

JButton jbtnThem, jbtnXoa, jbtnSua;

JPanel jpnTop, jpnCenter, jpnBottom, jpn1, jpn2;

DBConnection db;

public JFrameTheLoai() throws ClassNotFoundException {
super("LTCSDL");//dat ten
setSize(400, 500);
setLocationRelativeTo(null);//canh giua
setDefaultCloseOperation(EXIT_ON_CLOSE);//tac han chuong trinh
setLayout(new BorderLayout());

db = new DBConnection();

//Khoi tao component
jpnTop = new JPanel(new GridLayout(2, 1));
jpn1 = new JPanel();
jpn2 = new JPanel();
jpnCenter = new JPanel();
jpnBottom = new JPanel();

jlbMATL = new JLabel("MATL");
jlbTENTL = new JLabel("TENTL");

jtxtMATL = new JTextField(20);
jtxtTENTL = new JTextField(20);

jbtnThem = new JButton("Them");
jbtnSua = new JButton("Sua");
jbtnXoa = new JButton("Xoa");

model = new DefaultTableModel();
String[] columnsName = {"MATL", "TENTL"};
model.setColumnIdentifiers(columnsName);

LoadData();
jtbTheLoai = new JTable();
jtbTheLoai.setModel(model);

//Them conponent
jpn1.add(jlbMATL);
jpn1.add(jtxtMATL);

jpn2.add(jlbTENTL);
jpn2.add(jtxtTENTL);

jpnTop.add(jpn1);
jpnTop.add(jpn2);

add(jpnTop, BorderLayout.NORTH);
add(new JScrollPane(jtbTheLoai), BorderLayout.CENTER);
jpnBottom.add(jbtnThem);
jpnBottom.add(jbtnSua);
jpnBottom.add(jbtnXoa);

add(jpnBottom, BorderLayout.SOUTH);

//Thiet lap su kien
jbtnThem.addActionListener(this);
jbtnXoa.addActionListener(this);
jbtnSua.addActionListener(this);

jtbTheLoai.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent me) {
jtxtMATL.setText(jtbTheLoai.getValueAt(jtbTheLoai.getSelectedRow(), 0).toString());
jtxtTENTL.setText(jtbTheLoai.getValueAt(jtbTheLoai.getSelectedRow(), 1).toString());
}

});

//Hien thi
setVisible(true);

}

private void LoadData() {
model.setNumRows(0);
try {
String sql = "SELECT * FROM theloai";
ResultSet rs = db.stm.executeQuery(sql);

while (rs.next()) {
String[] row = new String[2];
row[0] = rs.getString("MATL");
row[1] = rs.getString("TENTL");
model.addRow(row);
}

} catch (SQLException ex) {
Logger.getLogger(JFrameTheLoai.class.getName()).log(Level.SEVERE, null, ex);
}
}

public static void main(String[] args) throws ClassNotFoundException {
new JFrameTheLoai();
}

@Override
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == jbtnThem) {
try {
String sql = "INSERT INTO `theloai` (`MATL`, `TENTL`) VALUES ('" + jtxtMATL.getText() + "', '" + jtxtTENTL.getText() + "')";
db.stm.executeUpdate(sql);
LoadData();
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, ex, "Error", JOptionPane.ERROR_MESSAGE);
}
} else if (ae.getSource() == jbtnXoa) {
try {
String sql = "DELETE FROM `theloai` WHERE MATL='" + jtxtMATL.getText() + "'";
db.stm.executeUpdate(sql);
LoadData();
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, ex, "Error", JOptionPane.ERROR_MESSAGE);
}

} else if (ae.getSource() == jbtnSua) {
try {
String matl= model.getValueAt(jtbTheLoai.getSelectedRow(),0).toString();
String sql="UPDATE `theloai` SET `MATL`='"+jtxtMATL.getText()+"',`TENTL`='"+jtxtTENTL.getText()+"' WHERE MATL='"+matl+"'";
db.stm.executeUpdate(sql);
LoadData();
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, ex, "Error", JOptionPane.ERROR_MESSAGE);
}

}
}

}

Advertisements

Tạo menu trong Java-Swing – Ôn Tập 5

I. Giao diện

II. Viết code


package Menu;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class FrameMenu extends JFrame implements ActionListener{
JMenuBar jmnubar;
JMenu jmnuFile;
JMenuItem jmnuiNew,jmnuiOpen,jmnuiExit;

public FrameMenu() {
setLayout(new BorderLayout());
setSize(300,400);
setDefaultCloseOperation(EXIT_ON_CLOSE);

jmnubar=new JMenuBar();

jmnuFile=new JMenu("File");

jmnuiNew=new JMenuItem("New");
jmnuiNew.setAccelerator(KeyStroke.getKeyStroke("ctrl N"));
jmnuiOpen=new JMenuItem("Open");
jmnuiOpen.setAccelerator(KeyStroke.getKeyStroke("ctrl O"));

jmnuiExit=new JMenuItem("Exit");
jmnuiExit.setAccelerator(KeyStroke.getKeyStroke("ctrl E"));



jmnuFile.add(jmnuiNew);
jmnuFile.add(jmnuiOpen);
jmnuFile.addSeparator();
jmnuFile.add(jmnuiExit);

jmnuFile.setMnemonic('F');


jmnubar.add(jmnuFile);


add(jmnubar,BorderLayout.NORTH);

jmnuiOpen.addActionListener(this);
jmnuiNew.addActionListener(this);
jmnuiExit.addActionListener(this);


setVisible(true);
}
public static void main(String[] args) {
new FrameMenu();
}

@Override
public void actionPerformed(ActionEvent ae) {
if(ae.getSource()==jmnuiOpen)
{
JOptionPane.showMessageDialog(null,"Open");
}
else if(ae.getSource()==jmnuiNew)
{
JOptionPane.showMessageDialog(null,"New");
}
else if(ae.getSource()==jmnuiExit)
{
JOptionPane.showMessageDialog(null,"Exit");
}
}
}

JRadioButton, ButtonGroup và sự kiện isSelected – Ôn Tập 4

I. Phân tích giao diện

Nhìn vào giao diện trên chúng ta thấy nó chia thành 4 dòng và chỉ có duy nhất 1 cột do đó sử dụng Gridlayout.

II. Viết code


 

package ChooseColor;

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

public class ChooseColor extends JFrame implements ActionListener{

JRadioButton jrdoRed,jrdoBlue,jrdoGreen,jrdoBlack;
ButtonGroup btnGroup;
JPanel jpnBottom;
JLabel jlbText;

public ChooseColor() {
super("Choose Color");
setLayout(new GridLayout(5,1));
setLocationRelativeTo(null);
setSize(200,250);
setDefaultCloseOperation(EXIT_ON_CLOSE);


btnGroup=new ButtonGroup();

jrdoRed=new JRadioButton("Red");
jrdoBlue=new JRadioButton("Blue");
jrdoGreen=new JRadioButton("Green");
jrdoBlack=new JRadioButton("Black");

jpnBottom=new JPanel();
jpnBottom.setBackground(Color.RED);

jlbText=new JLabel("Red is Selected");
jlbText.setForeground(Color.WHITE);

jpnBottom.add(jlbText);

//Thêm các JRadioButton vào ButtonGroup để chỉ duy nhất 1 JRadioButton được chọn
btnGroup.add(jrdoRed);
btnGroup.add(jrdoBlue);
btnGroup.add(jrdoGreen);
btnGroup.add(jrdoBlack);

add(jrdoRed);
add(jrdoBlue);
add(jrdoGreen);
add(jrdoBlack);

jrdoRed.setSelected(true);

add(jpnBottom);

jrdoRed.addActionListener(this);
jrdoBlue.addActionListener(this);
jrdoGreen.addActionListener(this);
jrdoBlack.addActionListener(this);



setVisible(true);
}
public static void main(String[] args) {
new ChooseColor();
}

@Override
public void actionPerformed(ActionEvent ae) {
if(jrdoRed.isSelected())
{
jpnBottom.setBackground(Color.RED);
jlbText.setText("Red is Selected");
}
else if(jrdoGreen.isSelected())
{
jpnBottom.setBackground(Color.GREEN);
jlbText.setText("Green is Selected");
}
else if(jrdoBlue.isSelected())
{
jpnBottom.setBackground(Color.BLUE);
jlbText.setText("Blue is Selected");
}
else
{
jpnBottom.setBackground(Color.BLACK);
jlbText.setText("Black is Selected");
}
}
}

 

Calculator đơn giản – Ôn Tập 3

I. Phân tích Layout

Nhìn vào hình trên thì chúng ta sẽ phân tích Layout như sau:

II. Viết code

Code tham khảo:



package EasyCalculator;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class Calculator extends JFrame implements ActionListener {

          JPanel jpnX, jpnY, jpnButton, jpnResult;

          JLabel jlbX, jlbY, jlbResult;
          JTextField jtxtX, jtxtY;

           JButton jbtnPlus, jbtnSub, jbtnMul, jbtnDiv;

          public Calculator() {
               super("Calculator");
               setLayout(new GridLayout(4, 1));
               setSize(400, 160);
               setLocationRelativeTo(null);
               setDefaultCloseOperation(EXIT_ON_CLOSE);

               jlbX = new JLabel(" X= ");
               jlbY = new JLabel(" Y= ");
               jlbResult = new JLabel("Result");
               jlbResult.setForeground(Color.RED);

               jtxtX = new JTextField();
               jtxtY = new JTextField();

               jbtnPlus = new JButton("+");
               jbtnSub = new JButton("-");
               jbtnMul = new JButton("*");
               jbtnDiv = new JButton("/");

               jpnX = new JPanel(new BorderLayout());
               jpnY = new JPanel(new BorderLayout());
               jpnButton = new JPanel(new GridLayout(1, 4));
               jpnResult = new JPanel(new FlowLayout());

               jpnX.add(jlbX, BorderLayout.WEST);
               jpnX.add(jtxtX, BorderLayout.CENTER);

               jpnY.add(jlbY, BorderLayout.WEST);
               jpnY.add(jtxtY, BorderLayout.CENTER);

               jpnButton.add(jbtnPlus);
               jpnButton.add(jbtnSub);
               jpnButton.add(jbtnMul);
               jpnButton.add(jbtnDiv);

               jpnResult.add(jlbResult);

               add(jpnX);
               add(jpnY);
               add(jpnButton);

               add(jpnResult);

               jbtnPlus.addActionListener(this);
               jbtnSub.addActionListener(this);
               jbtnMul.addActionListener(this);
               jbtnDiv.addActionListener(this);

               setVisible(true);
}

public static void main(String[] args) {
       new Calculator();
}

@Override
public void actionPerformed(ActionEvent ae) {
      Double rs = 0.0;
try {
      if (ae.getSource() == jbtnPlus) {
      rs = Double.parseDouble(jtxtX.getText()) + Double.parseDouble(jtxtY.getText());
      jlbResult.setText("x+y="+rs.toString());
} else if (ae.getSource() == jbtnSub) {
      rs = Double.parseDouble(jtxtX.getText()) - Double.parseDouble(jtxtY.getText());
      jlbResult.setText("x-y="+rs.toString());
} else if (ae.getSource() == jbtnMul) {
      rs = Double.parseDouble(jtxtX.getText()) * Double.parseDouble(jtxtY.getText());
      jlbResult.setText("x*y="+rs.toString());
} else if (ae.getSource() == jbtnDiv) {
      rs = Double.parseDouble(jtxtX.getText()) / Double.parseDouble(jtxtY.getText());
      jlbResult.setText("x/y="+rs.toString());
}
} catch (NumberFormatException ex) {
       jlbResult.setText("");
       JOptionPane.showMessageDialog(null, ex, "Error", JOptionPane.ERROR_MESSAGE);
}
   }

}

Java-Swing Các Loại Layout – Ôn Tập 2

I.FlowLayout

FloawLayout là layout mà nó sẽ tự động sắp xếp các control trong form theo thứ tự được thêm vào, nếu có một control trên vào thì các control đó sẽ được sắp xếp trôi ra giữa layout. FlowLayout là layout mặc định nếu không được thiết lập thuộc tính setLayout.

Code tham khảo :


package Layout;

import javax.swing.*;

public class MyFlowLayout extends JFrame{

         //Khai báo component
         JButton jbtn1,jbtn2,jbtn3;
         JPanel jpnTop;

          public MyFlowLayout() {
                  super("FlowLayout");
                  setSize(300,400);
                 //Canh form giữa màn hình
                 setLocationRelativeTo(null);
                 //Thiết lập tắt hẳn chương trình khi ấn vào nút X
                 setDefaultCloseOperation(EXIT_ON_CLOSE);

                 //Khởi tạo component
                 jbtn1=new JButton("Button 1");
                 jbtn2=new JButton("Button 2");
                 jbtn3=new JButton("Button 3");

                 jpnTop=new JPanel();

                 //Thêm component

                 jpnTop.add(jbtn1);
                 jpnTop.add(jbtn2);
                 jpnTop.add(jbtn3);

                 add(jpnTop);

                 //thiết lập hiển thị
                 setVisible(true);
}

public static void main(String[] args) {
              new MyFlowLayout();
   }
}

II.BorderLayout

BorderLayout là loại layout chia ra làm 5 phần, phần phía bắc (North), phần chính giữa (Center), phần phía nam (South), phần phía tây (West), và phần phía đông (East).

Code tham khảo :


package Layout;

import java.awt.BorderLayout;
import javax.swing.*;


public class MyBorderLayout extends JFrame{

        //Khai báo component
        JButton jbtnNorth,jbtnCenter,jbtnSouth,jbtnWest,jbtnEast;

        public MyBorderLayout() {
               super("BorderLayout");
               //Thiết lập layout
               setLayout(new BorderLayout());
               setSize(400,400);
               //Canh form giữa màn hình
               setLocationRelativeTo(null);
               //Thiết lập tắt hẳn chương trình khi ấn vào nút X
               setDefaultCloseOperation(EXIT_ON_CLOSE);

               //Khởi tạo component
               jbtnNorth=new JButton("North");
               jbtnCenter=new JButton("Center");
               jbtnSouth=new JButton("South");
               jbtnWest=new JButton("West");
               jbtnEast=new JButton("East");
               
               //Thêm component
               add(jbtnNorth,BorderLayout.NORTH);
               add(jbtnCenter,BorderLayout.CENTER);
               add(jbtnSouth,BorderLayout.SOUTH);
               add(jbtnWest,BorderLayout.WEST);
               add(jbtnEast,BorderLayout.EAST);

               //thiết lập hiển thị
              setVisible(true);
}

public static void main(String[] args) {
        new MyBorderLayout();
   }

}

III.GridLayout

GridLayout là loại layout mà chia thành các dòng và các cột hình bên dưới chia gridlayout thành 3 dòng và 3 cột.

Code tham khảo:


package Layout;

import java.awt.GridLayout;
import javax.swing.*;


public class MyGridLayout extends JFrame{

     //Khai báo component
     JButton jbtn1,jbtn2,jbtn3,jbtn4,jbtn5,jbtn6,jbtn7,jbtn8,jbtn9;

     public MyGridLayout() {
            super("GridLayout");
            //Thiết lập layout
            //Gridlayout với 3 dòng 3 cột
            setLayout(new GridLayout(3,3));
            setSize(300,400);
            //Canh form giữa màn hình
            setLocationRelativeTo(null);
            //Thiết lập tắt hẳn chương trình khi ấn vào nút X
            setDefaultCloseOperation(EXIT_ON_CLOSE);

            //Khởi tạo component
            jbtn1=new JButton("1");
            jbtn2=new JButton("2");
            jbtn3=new JButton("3");
            jbtn4=new JButton("4");
            jbtn5=new JButton("5");
            jbtn6=new JButton("6");
            jbtn7=new JButton("7");
            jbtn8=new JButton("8");
            jbtn9=new JButton("9");

            //Thêm component
            add(jbtn1);
            add(jbtn2);
            add(jbtn3);
            add(jbtn4);
            add(jbtn5);
            add(jbtn6);
            add(jbtn7);
            add(jbtn8);
            add(jbtn9);


            //thiết lập hiển thị
           setVisible(true);
}

public static void main(String[] args) {
         new MyGridLayout();
    }
}

IV. Xây dựng giao diện

Nhìn vào giao diện trên chúng ta có được phân tích như sau:

Code tham khảo:


package MicrowaveOven;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.*;


public class MicrowaveOven extends JFrame {

        //Khai báo JPanel
        JPanel jpnRight,jpnButton;

        //Khai báo Component
        JTextField jtxtTime;
        JButton jbtnFood, jbtn1, jbtn2, jbtn3, jbtn4, jbtn5, jbtn6, jbtn7, jbtn8, jbtn9, jbtn0, jbtnStart, jbtnStop;
        public MicrowaveOven() {
        //Thiết lập một số thông tin cho Frame
        super("The Front View Of A MicroWave Oven");
        setLayout(new BorderLayout());
        //Thiết lập canh giữa màn hình
        setLocationRelativeTo(null);
        setSize(370, 300);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        //Khởi tạo Component
        /*Khởi tạo JPanel*/
        jpnRight=new JPanel(new BorderLayout());
        jpnButton=new JPanel(new GridLayout(4,3));

        /*Khởi tạo JTextField*/
        jtxtTime=new JTextField("Time to be displayed here");
        /*Khởi tạo JButton*/
        jbtnFood = new JButton("Food to be placed here");
        jbtn1 = new JButton("1");
        jbtn2 = new JButton("2");
        jbtn3 = new JButton("3");
        jbtn4 = new JButton("4");
        jbtn5 = new JButton("5");
        jbtn6 = new JButton("6");
        jbtn7 = new JButton("7");
        jbtn8 = new JButton("8");
        jbtn9 = new JButton("9");
        jbtn0 = new JButton("0");
        jbtnStart = new JButton("Start");
        jbtnStop = new JButton("Stop");


        /*Thêm Conponent vào Frame*/
        jpnRight.add(jtxtTime,BorderLayout.NORTH);


        jpnButton.add(jbtn1);
        jpnButton.add(jbtn2);
        jpnButton.add(jbtn3);
        jpnButton.add(jbtn4);
        jpnButton.add(jbtn5);
        jpnButton.add(jbtn6);
        jpnButton.add(jbtn7);
        jpnButton.add(jbtn8);
        jpnButton.add(jbtn9);
        jpnButton.add(jbtn0);
        jpnButton.add(jbtnStart);
        jpnButton.add(jbtnStop);

        add(jbtnFood, BorderLayout.WEST);
        add(jpnRight, BorderLayout.CENTER);
        jpnRight.add(jtxtTime, BorderLayout.NORTH);
        jpnRight.add(jpnButton, BorderLayout.CENTER);

         setVisible(true);
}

public static void main(String[] args) {
        new MicrowaveOven();
    }
}

Nhập Xuất Và Lấy Ngày Tháng Trong Java – Ôn Tập 1

I.Nhập dữ liệu bằng BufferedReader và Scanner


package Begin;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
*
* @author PC
*/
public class IO {
public static void main(String[] args) {
String myValue;
    try {
          System.out.println("---Nhập dữ liệu từ bàn phím sử dụng BufferedReader---");
          BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
          System.out.print("Hãy nhập 1 giá trị :");
          //Giá trị nhập vào là chuỗi để ép về kiểu số thì chúng ta có thể sử dụng ép kiểu
          // int newValue=Integer.parseInt(br.readLine()); ..v..v
          myValue=br.readLine();
          System.out.println("Giá trị vừa nhập là :"+myValue);

          /*-----------------------------------------------------------------*/

          System.out.println("---Nhập dữ liệu từ bàn phím sử dụng Scanner---");
          Scanner sc=new Scanner(System.in);
          System.out.print("Hãy nhập 1 giá trị :");
          //Để xác định kiểu dữ liệu nhập vào thì chúng ta có thể sử dụng
          // myValue=sc.nextInt();
          // myValue=sc.nextDouble();
          // myValue=sc.nextFloat();
          // ..v..v
          myValue=sc.nextLine();
          System.out.print("Giá trị vừa nhập là :"+myValue);

         } catch (IOException ex) {
         JOptionPane.showMessageDialog(null,ex,"Error",JOptionPane.ERROR_MESSAGE);
      }
   }
}

II.Nhập dữ liệu bằng JOptionPane


String myValue=JOptionPane.showInputDialog("Input");
System.out.print("Giá trị vừa nhập là :"+myValue);

Kết quả là một hộp thoại có trường để chúng ta nhập dữ liệu vào

II.Lấy ngày tháng trong Java sử dụng đối tượng GregorianCalendar


package Begin;

import java.util.GregorianCalendar;

public class Datetime {
public static void main(String[] args) {
      //Để lấy được ngày tháng hiện tại chúng ta tạo mới đối tượng GregorianCalendar
      GregorianCalendar calendar=new GregorianCalendar();
      System.out.println(calendar.getTime());
      //Để thiết lập giá trị ngày tháng cho một biến
      //GregorianCalendar mydate=new GregorianCalendar(year,month,day);
      GregorianCalendar mydate=new GregorianCalendar(2003,05,26);
      System.out.println(mydate.getTime());

    }
}

Đọc Tập Tin Bằng Phần Mềm Đọc Đĩa Thô Norton Disk Editor 2002

Ở đây chúng ta sẽ sử dụng Hiren’sBootCD 9.9  và máy ảo Virtual Box.

I.Phân vùng đĩa 

Đầu tiên chúng ta vào Hiren’s BootCD 9.9 và chọn Start BootCD

Sau đó chúng ta sẽ chọn Partition Tools

Tiếp theo chọn Partition Magic Pro 8.05 để thực hiện việc phân vùng đĩa cứng

Thực hiện việc phân vùng  ở đây chúng ta sẽ phân vùng đĩa cứng thành : 1 Primary FAT32,

1 Extended ,trong Extend sẽ có 3 ổ đĩa Logical định dạng theo FAT32

Sau khi hoàn thành việc phân vùng cho ổ đĩa ta tiến hành cài Win vào ổ C hoặc sử dụng Mini Windows XP ở Hiren’s Boot có sẵn .Thực hiện việc tạo 1 Folder có tên MyFolder  ở ổ đĩa D hoăc ổ đĩa nào bất kỳ

trong MyFolder tạo ra tập tin MyText.txt với nội dung : Hello World ,Nào chúng ta sẽ cùng nhau bắt đầu đọc tập tin bằng phần mềm Norton Disk Editor 2002 trong Hiren’s Boot 9.9 .

II.Đọc Folder 

Vào lại Hiren’s Boot 9.9 của chúng ta,chúng ta sẽ chọn Hard Disk Tools 

Sau đó chọn More 2 lần  :

Tiếp theo ta sẽ chọn Norton Disk Editor 2002 

Sau đó màn hình như bên dưới sẽ hiện ra ta tiến hành chọn vào Object -> Drive

Chọn vào Physical disks để đọc đĩa cứng vật lý .

Ok sau khi chọn xong thì chúng ta đang ở Sector 0 là Sector đầu tiên của Ổ đĩa trong đó có chứa MBR (Master Boot Record) .Master Boot Record dùng để mô tả thông tin của các phân vùng trên ổ đĩa .

MBR sẽ được biểu diễn bằng 64 byte chạy từ 01BE -> 01FD

Trong 64 byte đó thì được chia nhỏ thành 4 entry mỗi entry có độ dài 16 byte

Nhìn vào MBR bên dưới ta nhận ra ổ đĩa này được chia làm 2 phân vùng .

Phân vùng 1 Primary từ 01BE -> 01CD

Phân vùng 2 Extended  từ 01CE->01DD

Ở đây chúng ta chỉ nói đến vấn đề đọc File còn những chi tiết khác về thông tin ổ đĩa cách đọc các thông tin đó như thế nào thì các bạn có thể tham khảo thêm ở giáo trình FAT32

Lúc nảy chúng ra có lưu 1 Folder tên là MyFolder ở trong ổ đĩa D vậy giờ chúng ta sẽ phải đi vào vùng Extended để đọc thông tin của ổ đĩa D.

Ở đây tại 01D6->01D9  có giá trị 7A 00 77 01 đảo ngược giá trị này lại 01 77 00 7A =24579450 là Sector bắt đầu của vùng EBR(Extend Boot Record) ,Vùng này mô tả các thông tin của các ổ đĩa Logical

Chúng ta sẽ đi tới Sector 24579450 bằng cách chọn menu Object -> Physical Sector

Đã đến được EBR rồi ở đây Entry đầu tiên mô tả thông tin ổ đĩa D ở 01C6->01C9 có giá trị 3F 00 00 00 đảo ngược lại là 00 00 00 3F = 63 là địa chỉ logic của ổ đĩa D .muốn biết địa chỉ vật lý chúng ta lấy  Địa chỉ bắt đầu vùng Extended + địa chỉ logic của ổ đĩa D = 24579450 + 63 = 24579513

Đi đến Sector 24579513 đi đến được đầu của ổ đĩa D đây là vùng Reserved của ổ đĩa D ở đây ta sẽ đọc được những thông tin quan trọng .

 Ở 000D có giá trị 04  => 4 là số sector/cluster

000E->000F có giá trị 26 00 đảo ngược lại 00 26 => 38 là số sector của vùng Reserved 

0010 có giá trị 02 => có 2 FAT Structure

Ở vị trí 0024->0027 có giá trị 45 3E 00 00 đảo ngược lại là 00 00 3E 45 => 15941 là số sector của 1 FAT Structure vậy 2 FAT Structure sẽ có giá trị là (15941 *2 ) =31882

Để đọc được Folder hoặc File ta sẽ phải tới được vùng Root Directory nơi này là nơi mô tả thông tin các Folder hay tập tin có trên phân vùng ổ đĩa đó .

Sector Begin Root Directory = (Sector Bắt Đầu Vùng Reserved + Số Sector Vùng Reserved + Số Sector của Vùng FAT )

Sector Begin Root Directory=  24579513 + 38 +  31882 = 24611433

Nào cùng đi tới vùng Root Directory của ổ đĩa D ở Sector 24611433 

Ở đây ta sẽ tìm thấy các Folder hoặc tập tin Ở trên ta đã nhìn thấy thông tin mô tả Folder MyFolder rồi giờ ta thực hiện việc đọc nó thôi

Ở 0154 -> 0155 có giá trị 00 00 đảo ngược lại 00 00 là giá trị byte cao của cluster bắt đầu

Ở 015A->015B có giá trị 03 00 đảo ngược lại 00 03 là giá trị của byte thấp của cluster bắt đầu

Ghép giá trị byte cao và byte thấp sau khi đảo ngược lại thành 00 00 00 03 => N=3

Áp dụng vào công thức

Sector đầu tiên của cluster = (N-2) * Số Sector /Cluster  + Địa chỉ bắt đầu vùng Root Directory

Sector vật lý đầu tiên của vùng dữ liệu=(3-2) * 4 +  24611433 =  24611437

Chúng ta đi đến Sector 24611437

Lúc này đã đọc được Folder giờ ta chon vào View -> as Hex chúng ta sẽ nhìn thấy được bên trong nó có 1 tập tin tên MyText.txt

III. Đọc Tập Tin

Thực hiện việc đọc tập tin này

Ở 0094 -> 0095 có giá trị 00 00 đảo ngược lại 00 00 là giá trị byte cao của cluster bắt đầu

Ở 009A->009B có giá trị 11 00 đảo ngược lại 00 11 là giá trị của byte thấp của cluster bắt đầu

Ghép giá trị byte cao và byte thấp sau khi đảo ngược lại thành 00 00 00 11 => N=17

Áp dụng vào công thức

Sector đầu tiên của vùng dữ liệu = (N-2) * Số Sector /Cluster  + Địa chỉ bắt đầu vùng Root Directory

Sector vật lý đầu tiên của vùng dữ liệu=(17-2) * 4 +  24611433 =  24611493

Chúng ta đi đến Sector 24611493

Dòng Hello World đã xuất hiện vậy chúng ta đã hoàn thành việc đọc Folder và Tập Tin bằng Norton Disk Editor .