본문 바로가기

개발(합니다)/Java&Spring

[java-기초-17] IO 기반 입출력

반응형

프로그램에서 데이터를 외부에서 읽고 다시 외부로 출력하는 작업이 빈번하게 일어납니다.
데이터는 사용자로부터 키보드를 통해 입력 받을 수 있고, 파일 또는 네트워크로부터 입력될 수도 있습니다.
반대로 모니터로 출력될 수 도 있고, 파일로 출력되어 저장될 수도 있으며 네트워크로 출력되어 전송될 수도 있습니다.

자바의 입출력

  • 자바에서 데이터는 스트림(Stream)을 통해 입출력되므로 스트림의 특징을 잘 이해해야 합니다.
  • 스트림은 단방향으로 연속적으로 흘러가는 것을 말하며 출발지에서 도착지로 들어간다는 개념입니다.
  • 프로그램이 데이터를 입력 받을 때는 입력 스트림이라 부르고, 프로그램이 데이터를 보낼 때는 출력 스트림이라고 부릅니다.
  • 항상 프로그램을 기준으로 데이터가 들어오면 입력 스트림이고, 데이터가 나가면 출력 스트림이라는 것을 명심해야 합니다.
  • 프로그램이 네트워크상 다른 프로그램과 데이터를 교환하기 위해서는 양쪽 모두 입력 스트림과 출력 스트림이 따로 필요합니다

  • 자바에서 제공하는 클래스는 아래와 같습니다.
java.io 패키지의 주요 클래스 설명
File 파일 시스템의 파일 정보를 얻기 위한 클래스
Console 콘솔로부터 문자를 입출력하기 위한 클래스
InputStream / OutputStream 바이트 단위 입출력을 위한 최상위 입출력 스트림 클래스
FileInputStream / FileOutputStream 바이트 단위 입출력을 위한 하위 스트림 클래스
DataInputStream / DataOutputStream
ObjectInputStream / ObjectOutputStream
PrintStream
BufferedInputStream / BufferedOutputSteam
Reader / Writer 문자 단위 입출력을 위한 최상위 입출력 스트림 클래스
FileReader / FileWriter 문자 단위 입출력을 위한 하위 스트림 클래스
InputStreamReader / OuputStreamWriter
PrintWriter
BufferedReader / BufferedWriter
  • 스트림 클래스는 바이트 기반 스트림과 문자 기반 스트림으로 나눌수 있고 아래와 같습니다.
구분 바이트 기반 스트림 문자 기반 스트림
입력 스트림 출력 스트림 입력 스트림 출력 스트림
최상위 클래스 InputStream OutputStream Reader Writer
하위 클래스
(예시)
XXXInputStream
(FileInputStream)
XXXOutputStream
(FileOutputStream)
XXXReader
(FileReader)
XXXWriter
(FileWriter)

InputStream

package io;

import java.io.*;


public class IoTest1 {
    public static void main(String[] args) {
        File file;
        InputStream is = null;
        try {
            is = new FileInputStream("C:/_temp/test.txt");
            int readByte;
            while ((readByte = is.read()) != -1) {
                System.out.println(readByte);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

OutputStream

package io;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;


public class IoTest2 {
    public static void main(String[] args) {
        try {
            OutputStream os = new FileOutputStream("C:/_temp/test2.txt");
            byte[] data = "ABC".getBytes(StandardCharsets.UTF_8);
            for (int i = 0; i < data.length; i++) {
                os.write(data[i]);
            }
            os.flush();
            os.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Reader

package io;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;


public class IoTest3 {
    public static void main(String[] args) {
        Reader reader = null;
        try {
            reader = new FileReader("C:/_temp/test.txt");
            int readData;
            while ((readData = reader.read()) != -1) {
                char charData = (char) readData;
                System.out.println(charData);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Writer

package io;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;


public class IoTest4 {
    public static void main(String[] args) {
        try {
            Writer writer = new FileWriter("C:/_temp/test2.txt");
            char[] data = "홍길동".toCharArray();
            for (int i = 0; i < data.length; i++) {
                writer.write(data[i]);
            }
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

콘솔 입출력

System.in

package io;

import java.io.IOException;
import java.io.InputStream;


public class IoTest5 {
    public static void main(String[] args) {
        System.out.println("메뉴");
        System.out.println("1. 예금 조회");
        System.out.println("2. 예금 출금");
        System.out.println("3. 예금 입금");
        System.out.println("4. 종료 하기");
        System.out.println("메뉴를 선택하세요");

        InputStream is = System.in;
        char inputChar = 0;
        try {
            inputChar = (char) is.read();
        } catch (IOException e) {
            e.printStackTrace();
        }
        switch (inputChar) {
            case '1':
                System.out.println("예금 조회를 선택했습니다.");
                break;
            case '2':
                System.out.println("예금 출금을 선택했습니다.");
                break;
            case '3':
                System.out.println("예금 입금을 선택했습니다.");
                break;
            case '4':
                System.out.println("종료 하기를 선택했습니다.");
                break;
        }
    }
}

System.out

package io;

import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;


public class IoTest6 {
    public static void main(String[] args) throws IOException {
        OutputStream os = System.out;

        for (byte b = 48; b < 58; b++) {
            os.write(b);
        }
        os.write(10);

        for (byte b = 97; b < 123; b++) {
            os.write(b);
        }
        os.write(10);

        String hangul = "가나다라마바사아자차카타파하";
        byte[] hangulBytes = hangul.getBytes(StandardCharsets.UTF_8);
        os.write(hangulBytes);

        os.flush();
    }
}

Console 클래스

package io;

import java.io.Console;


public class IoTest7 {
    public static void main(String[] args) {
        Console console = System.console();
        System.out.println("아이디 : ");
        String id = console.readLine();

        System.out.println("패스워드: ");
        char[] charPass = console.readPassword();
        String strPasword = new String(charPass);

        System.out.println("---------------");
        System.out.println(id);
        System.out.println(strPasword);
    }
}

Scanner 클래스

package io;

import java.util.Scanner;


public class IoTest8 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("문자열 입력");
        String inputString = scanner.nextLine();
        System.out.println(inputString);
        System.out.println();

        System.out.println("정수 입력");
        int inputInt = scanner.nextInt();
        System.out.println(inputInt);
        System.out.println();

        System.out.println("실수 입력");
        double inputDouble = scanner.nextDouble();
        System.out.println(inputDouble);
    }
}

파일 입출력

File 클래스

  • 파일 리스트 조회
package io;

import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.text.SimpleDateFormat;
import java.util.Date;


public class IoTest9 {
    public static void main(String[] args) {
        try {
            File dir = new File("C:/_temp/Dir");
            File file1 = new File("C:/_temp/file1.txt");
            File file2 = new File("C:/_temp/file2.txt");
            File file3 = new File(new URI("file:////C:/_temp/file3.txt"));

            if (dir.exists() == false) {
                dir.mkdirs();
            }

            if (file1.exists() == false) {
                file1.createNewFile();
            }

            if (file2.exists() == false) {
                file2.createNewFile();
            }

            if (file3.exists() == false) {
                file3.createNewFile();
            }

            File temp = new File("C:/_temp");
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd a HH:mm");
            File[] contents = temp.listFiles();
            System.out.println("날짜 \t\t 시간 \t\t 형태 \t 크기 \t 이름");
            System.out.println("-----------------------------------------");
            for (File file : contents) {
                System.out.print(sdf.format(new Date(file.lastModified())));
                if (file.isDirectory()) {
                    System.out.print("\t<DIR> \t\t\t" + file.getName());
                } else {
                    System.out.print("\t\t\t" + file.length() + "\t" + file.getName());
                }
                System.out.println();
            }

        } catch (URISyntaxException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

FileInputStream

  • 파일 읽기
package io;

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


public class IoTest10 {
    public static void main(String[] args) {
        try {

            FileInputStream fis = new FileInputStream("C:/_temp/test.txt");
            int data;
            while ((data = fis.read()) != -1) {
                System.out.println(data);
            }
            fis.close();
        } catch (Exception e) {

        }
    }
}

FileOutputStream

  • 파일 복사
package io;

import java.io.*;


public class IoTest11 {
    public static void main(String[] args) {
        String originFileName = "C:/_temp/test.txt";
        String targetFileName = "C:/_temp/test_cp.txt";
        try {
            FileInputStream fis = new FileInputStream(originFileName);
            FileOutputStream fos = new FileOutputStream(targetFileName);

            int readBytesNo;
            byte[] readBytes = new byte[100];
            while ((readBytesNo = fis.read(readBytes)) != -1) {
                fos.write(readBytes, 0, readBytesNo);
            }

            fos.flush();
            fos.close();
            fis.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

FileReader

  • 파일 읽기
package io;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;


public class IoTest12 {
    public static void main(String[] args) {
        try {
            FileReader fr = new FileReader("C:/_temp/test.txt");

            int readCharNo;
            char[] cbuf = new char[100];

            while((readCharNo = fr.read(cbuf)) != -1) {
                String data = new String(cbuf, 0, readCharNo);
                System.out.print(data);
            }
            fr.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

FileWriter

  • 파일 쓰기
package io;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;


public class FileTest13 {
    public static void main(String[] args) {
        File file = new File("C:/_temp/test.txt");
        try {
            FileWriter fw = new FileWriter(file, true);
            fw.write("FileWriter는 한글로된  \r\n");
            fw.write("문자열을 바로 출력 할 수 있다 \r\n");
            fw.flush();
            fw.close();
            System.out.println("파일에 저장되었습니다.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

보조 스트림

  • 다른 스트림과 연결되어 여러 가지 편리한 기능을 제공해주는 스트림을 의미합니다.
  • 보조 스트림을 필터 스트림이라고도 하며 보조 스트림의 일부가 FilterInputStream, FilterOutputStream의 하위 클래스입니다.
  • 다른 보조 스트림은 이 클래스들을 상속받지 않기 때문에 필터 스트림이란 용어 대신 사용 목적에 맞게 보조 스트림이라고 부릅니다.
  • 보조 스트림은 자체적으로 입출력을 수행할 수 없기 때문에 입력 소스와 바로 연결되는 InputStream, FileInputStream, Reader, FileReader, 출력 소스와 바로 연결되는 OuputStream, FileOutputStream, Writer, FileWriter 등에 연결해서 입출력을 수행합니다.
  • 보조 스트림은 문자 변환, 입출력 성능 향상, 기본 데이터 타입 입출력, 객체 입출력 등의 기능을 제공합니다.

문자 변환 보조 스트림

  • InputStreamReader
  • OutputStreamWriter

성능 향상 보조 스트림

보조 역할을 하는 버퍼를 제공해주는 보조스트림입니다.
소스로부터 직접 읽고 쓰는 대신에 버퍼로부터 읽고 쓰게되면서 성능이 향상됩니다.

  • BufferedInputStream
  • BufferedReader
  • BufferedOutputStream
  • BufferedWriter

기본 타입 입출력 보조 스트림

바이트 스트림은 바이트 단위로 입출력하기 때문에 자바의 기본 데이터 타입으로 입출력 할 수 없지만 DataInputStream, DataOutputStream 보조 스트림을 연결하면 기본 데이터 타입으로 입출력이 가능합니다.

  • DataInputStream
  • DataOutputStream

프린터 보조 스트림

  • PrintStream
  • PrintWriter

객체 입출력 보조 스트림

바이트 출력 스트림과 연결되어 객체를 직렬화하는데 ObjectOutputStream이 사용되고 역직렬화하는데 ObjectInputStream이 사용됩니다.

  • ObjectInputStream
  • ObjectOutputStream
반응형