+ 00 00 0000

Have any Questions?

16_Simple Coding – Java – 자바 입출력 – 기본 요약

16_Simple Coding – Java – 자바 입출력 – 기본 요약

📃 요약

자바는 웹 프로그램을 개발하는데 특화된 컴파일 언어이자 벡엔드 개발 전문 언어임. 플랫폼에 독립적이라서 어떤 운영체제(OS)에서도 실행이 가능하며 가상머신을 통해 실행됨

요소 기술 :

Basic : 자바

📃 기술 구현

스펙 :

 intellij
 java

📃 입출력 스트림

    자바에서 데이터는 스트림이라는 가상의 관을 통해 흘러간다고 가정함.  데이터를 입력 받을 때는 입력 스트림, 출력할 때는 출력 스트림을 사용함

1) : 입출력 스트림 구성요소 : 바이너리 파일 만들기

 입출력 스트림 : 자바에서 데이터는 스트림을 통해 입출력 됨
프로그램이 읽기용/쓰기용에 따라 사용하는 클래스(객체)가 다름

 InputStream : 1바이트 기반 입력용(읽기용) 스트림의 최상위 클래스로 추상 클래스임,
모든 바이트기반 입력 스트림은 InputStream 클래스를 상속받아 생성됨

 OuputStream : 1바이트 기반 출력용(쓰기용) 스트림의 최상위 클래스로 추상 클래스임,
모든 바이트기반 출력(쓰기) 스트림은 OutputStream 클래스를 상속받아 생성됨

자바 입출력 객체 : 디자인패턴 적용(데코레이션(장식) 패턴)

WriteApplication.java

public class WriteApplication {
    public static void main(String[] args) throws Exception {
//        파일 출력용(쓰기용) 객체 생성(파일 열기)
//        new FileOuputStream(경로+파일이름);
//        Gradle 프로젝트 루트(/)경로 : build.gradle 파일 있는 위치
        OutputStream outputStream
                = new FileOutputStream("src/main/resources/test1.db");

        byte a = 10;
        byte b = 20;
        byte c = 30;

//        파일에 쓰기 : 먼저 버퍼에 쓰고 버퍼(메모리, 배열) 다차면 파일 씁니다.
//        버퍼 : 메모리의 임시공간(입출력/네트웍 속도 향상을 위해 사용)
//        .write(byte값) : 파일버퍼에(네트워등) 쓰는 함수
        outputStream.write(a);
        outputStream.write(b);
        outputStream.write(c);

//      .flush() 함수 : 버퍼에 있는 문자를 파일에 쓰기
        outputStream.flush();
        outputStream.close(); // 파일 사용 끝나면 닫기

    }
}

ReadApplication.java

public class ReadApplication {
    public static void main(String[] args) throws Exception {
        InputStream inputStream =
                new FileInputStream("src/main/resources/test1.db");

        while (true) {
//          .read() : 1byte 읽기
            int data = inputStream.read(); // read() 리턴값 정수(int)
//            파일의 끝에 도달하면 : -1
            if(data == -1) break;
            System.out.println(data); // 읽은 내용 화면 출력
        }
        inputStream.close(); // 파일 닫기
    }
}

2) : 입출력 스트림 구성요소 : 문자 파일 만들기

 입출력 스트림 : 자바에서 데이터는 스트림을 통해 입출력 됨
프로그램이 읽기용/쓰기용에 따라 사용하는 클래스(객체)가 다름

 Reader : 문자(char:2byte) 기반 입력용(읽기용) 스트림의 최상위 클래스로 추상 클래스임,
모든 문자기반 입력(읽기) 스트림은 Reader 클래스를 상속받아 생성됨

 Writer : 문자(char:2byte) 기반 출력용(쓰기용) 스트림의 최상위 클래스로 추상 클래스임,
모든 문자기반 출력(쓰기) 스트림은 Writer 클래스를 상속받아 생성됨

WriteApplication.java

package chap14.sec01.exam07;

import java.io.FileWriter;
import java.io.Writer;

/**
 * packageName : chap14.sec01.exam07
 * fileName : WriteApplication
 * author : ds
 * date : 2022-10-07
 * description : 한 문자씩 출력하기
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2022-10-07         ds          최초 생성
 */
public class WriteApplication {
    public static void main(String[] args) throws Exception {
//        파일 쓰기용(출력용) 열기(문자기반(char) : 2byte)
        Writer writer = new FileWriter("src/main/resources/test7.txt");

        char a = 'A'; // 홑따옴표 한문자 표기하는 자료형
        char b = 'B';
        char c = 'C';

//        한문자씩 버퍼에 출력
        writer.write(a);
        writer.write(b);
        writer.write(c);

//        버퍼에 있는 내용을 실제 파일에 쓰기
        writer.flush();
        writer.close(); // 파일 닫기
    }
}

ReadApplication.java

package chap14.sec01.exam11;

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

/**
 * packageName : chap14.sec01.exam11
 * fileName : ReadApplication
 * author : ds
 * date : 2022-10-07
 * description : 한 문자씩 읽기
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2022-10-07         ds          최초 생성
 */
public class ReadApplication {
    public static void main(String[] args) throws IOException {
//        파일 읽기용(입력용)으로 열기
        Reader reader = new FileReader("src/main/resources/test7.txt");

//        loop 돌리면서 한문자씩 읽기
        while (true) {
//            한문자씩 읽기(아스키코드)
            int data = reader.read();
//            파일의 끝 : -1
            if(data == -1) break;
            System.out.println((char)data); // 아스키코드 -> 문자
        }
        reader.close(); // 파일 닫기
    }
}

📃 보조 스트림

    다른 스트림과 연결되어 여러가지 편리한 기능을 제공하는 클래스

1) : 입출력 스트림 구성요소

 보조 스트림 : 다른 스트림과 연결되어 여러 가지 편리한 기능 제공 자체적으로 입출력을 수행할 수 없고, 입출력소스(InputStream, OutputStream 등) 결합하여 사용(데코레이션 패턴)

 보조 스트림 종류 : 문자 변환, 입출력 향상, 기본 타입 입출력, 객체 직렬화 등이 있음

 문자 변환 : 소스가 바이트기반 입출력이면서 문자라면 Reader, Writer로 변환해서 사용하는 것을 고려

(1) BufferedOupputStream/BufferedInputStream, BufferedWriter/BufferdReader

 성능 향상 : 기본적으로 InputStream/OutputStream 은 내부에 조그만 버퍼가 있음. 하지만 이것만으로 충분하지 않아 더 큰 메모리 버퍼를 추가 제공하는 보조스트림을 사용함

ReadLineApplication.java

public class ReadLineApplication {
    public static void main(String[] args) throws Exception {
//        문자기반(char) 파일 읽기용으로 열기
        Reader reader = new FileReader("src/main/resources/language.txt");

//        보조스트림 : 버퍼가 있는 읽기 ( BufferedReader )
//        사용법 : new 보조스트림(기본스트림)
        BufferedReader bufferedReader = new BufferedReader(reader);

//        BufferedReader 클래스의 특징 : 한라인씩 읽기 - .readLine()
        while (true) {
            String data = bufferedReader.readLine(); // 파일을 한라인씩 읽기
//            파일의 끝 : null
            if(data == null) break; // 파일의 끝라인
            System.out.println(data);
        }

        bufferedReader.close(); // 파일 닫기
    }
}

(2) DataInputStream/DataOutputStream

 기본 타입 입출력 : DataInputStream/DataOutputStream 보조스트림을 연결하면 기본 타입인 boolean, char, short, int, long, float ,double 등을 입출력할 수 있음

 개행 출력 : PrintStream/PrintWriter의 print(), println() 함수를 사용할 수 있고, println()함수는 출력할 데이터 끝에 줄바꿈 문자를 추가함

ReadLineApplication.java

package chap14.sec02.exam02;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.Reader;

/**
 * packageName : chap14.sec02.exam03
 * fileName : ReadLineApplication
 * author : ds
 * date : 2022-10-07
 * description : 라인 단위로 구분된 문자열
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2022-10-07         ds          최초 생성
 */
public class ReadLineApplication {
    public static void main(String[] args) throws Exception {
//        문자기반(char) 파일 읽기용으로 열기
        Reader reader = new FileReader("src/main/resources/language.txt");

//        보조스트림 : 버퍼가 있는 읽기 ( BufferedReader )
//        사용법 : new 보조스트림(기본스트림)
        BufferedReader bufferedReader = new BufferedReader(reader);

//        BufferedReader 클래스의 특징 : 한라인씩 읽기 - .readLine()
        while (true) {
            String data = bufferedReader.readLine(); // 파일을 한라인씩 읽기
//            파일의 끝 : null
            if(data == null) break; // 파일의 끝라인
            System.out.println(data);
        }

        bufferedReader.close(); // 파일 닫기
    }
}

📃 입출력 관련 API

    입출력을 하는데 있어 유용하고 편리한 기능을 제공하는 함수

1) : 입출력 스트림 구성요소

 System.in : 콘솔에서 키보드의 데이터를 입력받을 수 있도록 System 클래스에 in 공유 속성을 제공함.
System.in 은 InputStream 클래스 타입임,
주로 InputStreamReader 보조스트림과 BufferedReader 보조 스트림을 연결해서 사용하거나Scanner를 이용해서 문자열 입력을 받음

 System.out : 콘솔에서 모니터에 데이터를 출력하기 위함
System 클래스에 out 공유 속성을 제공함
System.out 은 PrintStream 클래스 타입임, print(), println(), printf() 함수 제공

package chap14.sec03.exam01;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;

/**
 * packageName : chap14.sec03.exam01
 * fileName : GetLineKeyboardApplication
 * author : ds
 * date : 2022-10-07
 * description : 키보드로 부터 라인(줄) 단위 문자열 얻기
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2022-10-07         ds          최초 생성
 */
// System.in : 키보드로 부터 입력
// System.out : 모니터로 출력
public class GetLineKeyboardApplication {
    public static void main(String[] args) throws Exception {
//        1) 기본스트림(byte기반) <- 키보드 입력(byte 기반 입력)
//        2) byte + 문자기반 보조스트림 기능 추가
        Reader reader = new InputStreamReader(System.in);
//        성능향상 보조스트림 기능 추가
        BufferedReader bufferedReader = new BufferedReader(reader);
//        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

        while(true) {
            System.out.print("입력하세요: ");
            String lineStr = bufferedReader.readLine(); // 한줄씩 읽기
//            종료 조건
            if(lineStr.equals("q") || lineStr.equals("quit")) break;
            System.out.print("입력된내용: " + lineStr);
            System.out.println(); // 줄바꿈
        }

        bufferedReader.close(); // 입출력 스트림 닫기
    }
}

 Scanner : 입출력스트림 또는 보조 스트림이 아니고, 자바에서 바이트 기반 입출력에서 라인 단위 문자열을 쉽게 읽도록 하기 위해 자바에서 제공함

package chap14.sec03.exam02;

import java.util.Scanner;

/**
 * packageName : chap14.sec03.exam03
 * fileName : ScannerApplication
 * author : kangtaegyung
 * date : 2/18/24
 * description : Scanner 클래스
 * 요약 :
 *      1) 키보드 입력을 위한 다양한 함수를 지원해서 쉽게 사용 가능
 *      2) 속도가 느린 것이 단점
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * -----------------------------------------------------------
 * 2/18/24         kangtaegyung          최초 생성
 */
public class ScannerApplication {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int num     = scanner.nextInt();    // 정수 입력    1
        System.out.println(num);

        long num2   = scanner.nextLong();   // 정수 입력    2
        System.out.println(num2);

        double num3 = scanner.nextDouble(); // 실수 입력    3.1
        System.out.println(num3);

        String str  = scanner.next();       // 1단어 입력 : 안녕 홍길동
        String str2  = scanner.next();
        System.out.println(str);
        System.out.println(str2);

        // next 계열과 nextLine 같이 사용하지 말것 : 입력 오류가 발생함
//        String str3  = scanner.nextLine();  // 문자열 입력   안녕 장길산
//        System.out.println(str3);

    }
}

 File : 파일 및 폴더의 정보를 제공해주는 역할

package chap14.sec03.exam03;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * packageName : chap14.sec03.exam02
 * fileName : FileApplication
 * author : ds
 * date : 2022-10-07
 * description : File 클래스를 이용한 파일 및 폴더 정보 보기
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2022-10-07         ds          최초 생성
 */
public class FileApplication {
    public static void main(String[] args) throws Exception {
//        File 객체 : 파일 및 폴더의 정보를 볼수 있음 , 또한 폴더, 파일 생성할 수 있음
//        폴더 정보
        File dir = new File("src/main/resources/images");      // 폴더명
//        파일 정보
        File file1 = new File("src/main/resources/file1.txt"); // 파일

        if (dir.exists() == false) {
            dir.mkdirs();                              // 폴더 없으면 폴더 만들기 실행
        }

        if (file1.exists() == false) {
            file1.createNewFile();                     // 없으면 파일 만들기
        }

//        파일객체 현재 디렉토리의 목록보기 함수
        File temp = new File("src/main/resources/");
        File[] contents = temp.listFiles();             // 하위폴더, 파일 정보보기

//            파일 또는 정보를 출력
        System.out.println(contents[0].getName());       // file1.txt
        System.out.println(contents[1].getName());       // images 폴더
    }
}

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다