Java의 I/O

이기영·2024년 7월 15일

Java 기초학습

목록 보기
13/14
post-thumbnail

목표

Java의 Input과 Output에대해 학습

목차

1. Stream / Buffer / Channel 기반의 I/O
2. InputStream과 OutputStream
3. Byte와 Character 스트림
4. 표준 스트림
5. 파일 읽고 쓰기


1. Stream / Buffer / Channel 기반의 I/O

Java에서 I/O(Input/Output) 작업을 처리하는 방법중 Stream, Buffer, Channel에 대해 알아보겠습니다.


1-1 Stream기반의 I/O

Stream은 자바에서 I/O 작업을 처리하는 가장 기본적인 방법입니다. Stream은 데이터를 순차적으로 읽고 쓰는 통로를 의미합니다.

자바의 Stream은 다음과 같이 두 가지 유형으로 나뉩니다.

  • InputStream : 입력 데이터를 읽기 위한 스트림
    ( Ex: FileInputStream, ByteArrayInputStream )

  • OutputStream : 출력 데이터를 쓰기 위한 스트림
    ( Ex: FileOutputStream, ByteArrayOutputStream )


  스트림은 바이트 단위로 데이터를 처리하며, 이러한 스트림은 데이터를 한 바이트씩 읽거나 쓸 수 있습니다. 이를 통해 파일, 네트워크 소켓 등의 다양한 I/O 소스를 처리할 수 있습니다.


Reader와 Writer

  스트림은 기본적으로 바이트 단위로 데이터를 처리하지만, 문자 데이터를 효율적으로 처리하기 위해 자바는 ReaderWriter 클래스를 제공합니다. 이들은 문자 단위로 데이터를 읽고 씁니다.

  • Reader : 입력을 위한 문자 스트림입니다.
  • Writer : 출력을 위한 문자 스트림입니다.

  스트림 기반 I/O는 단순하고 직관적이지만, 데이터를 한 바이트씩 처리하기 때문에 성능 면에서 비효율적일 수 있습니다. 이를 보완하기 위해 버퍼를 사용합니다.


1-2 Buffer 기반의 I/O

Buffer는 데이터 입출력 성능을 향상시키기 위해 사용되는 메모리의 특정 영역입니다. 버퍼는 데이터를 일시적으로 저장하여, 한 번에 많은 데이터를 읽거나 쓸 수 있도록 도와줍니다. 이는 디스크나 네트워크와의 I/O 작업에서 특히 유용합니다.


Bufferd Stream

  자바에서 버퍼링을 사용하기 위해 BufferedInputStreamBufferedOutputStream 클래스를 제공합니다. 이 클래스들은 내부적으로 버퍼를 사용하여 데이터를 한 번에 더 많이 읽거나 씁니다.

  • BufferedInputStream : 입력을 위한 버퍼링된 바이트 스트림

  • BufferedOutputStream : 출력을 위한 버퍼링된 바이트 스트림


Buffered Reader와 Writer

문자 스트림에도 버퍼링이 가능합니다. 이를 위해 BufferedReaderBufferedWriter 클래스를 사용합니다.

  • BufferedReader : 입력을 위한 버퍼링된 문자 스트림
  • BufferedWriter : 출력을 위한 버퍼링된 문자 스트림

  버퍼링된 스트림을 사용하면 성능이 크게 향상될 수 있습니다. 이는 특히 대량의 데이터를 처리할 때 유용합니다.


1-3 Channel 기반의 I/O

Channel은 Java NIO (New I/O)패키지에서 도입된 개념으로, 스트림보다 더 유연하고 강력한 I/O 처리를 제공합니다. 채널은 양방향 통신을 지원하며, 비동기 I/O 및 버퍼와 함께 사용됩니다.

주요 채널 클래스는 아래와 같습니다.

  • FileChannel : 파일 I/O를 위한 채널
  • SocketChannel : 소켓 I/O를 위한 채널
  • ServerSocketChannel : 서버 소켓 I/O를 위한 채널
  • DatagramChannel : UDP 소컷 I/O를 위한 채널

버퍼와 채널의 조합

  채널은 데이터를 직접 일고 쓰지 않고, 항상 버퍼를 통해 데이터를 처리합니다. 이는 효율적인 데이터 전송과 처리를 가능하게 합니다.

  예를 들어, FileChannel을 사용하여 파일에서 데이터를 읽는 과정은 아래와 같습니다.


1. 파일 채널 열기

FileChannel fileChannel = 
FileChannel.open(Paths.get("file.txt"), StandardOpenOption.READ);

2. 버퍼 생성

ByteBuffer buffer = ByteBuffer.allocate(1024);

3. 채널에서 버퍼로 데이터 읽기

int bytesRead = fileChannel.read(buffer);

4. 채널에서 버퍼로 데이터 읽기

int bytesRead = fileChannel.read(buffer);

5. 채널 닫기

fileChannel.close();

요약

  • Stream : 단순하고 사용하기 쉬우며, 단방향I/O를 지원하지만, 성능이 떨어질 수 있습니다.

  • Buffer : 성능을 향상시키기 위해 데이터를 일시적으로 저장하여 한 번에 읽고 쓰는 방식입니다.

  • Channel : 양방향 I/O와 비동기 처리를 지원하며, 버퍼와 함께 사용하여 효율적인 데이터 처리를 가능하게 합니다.



2. InputStream과 OutputStream

InputStreamOutputStream은 자바에서 기본적인 I/O 처리를 위한 추상 클래스입니다.

이 두 클래스는 바이트 단위로 데이터를 읽고 쓰는데 사용됩니다. 이들은 I/O의 핵심이며, 다양한 서브클래스를 통해 파일, 네트워크 소켓, 메모리 등 여러 소스와 목적지로부터 데이터를 처리할 수 있습니다.

InputStream

  InputStream은 바이트 단위로 데이터를 읽기 위한 추상 클래스입니다. 주로 데이터를 읽는 작업에 사용되며, 주요 서브클래스와 함께 사용됩니다.

주요 메서드

  • int read()
    입력 스트림에서 다음 바이트 데이터를 읽습니다. 바이트 값을 0~255 사이의 정수로 반환하며, 더 이상 읽을 데이터가 없으면 -1을 반환합니다.

  • int read(byre[] b)
    입력 스트림에서 바이트 배열 b의 길이만큼 데이터를 읽습니다. 읽은 바이트 수를 반환하며, 더 이상 읽을 데이터가 없으면 -1을 반환합니다.

  • int read(byte[] b, int off, int len)
    입력 스트림에서 최대 len 바이트를 읽고, 이를 바이트 배열 boff 위치에서 시작하여 저장합니다.

  • void close()
    스트림을 닫고, 자원을 해제합니다.

  • int available()
    스트림에서 읽을 수 있는 바이트 수를 반환합니다.


주요 서브 클래스

  • FileInputStream
    파일로부터 바이트 입력을 읽기 위한 스트림입니다.

  • ByteArrayInputStream
    바이트 배열로부터 바이트 입력을 읽기 위한 스트림 입니다.

  • BufferedInputStream
    다른 입력 스트림에 버퍼링 기능을 추가하여 입력 성능을 향상시킵니다.

  • DataInputStream
    기본 데이터 타입 (int, float 등)을 입력 스트림에서 읽을 수 있습니다.


예시

import java.io.FileInputStream;
import java.io.IOException;

public class InputStreamExample {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("input.txt")) {
            int data;
            while ((data = fis.read()) != -1) {
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

OutputStream

  OutputStream은 바이트 단위로 데이터를 쓰기 위한 추상 클래스입니다. 주로 데이터를 쓰는 작업에 사용되며, 주요 서브클래스와 함께 사용됩니다.

주요 메서드

  • void write(int b)
    출력 스트림에 주어진 바이트 데이터를 씁니다.

  • void write(byte[] b)
    바이트 배열 b의 모든 바이트 데이터를 출력 스트림에 씁니다.

  • void write(byte[] b, int off, int len)
    바이트 배열 boff 위치에서 시작하여 len 바이트 데이터를 출력 스트림에 씁니다.

  • void flush()
    출력 스트림을 비우고, 모든 버퍼된 출력 바이트를 실제 출력 대상에 씁니다.

  • void close()
    스트림을 닫고, 자원을 해제합니다.


주요 서브 클래스

  • FileOutputStream
    파일에 바이트 출력을 쓰기 위한 스트림입니다.

  • ByteArrayoutputStream
    바이트 배열에 바이트 출력을 쓰기 위한 스트림입니다.

  • BufferedOutputStream
    다른 출력 스트림에 버퍼링 기능을 추가하여 출력 성능을 향상시킵니다.

  • DataOutputStream
    기본 데이터 타입 (int, float 등)을 출력 스트림에 쓸 수 있습니다.


예시

import java.io.FileOutputStream;
import java.io.IOException;

public class OutputStreamExample {
    public static void main(String[] args) {
        try (FileOutputStream fos = new FileOutputStream("output.txt")) {
            String data = "Hello, World!";
            fos.write(data.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

결합 사용 예시
InputStream과 OutputStream을 결합하여 파일 복사를 할 수 있습니다.

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyFileExample {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("input.txt");
             FileOutputStream fos = new FileOutputStream("output.txt")) {
            
            byte[] buffer = new byte[1024];
            int bytesRead;
            
            while ((bytesRead = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, bytesRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

요약

  • InputStreamOutputStream은 자바에서 바이트 단위 I/O를 처리하기 위한 기본 추상 클래스입니다.

  • InputStream은 데이터를 읽고, OutputStream은 데이터를 씁니다.

  • 이들 클래스는 다양한 서브클래스를 통해 파일, 네트워크 소켓, 메모리 등 여러 소스와 목적지로부터 데이터를 처리할 수 있습니다.

  • 버퍼링 클래스(BufferedInputStream, BufferedOutputStream)를 사용하면 성능이 향상될 수 있습니다.

  • 스트림을 사용할 때는 항상 자원을 해제하기 위해 close() 메서드를 호출해야 하며, 이를 위해 try-with-resources 구문을 사용하는 것이 권장됩니다.



3. Byte와 Character 스트림

Java의 I/O 시스템은 데이터를 바이트 단위로 처리하는 바이트 스트림과, 문자를 처리하는 캐릭터 스트림으로 나뉩니다. 각각의 스트림은 특정 용도와 데이터 형식에 맞춰 설계되었으며, 효율적인 데이터 처리를 위해 다양한 클래스가 제공됩니다.

Byte 스트림

Byte 스트림은 바이트 단위로 데이터를 읽고 쓰는 스트림입니다. 주로 바이너리 데이터를 처리하는 데 사용됩니다. 예를 들어, 이미지 파일, 오디오 파일, 비디오 파일 등은 바이트 스트림을 사용하여 처리할 수 있습니다.

주요 클래스

InputStream

  • FileInputStream
    파일로부터 바이트 단위로 데이터를 읽습니다.
  • ByteArrayInputStream
    메모리 내의 바이트 배열로부터 데이터를 읽습니다.
  • BufferedInputStream
    다른 InputStream에 버퍼링 기능을 추가하여 성능을 향상시킵니다.
  • DataInputStream
    기본 데이터 타입(int, float 등)을 읽기 위한 기능을 제공합니다.

OutputStream

  • FileOutputStream
    파일에 바이트 단위로 데이터를 씁니다.
  • ByteArrayOutputStream
    메모리 내의 바이트 배열에 데이터를 씁니다.
  • BufferedOutputStream
    다른 OutputStream에 버퍼링 기능을 추가하여 성능을 향상시킵니다.
  • DataOutputStream
    디본 데이터 타입(int, float 등)을 쓰기 위한 기능을 제공합니다.

예제

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class ByteStreamExample {
    public static void main(String[] args) {
        // 파일에 데이터 쓰기
        try (FileOutputStream fos = new FileOutputStream("byte_output.txt")) {
            String data = "Hello, Byte Stream!";
            fos.write(data.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 파일로부터 데이터 읽기
        try (FileInputStream fis = new FileInputStream("byte_output.txt")) {
            int byteData;
            while ((byteData = fis.read()) != -1) {
                System.out.print((char) byteData);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Character 스트림

  Character 스트림은 문자 단위로 데이터를 읽고 쓰는 스트림입니다. 주로 텍스트 데이터를 처리하는 데 사용됩니다. Java에서 문자는 2바이트 유니코드로 처리되므로, 캐릭터 스트림은 국제화된 텍스트 데이터를 처리하는 데 적합합니다.

주요 클래스

Reader

  • FileReader
    파일로부터 문자 데이터를 읽습니다.
  • CharArrayReader
    메모리 내의 문자 배열로부터 데이터를 읽습니다.
  • BufferedReader
    다른 Reader에 버퍼링 기능을 추가하여 성능을 향상시킵니다. 또한 readLine() 메서드를 제공하여 한 줄씩 읽을 수 있습니다.
  • InputStreamReader
    바이트 스트림을 문자 스트림으로 변환합니다.

Writer

  • FileWriter
    파일에 문자 데이터를 씁니다.
  • CharArrayWriter
    메모리 내의 문자 배열에 데이터를 씁니다.
  • BufferedWriter
    다른 Writer에 버퍼링 기능을 추가하여 성능을 향상시킵니다.
  • OutpufStreamWriter
    바이트 스트림을 문자 스트림으로 변환합니다.

예제

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CharacterStreamExample {
    public static void main(String[] args) {
        // 파일에 문자 데이터 쓰기
        try (FileWriter fw = new FileWriter("char_output.txt")) {
            String data = "Hello, Character Stream!";
            fw.write(data);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 파일로부터 문자 데이터 읽기
        try (FileReader fr = new FileReader("char_output.txt")) {
            int charData;
            while ((charData = fr.read()) != -1) {
                System.out.print((char) charData);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Byte 스트림과 Character 스트림 비교

  • 데이터 단위
    바이트 스트림은 바이트 단위로 데이터를 처리하며, 캐릭터 스트림은 문자 다누이로 데이터를 처리합니다.

  • 용도
    바이트 스트림은 바이너리 데이터를 처리하는 데 적합하고, 캐릭터 스트림은 텍스트 데이터를 처리하는데 적합합니다.

  • 유니코드 지원
    캐릭터 스트림은 유니코드 문자를 지원하여 국제화된 텍스트 데이터를 처리할 수 있습니다.

  • 버퍼링
    두 스트림 모두 버퍼링된 클래스를 제공하여 성능을 향상시킬 수 있습니다.


요약

  • Byte 스트림
    바이트 단위로 데이터를 읽고 쓰며, 바이너리 데이터를 처리하는데 사용됩니다. 주요 클래스는 InputStreamOutputStream입니다.

  • Character 스트림
    문자 단위로 데이터를 읽고 쓰며, 텍스트 데이터를 처리하는 데 사용됩니다. 주요 클래스는 ReaderWriter입니다.



4. 표준 스트림

표준 스트림은 자바 프로그램이 실행될 때 기본적으로 사용할 수 있는 세 가지 스트림을 의미합니다. 이 스트림들은 프로그램과 사용자 간의 기본적인 입출력을 처리하기 위해 저공됩니다. 표준 스트림에는 표준 입력 스트림, 표준 출력 스트림, 표준 오류 스트림이 있습니다.


표준 입력 스트림(Standard Input Stream)

 표준 입력 스트림은 기본적으로 키보드로부터 입력을 받는 스트림입니다. Java에서는 System.in 객체로 제공됩니다. 이 스트림은 InputStream 타입이며, 주로 콘솔에서 사용자 입력을 읽는 데 사용됩니다.

import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;

public class StandardInputExample {
    public static void main(String[] args) {
        System.out.println("Enter some text:");
        
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
            String input = reader.readLine();
            System.out.println("You entered: " + input);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

표준 출력 스트림(Standard Output Stream)

 표준 출력 스트림은 기본적으로 콘솔에 출력을 보내는 스트림입니다. Java에서는 System.out 객체로 제공됩니다. 이 스트림은 PrintStream 타입이며, 프로그램의 출력을 사용자에게 보여주는 데 사용됩니다.

public class StandardOutputExample {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
        System.out.println("This is an example of standard output.");
    }
}

표준 오류 스트림(Standard Error Stream)

 표준 오류 스트림은 기본적으로 오류 메시지를 콘솔에 출력하는 스트림입니다. Java에서는 System.err 객체로 제공됩니다. 이 스트림도 PrintStream 타입이며, 오류 메시지나 예외 정보를 출력하는 데 사용됩니다.

public class StandardErrorExample {
    public static void main(String[] args) {
        System.err.println("An error occurred!");
        System.err.println("This is an example of standard error output.");
    }
}

표준 스트림의 리디렉션

  Java에서는 표준 스트림을 다른 스트림으로 리디렉션 할 수 있습니다. 예를 들어, 파일로 출력을 리디렉션하거나 입력을 파일로부터 받을 수 있습니다. 이는 System.setIn(), System.setOut(), System.setErr() 메서드를 사용하여 가능합니다.

표준 출력 스트림 리디렉션

import java.io.FileOutputStream;
import java.io.PrintStream;
import java.io.IOException;

public class RedirectOutputExample {
    public static void main(String[] args) {
        try (PrintStream out = new PrintStream(new FileOutputStream("output.txt"))) {
            System.setOut(out);
            System.out.println("This will be written to the file instead of the console.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

표준 입력 스트림 리디렉션

import java.io.FileInputStream;
import java.io.IOException;

public class RedirectInputExample {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("input.txt")) {
            System.setIn(fis);
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println("Read from file: " + line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

요약

  • 표준 입력 스트림(System.in)
    기본적으로 키보드로부터 입력을 받는 스트림입니다. InputStream 타입이며, 주로 BufferedReader와 함께 사용하여 문자열 입력을 처리합니다.

  • 표준 출력 스트림(System.out)
    기본적으로 콘솔에 출력을 보내는 스트림입니다. PrintStream타입이며, println 메서드를 사용하여 텍스트를 출력합니다.

  • 표준 오류 스트림(System.err)
    기본적으로 콘솔에 오류 메시지를 보내는 스트림입니다. PrintStream 타입이며, 오류나 예외 정보를 출력합니다.

  • 리디렉션
    표준 스트림을 다른 스트림으로 리디렉션하여 입력을 파일에서 받거나 출력을 파일로 보낼 수 있습니다.



5. 파일 읽고 쓰기

파일 읽고 쓰기를 위해 Java는 다양한 클래스를 제공합니다. 파일 I/O는 크게 바이트 스트림과 문자 스트림의로 나뉘며, 각각의 스트림을 사용하여 파일을 읽고 쓸 수 있습니다.


바이트 스트림을 이용한 파일 읽기와 쓰기

  바이트 스트림은 파일의 데이터를 바이트 단위로 읽고 쓰는데 사용됩니다. 바이트 스트림은 바이너리 파일(이미지, 비디오, 오디오 파일 등)을 처리하는 데 적합합니다.

파일 읽기(FileInputStream)

FileInputStream 클래스를 사용하여 파일을 바이트 단위로 읽을 수 있습니다.

import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStreamExample {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("input.txt")) {
            int data;
            while ((data = fis.read()) != -1) {
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}



파일 쓰기(FileOutputStream)

FileOutputStream 클래스를 사용하여 파일에 바이트 단위로 데이터를 쓸 수 있습니다.

import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamExample {
    public static void main(String[] args) {
        try (FileOutputStream fos = new FileOutputStream("output.txt")) {
            String data = "Hello, World!";
            fos.write(data.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}



문자 스트림을 이용한 파일 읽기와 쓰기

  문자 스트림은 파일의 데이터를 문자 단위로 읽고 쓰는 데 사용됩니다. 문자 스트림은 텍스트 파일(.txt, .csv, .html 등)을 처리하는데 적합합니다.

파일 읽기(FileReader)

FileReader 클래스를 사용하여 파일을 문자 단위로 읽을 수 있습니다.

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

public class FileReaderExample {
    public static void main(String[] args) {
        try (FileReader fr = new FileReader("input.txt")) {
            int data;
            while ((data = fr.read()) != -1) {
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}



파일 쓰기(FileWriter)

FileWriter 클래스를 사용하여 파일에 문자 단위로 데이터를 쓸 수 있습니다.

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

public class FileWriterExample {
    public static void main(String[] args) {
        try (FileWriter fw = new FileWriter("output.txt")) {
            String data = "Hello, World!";
            fw.write(data);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}



버퍼링된 스트림을 이용한 파일 읽기와 쓰기

  버퍼링된 스트림은 데이터의 입출력 성능을 향상시키기 위해 사용됩니다. 버퍼를 사용하여 데이터를 한 번에 더 많이 읽거나 쓸 수 있습니다.


파일 읽기(BufferedReader)

BufferedReader 클래스를 사용하여 파일을 효율적으로 읽을 수 있습니다.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderExample {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new FileReader("input.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}



파일 쓰기(BufferedWriter)

BufferedWriter 클래스를 사용하여 파일에 효율적으로 데이터를 쓸 수 있습니다.

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWriterExample {
    public static void main(String[] args) {
        try (BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
            String data = "Hello, World!";
            bw.write(data);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}



데이터 스트림을 이용한 파일 읽기와 쓰기

데이터 스트림은 기본 데이터 타입(int, float, double 등)을 입출력하는 데 사용됩니다.


파일 쓰기(DataOutputStream)

DataOutputStream 클래스를 사용하여 파일에 기본 데이터 타입을 쓸 수 있습니다.

import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class DataOutputStreamExample {
    public static void main(String[] args) {
        try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.bin"))) {
            dos.writeInt(123);
            dos.writeFloat(4.56f);
            dos.writeUTF("Hello, World!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}



파일 읽기(DataInputStream)

DataInputStream 클래스를 사용하여 파일로부터 기본 데이터 타입을 읽을 수 있습니다.

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class DataInputStreamExample {
    public static void main(String[] args) {
        try (DataInputStream dis = new DataInputStream(new FileInputStream("data.bin"))) {
            int intValue = dis.readInt();
            float floatValue = dis.readFloat();
            String strValue = dis.readUTF();
            System.out.println("Read values: " + intValue + ", " + floatValue + ", " + strValue);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}



파일 복사 예제

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileCopyExample {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("source.txt");
             FileOutputStream fos = new FileOutputStream("destination.txt")) {
             
            byte[] buffer = new byte[1024];
            int bytesRead;
            
            while ((bytesRead = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, bytesRead);
            }
            
            System.out.println("File copied successfully.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}



요약

  • 바이트 스트림
    FileInputStreamFileOutputStream을 사용하여 파일의 데이터를 바이트 단위로 읽고 씁니다.

  • 문자 스트림
    FileReaderFileWriter를 사용하여 파일의 데이터를 문자 단위로 읽고 씁니다.

  • 버퍼링된 스트림
    BufferedReaderBufferedWriter를 사용하여 효율적으로 파일을 읽고 씁니다.

  • 데이터 스트림
    DataInputStreamDataOutputStream을 사용하여 기본 데이터 타입을 파일로부터 읽고 씁니다.



profile
안녕나를소개하지이름은HaBu직업은Programer취미는tai chi meditation

0개의 댓글