KDT 공부 일지 - 2026.01.22

김시코·2026년 1월 22일

KDT 공부 일지

목록 보기
14/27

파일 입출력

[p1]
package p1;

import java.io.File;
import java.io.FileOutputStream;

public class App {
    public static void main(String[] args) {
        // 파일 입출력 -> 값을 파일에 저장 할 수 있다.

        int a = 10 + 3;

        File file = new File("C:\\temp\\aaa.dat");

        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(file);   // 파일 사용 시작.

            fos.write(a);
            fos.write(10);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(fos != null) {
                try {
                    fos.close();    // 자원 반납
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

        System.out.println("프로그램 종료");
    }
}
[p2]
package p2;

import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;

public class App {
    public static void main(String[] args) throws Exception{
        File file = new File("C:\\temp\\bbb.dat");

        int value = 0xAABBCCDD;

        FileOutputStream fos = new FileOutputStream(file);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        DataOutputStream dos = new DataOutputStream(bos);

        fos.write(value >> 24);   // 바이트단위 - 데이터 손실 있음.
        fos.write(value >> 16);
        fos.write(value >> 8);
        fos.write(value >> 0);

        bos.close();
        fos.close();
        dos.close();
        
        System.out.println("프로그램 종료");
    }
}
[p3]
package p3;

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;

public class App {
    public static void main(String[] args) throws Exception {
        // 파일 읽기
        File file = new File("C:\\temp\\bbb.dat");

        FileInputStream fis = new FileInputStream(file);
        BufferedInputStream bis = new BufferedInputStream(fis);
        DataInputStream dis = new DataInputStream(bis);

        System.out.println(dis.readInt());
        System.out.println(dis.readInt());
        System.out.println(dis.readInt());
        System.out.println(dis.readInt());

        dis.close();
        bis.close();
        dis.close();

    }
}
[p4] - 파일 입출력을 이용한 이미지 만들기
package p4;

import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;

public class App {
    public static void main(String[] args) throws Exception {
        // 이미지 파일을 만들어보자(bmp)

        File file = new File("C:\\temp\\aaa.bmp");

        FileOutputStream fos = new FileOutputStream(file);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        DataOutputStream dos = new DataOutputStream(bos);

        // 메타 데이터 - 실제 데이터를 어떻게 읽어들이는지 설명하는 것.
        dos.writeByte('B');
        dos.writeByte('M');

        dos.writeByte(30054 >> 0);
        dos.writeByte(30054 >> 8);
        dos.writeByte(30054 >> 16);
        dos.writeByte(30054 >> 24);

        // 예약
        dos.writeShort(0);
        
        // 예약
        dos.writeShort(0);

        // 로우 데이터 시작 인덱스
        dos.writeByte(54 >> 0);
        dos.writeByte(54 >> 8);
        dos.writeByte(54 >> 16);
        dos.writeByte(54 >> 24);

        // 두번째 헤더의 크기
        dos.writeByte(40 >> 0);
        dos.writeByte(40 >> 8);
        dos.writeByte(40 >> 16);
        dos.writeByte(40 >> 24);

        // 너비
        dos.writeByte(100 >> 0);
        dos.writeByte(100 >> 8);
        dos.writeByte(100 >> 16);
        dos.writeByte(100 >> 24);

        // 높이
        dos.writeByte(100 >> 0);
        dos.writeByte(100 >> 8);
        dos.writeByte(100 >> 16);
        dos.writeByte(100 >> 24);

        // 색상 평면수
        dos.writeByte(1 >> 0);
        dos.writeByte(1 >> 8);

        // 픽셀당 비트 수
        dos.writeByte(24 >> 0);
        dos.writeByte(24 >> 8);

        // 압축 방법
        dos.writeInt(0);

        // 로우데이터 크기
        dos.writeByte(30000 >> 0);
        dos.writeByte(30000 >> 8);
        dos.writeByte(30000 >> 16);
        dos.writeByte(30000 >> 24);

        // 가로 해상도(미터당 몇 픽셀인지)
        dos.writeInt(0);

        // 세로 해상도(미터당 몇 픽셀인지)
        dos.writeInt(0);

        // 색상 팔레트 수
        dos.writeInt(0);

        // 사용된 중요 색상 수
        dos.writeInt(0);

        // raw 데이터(실제 데이터)
        for(int x = 0; x < 100; x++) {  // 2중 for문 x, y는 좌표값
            for(int y = 0; y < 100; y++) {
                
                dos.write(0xFF);    // BLUE
                dos.write(0xFF);    // GREEN
                dos.write(0xFF);    // RED
            }
        }

        dos.close();
        bos.close();
        fos.close();
    }
}

Thread

[p5] - Thread 맛보기
package p5;

public class App {
    public static void main(String[] args) {    // 이게 메인 쓰레드.
        // 쓰레드(비동기)

        HelloPrinter helloPrinter = new HelloPrinter();
        helloPrinter.start();
        // 이건 Thread 클래스의 메서드. 쓰레드(실행 흐름)를 생성하고, run을 생성시킴.

        WelcomPrinter welcomPrinter = new WelcomPrinter();
        welcomPrinter.start();

        for(int i = 0; i < 100; i++) {
            System.out.println("야호: " + i);
        }

        System.out.println("프로그램 종료");
        // 야호와 헬로가 무작위로 섞여서 나옴. (매번 결과가 다름)
        
        // Thread 클래스의 메서드 start는 비동기 메서드이다.
        // Thread를 하나 더 생성해서 멀티 스레드가 되고, 멀티 쓰레드가 되면
        // run이랑 for문이 경쟁하듯이 따로따로 동시에 실행된다.
        // Thread는 무한대로 만들 수 있기는 한데... 굳이?
    }
}

class HelloPrinter extends Thread {         // 이게 서브 쓰레드.
    @Override
    public void run() {
        for(int i = 0; i < 100; i++) {
            System.out.println("헬로: " + i);
        }
    }
}

class WelcomPrinter extends Thread {         // 이게 서브 쓰레드
    @Override
    public void run() {
        for(int i = 0; i < 100; i++) {
            System.out.println("웰컴: " + i);
        }
    }
}
profile
취업하고싶다...

0개의 댓글