티스토리 뷰

반응형

✏️ 스트림 입출력

입출력 스트림이란 응용프로그램과 입출력 장치를 연결하는 소프트웨어 모듈을 뜻한다. 입력 스트림은 키보드 장치를 제어하여 사용자의 키 입력을 받아 응용프로그램에게 전달하고, 응용프로그램은 출력 스트림에 연결하고 출력 스트림에 출력하면, 출력 스트림은 다른 끝단에 연결된 출력 장치를 제어하여 출력을 완성한다. 입출력 스트림의 특징은 다음과 같다.

  • 스트림의 양끝에는 입출력 장치와 자바 응용프로그램이 연결된다.
  • 스트림은 단방향이다.
  • 스트림을 통해 흘러가는 기본 단위는 바이트나 문자이다.
  • 스트림은 선입선출, 즉 FIFO 구조이다.

 

✏️ 바이트 스트림과 문자 스트림

 

자바에서 입출력 스트림은 문자 스트림(character stream)바이트 스트림(byte stream)의 2종류가 있다. 문자 스트림은 문자만 다루기 때문에, 문자가 아닌 데이터가 출력되면 보이지 않거나 엉뚱한 기호가 출력되며, 문자가 아닌 정보가 입력되면 응용프로그램에게 엉뚱한 문자가 전달되는 오류가 발생한다. 주의할 점으로는 자바에서 char 타입은 2바이트이다.
바이트 스트림(byte stream)은 바이트를 단위로 다루는 스트림으로, 스트림에 들어오고 나가는 정보를 단순 바이너리(비트들)로 다루기 때문에, 문자이든 이미지 바이트든 상관없이 흘려보낸다. 아래 사진은 스트림 클래스 계층 구조이다.

 

 

 

✏️ 스트림 연결

스트림은 서로 연결할 수 있는데, 자바 응용프로그램에서 바이트 스트림과 문자 스트림을 연결하여 사용할 수 있다. 아래 코드를 보자

InputStreamReader rd = new InputStreamReader(System.in);
int c = rd.read();
 
/*
첫 번째 문장은 키보드로부터 문자를 입력받기 위해 표준 입력 스트림은 
System.in과 InputStreamReader 스트림 객체를 연결한다
이렇게 두 스트림을 연결하면, System.in은 사용자의 키 입력을 받아 바이트 스트림으로 내보내며,
rd는 들어오는 바이트 스트림을 문자로 구성하여 응용프로그램에게 전달한다.
이때, 두 번째 문장을 통해 자바 응용프로그램이 사용자가 입력한 문자를 읽을 수 있다.
*/

 

 

✏️ 문자 스트림 클래스

문자 스트림은 2바이트의 유니코드 문자를 단위로 입출력하는 스트림이다. 문자화되지 않는 바이너리 바이트 값들은 문자 스트림 클래스에서 처리할 수 없기 때문에, 이미지와 같은 바이너리 정보는 처리할 수 없다. 즉, 문자 입력 스트림은 바이트들을 전달받고 이 바이트들을 로컬 문자 집합에 있는 문자인지 비교하여 문자로 변환시킨다.

 

파일 입력 스트림 생성

FileReader fin = new FileReader("c:\\test.txt");
/* 파일 입력 스트림을 생성하고 스트림을 파일과 연결 */

 

 파일 읽기

int c;
while((c=fin.read())!=-1){
  System.out.print((char)c);
}
/* 파일 입력 스트림(fin)을 이용하여 파일 읽기
fin.read()는 연결된 파일로부터 문자 하나를 읽어서 리턴하며, 파일의 끝(EOF)를 만나면 -1을 리턴 */
char [] buf = new char[1024];
int n = fin.read(buf);
/* 파일이 큰 경우에는 위와 같이 블록의 단위로 파일을 읽을 수 있다. */

 

FileReader의 생성자

생성자 설명
FileReader(File file) file로부터 읽는 FileReader 생성
FileReader(String name) name 이름의 파일로부터 읽는 FileReader 생성

 

FileReader, Reader, InputStreamReader의 공통 주요 메소드

메소드 설명
int read() 한 개의 문자를 읽어 정수형으로 리턴
int read(char[] buf) 문자들을 읽어 buf 배열에 저장하고 읽은 개수 리턴
int read(char[] cbuf, int off, int len) 최대 len 개수의 문자들을 읽어 cbuf 배열의 off 위치부터 저장하고 실제 읽은 개수 리턴
String getEncoding() 스트림이 사용하는 문자 집합의 이름 리턴
void close() 입력 스트림을 닫고 관련된 시스템 자원 해제

 

 FileReader로 텍스트 파일 읽기

package ex;
import java.io.*;
public class FileReaderEx {
    public static void main(String[] args) {
        FileReader fin = null;
        try{
            fin = new FileReader("c:\\Windows\\system.ini");
            int c;
            while((c= fin.read())!=-1)
                System.out.print((char)c);
            fin.close();
        }
        catch (IOException e){
            System.out.println("입출력 오류");
        }
    }
}

/* 출력 결과
; for 16-bit app support
[386Enh]
woafont=dosapp.fon
EGA80WOA.FON=EGA80WOA.FON
EGA40WOA.FON=EGA40WOA.FON
CGA80WOA.FON=CGA80WOA.FON
CGA40WOA.FON=CGA40WOA.FON

[drivers]
wave=mmdrv.dll
timer=timer.drv

[mci]
*/

 

 

✏️ InputStreamReader

● InputStreamReader의 생성자

생성자 설명
InputStreamReader(InputStream in) in으로부터 읽는 기본 문자 집합의
InputStreamReader 생성
InputStreamReader(InputStream in, Charset cs) in으로부터 읽는 cs 문자 집합의
InputStreamReader 생성
InputStreamReader(InputStream in, String charsetName) in으로부터 읽는 charsetName 문자 집합의
InputStreamReader 생성

 

● InputStreamReader로 문자 입력 스트림 생성

FileInputStream fin = new FileInputStream("c:\\Temp\\hangul.txt");
/* 텍스트 파일을 읽기 위해 바이트 파일 입력 스트림을 먼저 생성 */
InputStreamReader in = new InputStreamReader(fin, "MS949");
/* MS949로 문자 집합을 지정 후 fin에서 읽어 들인 바이트들을 문자로 인코딩 */

 

● InputStreamReader를 이용하여 MS949 문자 집합으로 한글 텍스트 파일 읽고 출력

package ex;
import java.io.*;
public class InputStreamReaderEx {
    public static void main(String[] args) {
        InputStreamReader in = null;
        FileInputStream fin = null;
        try{
            fin = new FileInputStream("c:\\Temp\\hangul.txt");
            in = new InputStreamReader(fin,"MS949");
            int c;

            System.out.println("인코딩의 문자 집합은 "+in.getEncoding());
            while((c=in.read())!=-1)
                System.out.print((char)c);
            in.close();
            fin.close();
        }
        catch (IOException e) {
            System.out.println("입출력 오류");
        }
    }
}

/* 직접 hangul.txt를 만들어서 실행해보자 */

 

 

✏️ FileWriter

● 파일 출력 스트림 생성

FileWriter fout = new FileWriter("c:\\Temp\\test.txt")
/* c:\\Temp\\test.txt. 파일을 열어 스트림과 연결한다. 파일이 없는 경우에는 빈 파일을 생성하며,
이미 파일이 있는 경우에는 파일 내용을 지우고 파일의 처음부터 쓸 준비를 한다. */

 

● 파일 쓰기

// 한 글자씩 파일에 쓰기
fout.write('A'); // 문자 'A'를 파일에 저장

// 블록 단위로 파일에 쓰기
char [] buf = new char[1024];
fout.write(buf, 0, buf.length); // buf[] 배열의 처음부터 배열 크기만큼 쓰기

 

● 스트림 닫기

fout.close(); // 스트림을 닫으므로 더 이상 기록할 수 없음

 

● FileWriter와 OutputStreamWriter의 생성자

생성자 설명
OutputStreamWirter(OutputStream out) out에 출력하는 기본 문자 집합의 OutputStreamWriter 생성
OutputStreamWriter(OutputSteam out, Charset cs) out에 출력하는 cs 문자 집합의 OutputStreamWriter 생성
OutputStreamWriter(OutputStream out, String charsetName) charsetName 문자 집합의 OutputStreamWriter 생성
FileWriter(File file) file에 데이터를 저장할 FileWriter 생성
FileWriter(String name) name 파일에 데이터를 저장할 FileWriter 생성
FileWriter(File file, boolean append) FileWriter를 생성하며 appendtrue라면 파일의 마지막부터
데이터를 저장
FileWriter(String name, boolean append) FileWriter를 생성하며 appendtrue라면 파일의 마지막부터
데이터를 저장

 

● FileWriter와 OutputStreamWriter의 주요 메소드

메소드 설명
void write(int c) cchar로 변환하여 한 개의 문자 출력
void write(String str) 문자열 str 출력
void write(String str, int off, int len) 인덱스 off부터 len개의 문자를 str 문자열에서 출력
void write(char []cbuf, int off, int len) 인덱스 off부터 len개의 문자를 배열 cbuf에서 출력
void flush() 스트림에 남아있는 데이터 모두 출력
String getEncoding() 스트림이 사용하는 문자 집합의 이름 리턴
void close() 출력 스트림을 닫고 관련된 시스템 자원 해제

 

● FileWriter 예제(Scanner를 이용하여 입력받은 데이터를 text 파일에 저장하기)

package ex;
import java.util.*;
import java.io.*;
public class FileWriterEx {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        FileWriter fout = null;
        int c;
        try{
            fout = new FileWriter("c:\\Temp\\test.txt");
            while(true){
                String line = scanner.nextLine();
                if(line.length()==00)
                    break;
                fout.write(line,0,line.length());
                fout.write("\r\n",0,2);
            }
            fout.close();
        }
        catch (IOException e){
            System.out.println("입출력 오류");
        }
        scanner.close();
    }
}

/* 입력
I love Java.
나는 자바를 좋아합니다 
*/

 

 

✏️ 바이트 스트림 클래스

바이트 스트림은 바이트 단위로 바이너리 데이터가 흐르는 스트림으로, 바이너리 데이터를 있는 그대로 입출력하기 때문에 이미지나 동영상 파일 입출력에 필수적이며, 문자들로 구성된 텍스트 파일도 입출력 할 수 있다. 아래에 나오는 클래스들은 대표적인 바이트 입출력 스트림 클래스이다.

  • InputStream / OutputStream : 추상 클래스이며, 바이트 입출력 처리를 위한 공통 기능을 가진 슈퍼 클래스
  • FileInputStream / FileOutputStream : 파일 입출력을 위한 클래스, 파일로부터 바이너리 데이터를 읽거나 파일에 바이너리 데이터를 저장할 수 있음
  • DataInputStream / DataOutputStream : boolean, char, byte, short, int, long, float, double 타입의 값을 바이너리 형태로 입출력하며 문자열도 바이너리 형태로 입출력한다.

● FileOutputStream 클래스의 생성자

생성자 설명
FileOutputStream(File file) file이 지정하는 파일에 출력하는 FileOutputStream 생성
FileOutputStream(String name) name이 지정하는 파일에 출력하는 FileOutputStream 생성
FileOutputStream(File file, boolean append) FileOutputStream을 생성하며 appendtrue이면 file
지정하는 파일의 마지막부터 데이터 저장
FileOutputStream(String name, boolean append) FileOutputStream을 생성하며 appendtrue이면 name
이름의 파일의 마지막부터 데이터 저장

 

● FileOutputStream과  OutputStream의 공통 주요 메소드

메소드 설명
void write(int b) int형으로 넘겨진 한 바이트를 출력 스트림으로 출력
void wrtie(byte[] b) 배열 b의 바이트를 모두 출력 스트림으로 출력
void write(byte[] b, int off, int len) len 크기만큼 off부터 배열 b를 출력 스트림으로 출력
void flush() 출력 스트림에서 남아 있는 바이너리 데이터 모두 출력
void close() 출력 스트림을 닫고 관련된 시스템 자원 해제

 

● 파일 출력 스트림 생성

FileOutputStream fout = new FileOutputStream("c:\\Temp\\test.txt");

 

● 파일 쓰기

// 배열을 파일에 저장하기
byte b[] = {7,51,3,4,-1,24};
for(int i=0; i<b.length;i++)
   fout.wrtie(b[i]);
    
// for문 없이 한 번에 배열을 저장할 수도 있다.
fout.write(b);

 

● FileOutputStream으로 바이너리 파일 쓰기

package ex;
import java.io.*;
public class FileOutputStreamEx {
    public static void main(String[] args) {
        byte b[] = {7,51,3,4,-1,24};

        try{
            FileOutputStream fout = new FileOutputStream("c:\\Temp\\test1.out");
            for(int i=0;i<b.length;i++)
                fout.write(b[i]);
            fout.close();
        }
        catch (IOException e){
            System.out.println("c:\\Temp\\text1.out에 저장할 수 없습니다.");
            return;
        }
        System.out.println("c:\\Temp\\text1.out에 저장하였습니다.");
    }
}

 

● FileInputStream 클래스의 생성자

생성자 설명
FileInputStream(File file) file이 지정하는 파일로부터 읽는 FileInputStream 생성
FileInputStream(String name) name이 지정하는 파일로부터 읽는 FileInputStream 생성

 

● FileInputStream과 InputStream의 공통 주요 메소드

메소드 설명
int read() 입력 스트림에서 한 바이트를 읽어 int형으로 리턴
int read(byte[] b) 최대 배열 b의 크기만큼 바이트를 읽음, 읽는 도중
EOF를 만나면 실제 읽은 바이트 수 리턴
int read(byte[] b, int off, int len) 최대 len개의 바이트를 읽어 b 배열의 off 위치부터 저장. 읽는 도중
EOF를 만나면 실제 읽은 바이트 수 리턴
int available() 입력 스트림에서 현재 읽을 수 있는 바이트 수 리턴
void close() 입력 스트림을 닫고 관련된 시스템 자원 해제

 

● 파일 입력 스트림 생성

// c:\Temp\test.out 파일을 찾아 열고, 이 파일을 연결한 스트림 fin을 생성
FileInputStream fin = new FileInputStream("c:\\Temp\\test.out");

 

● 파일 읽기

// 파일에 저장된 바이트들을 읽어 배열 byte b[]에 다시 채우기
byte b[] = new byte[6];
int n=0, c;
while((c=fin.read())!=-1){
    b[n] = (byte)c;
    n++;
}

// while문을 사용하지 않고 파일에 저장된 바이트를 한 번에 배열로 읽어들이기
fin.read(b);

// 스트림 닫기
fin.close();

 

● FileInputStream으로 바이너리 파일 읽기

package ex;
import java.io.*;
public class FileInputStreamEx {
    public static void main(String[] args) {
        byte[] b = new byte[6];
        try{
            FileInputStream fin = new FileInputStream("c:\\Temp\\test1.out");
            int n=0,c;
            while((c= fin.read())!=-1){
                b[n]=(byte)c;
                n++;
            }
            System.out.println("주어진 경로에서 읽은 배열을 출력합니다.");
            for(int i=0;i<b.length;i++)
                System.out.print(b[i]+" ");
            System.out.println();
            fin.close();
        }
        catch (IOException e){
            System.out.println("제대로 읽어들이지 못했습니다. 경로명을 확인해 주세요.");
        }
    }
}

/*
주어진 경로에서 읽은 배열을 출력합니다.
7 51 3 4 -1 24 
*/

 

 

✏️ 버퍼 입출력

버퍼란 데이터를 일시적으로 저장하기 위한 메모리이다. 파일 출력 스트림이 파일에 쓸 데이터를 버퍼에 모아 두었다가, 한 번에 운영체제 API를 호출하여 파일에 쓰게 하면, 운영체제의 부담을 줄이고 장치를 구동하는 일이 줄어들게 되어 시스템의 속도나 효울이 올라가게 된다. 위에서 봤던 입출력 스트림들은 버퍼를 가지지 않는 unbuffered I/O 방식이다. 버퍼 입출력이란 입출력 스트림이 버퍼를 가지고 보다 효율적으로 입출력을 처리하는 방식이고, 버퍼를 가지는 스트림을 버퍼 스트림(buffer stream)이라고 한다.
버퍼 스트림 역시 데이터의 타입에 따라 바이트 버퍼 스트림문자 버퍼 스트림으로 구본된다. 바이트 버퍼 스트림을 구현한 입출력 클래스는 BufferedInputStream BufferedOutputStream이 있으며 문자 버퍼 스트림을 구현한 클래스로는 BufferedReaderBuffered Writer가 있다.

 

● 바이트 버퍼 스트림 클래스의 생성자

생성자 설명
BufferedInputStream(InputStream in) in을 연결하는 디폴트 크기의 입력 버퍼 스트림 객체 생성
BufferedInputStream(InputStream in, int size) in을 연결하는 size 크기의 입력 버퍼 스트림 객체 생성
BufferedOutputStream(OutputStream out) out을 연결하는 디폴트 크기의 출력 버퍼 스트림 객체 생성
BufferedOutputStream(OutputStream out, int size) out을 연결하는 size 크기의 출력 버퍼 스트림 객체 생성

 

● 문자 버퍼 스트림 클래스의 생성자

생성자 설명
BufferedReader(Reader in) in을 연결하는 디폴트 크기의 문자 입력 버퍼 스트림 생성
BufferedReader(Reader in, int sz) in을 연결하는 sz 크기의 문자 입력 버퍼 스트림 생성
BufferedWriter(Writer out) out을 연결하는 디폴트 크기의 문자 출력 버퍼 스트림 생성
BufferedWriter(Writer out, int sz) out을 연결하는 sz 크기의 문자 출력 버퍼 스트림 생성

 

● 버퍼 출력 스트림 생성

BufferedOutputStream bout = new BufferedOutputStream(System.out, 20);
// 앞 라인은 20바이트 크기의 버퍼를 가지고, 표준 출력 스트림에 연결하여 화면에 출력하는 버퍼 스트림 생성

 

● 스트림 출력

// c:\windows\system.ini 파일을 읽어, 버퍼 출력 스트림을 통해 화면에 출력하기
FilerReader fin = new FileReader("c:\\windows\\system.ini");
int c;
while((c=fin.read())!=-1){
    bout.write((char)c);
}

// 버퍼에 남아 있는 데이터 출력
bout.flush();

// 스트림 닫기
bout.close();
fin.close();

 

● 버퍼 스트림을 이용한 출력

package ex;
import java.util.Scanner;
import java.io.*;

public class BufferedIOEx {
    public static void main(String[] args) {
        FileReader fin = null;
        int c;
        try{
            fin = new FileReader("C:\\Temp\\test2.txt");
            BufferedOutputStream out = new BufferedOutputStream(System.out,5);
            while((c= fin.read())!=-1){
                out.write(c);
            }

            new Scanner(System.in).nextLine();
            out.flush();
            out.close();
            fin.close();
        }
        catch(IOException e){
            e.printStackTrace();
        }
    }
}

/*
test2.txt에 미리 12345 678 입력해놓기
*/

 

 

✏️ File 클래스

File 클래스는 파일이나 디렉터리에 대해, 경로명, 크기, 타입, 수정 날짜 등의 속성 정보를 제공하고, 파일 삭제, 디렉터리 생성, 파일 이름 변경, 디렉터리 내의 파일 리스트 제공 등 다양한 파일 관리 작업을 지원한다. File 클래스의 경로명은 java.io.File이고 File 클래스는 파일 입출력 기능은 제공하지 않는다.

 

● File 클래스의 생성자

생성자 설명
File(File parent, String child) parent 디렉터리에 child 이름의 서브 디렉터리나 파일을 나타내는 File 객체 생성
File(String pathname) pathname의 완전 경로명이 나타내는 File 객체 생성
File(String parent, String child) parent 디렉터리에 child 이름의 서브 디렉터리나 파일을 나타내는 File 객체 생성
File(URI uri) file:URI를 추상 경로명으로 변환하여 File 객체 생성

 

● File 클래스의 주요 메소드

메소드 설명
boolean mkdir() 새로운 디렉터리 생성
Stirng[] list() 디렉터리 내의 파일과 서브 디렉터리 리스트를 문자열 배열로 리턴
File [] listFiles() 디렉터리 내의 파일과 서브 디렉터리 리스트를 File[] 배열로 리턴
boolean renameTo(File dest) dest가 지정하는 경로명으로 파일 이름 변경
boolean delete() 파일 또는 디렉터리 삭제
long length() 파일의 크기 리턴
String getPath() 경로명 전체를 문자열로 변환하여 리턴
String getParent() 파일이나 디렉터리의 부모 디렉터리 이름 리턴
String getName() 파일 또는 디렉터리 이름을 문자열로 리턴
boolean isFile 일반 파일이면 true 리턴
boolean isDirectory() 디렉터리이면 true 리턴
long lastModified() 파일이 마지막으로 변경된 시간 리턴
boolean exists() 파일 또는 디렉터리가 존재하면 true 리턴

 

● File 객체 생성

File f = new File("c:\\Temp\\test.txt"); 
File f = new File("c:\\Temp", "test.txt"); // 디렉터리와 파일명을 나누어 전달

 

● 파일 크기와 경로명

// 파일 크기
File f = new File("c:\\windows\\system.ini");
long size = f.length(); // size=219

// 파일의 경로명
String filename = f.getName(); // "system.ini", 파일명만 리턴
String path = f.getPath(); // "c:\\windows\\system.ini", 완전경로명을 리턴
String parent = f.getParent(); // "c:\\windows", 부모 디렉터리를 문자열로 리턴

 

● File 클래스를 활용한 파일 관리

package ex;
import java.io.*;
public class FileEx {

    public static void listDirectory(File dir){
        System.out.println("----"+dir.getPath()+"의 서브 리스트 입니다.----");

        File[] subFiles = dir.listFiles(); // 디렉터리에 포함된 파일과 디렉토리 이름의 리스트 얻기

        for(int i=0;i<subFiles.length;i++){ // subFiles 배열의 각 File에 대해 루프
            File f =  subFiles[i];
            long t = f.lastModified(); // 마지막으로 수정된 시간
            System.out.print(f.getName()); 
            System.out.println("\t파일 크기: "+f.length()); // 파일 크기
            System.out.printf("\t수정한 시간: %tb %td %ta %tT\n",t,t,t,t);
        }
    }

    public static void main(String[] args) {
        File f1 = new File("c:\\windows\\system.ini");
        System.out.println(f1.getPath()+" , "+f1.getParent()+" , "+f1.getName());

        String res = "";
        if(f1.isFile()) // 파일 타입이라면
            res="파일";
        else if(f1.isDirectory()) // 디렉터리 타입이라면
            res="디렉터리";
        System.out.println(f1.getPath()+"은 "+res+" 입니다.");

        File f2 = new File("c:\\Temp\\java_sample");
        if(!f2.exists()) // 파일이 존재하지 않는다면 만들기
            f2.mkdir();

        listDirectory(new File("c:\\Temp")); // c:\\Temp에 있는 파일 리스트 출력
        f2.renameTo(new File("c:\\Temp\\javasample")); // 이름 변경

        listDirectory(new File("c:\\Temp"));
    }
}

/*
C:\Users\CKIRUser\.jdks\openjdk-22\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2023.3.6\lib\idea_rt.jar=1675:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2023.3.6\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath C:\Users\CKIRUser\pooreum\java_s\out\production\java_s ex.FileEx
c:\windows\system.ini , c:\windows , system.ini
c:\windows\system.ini은 파일 입니다.
----c:\Temp의 서브 리스트 입니다.----
AUtempR	파일 크기: 0
	수정한 시간: 4월 16 화 20:50:38
java_sample	파일 크기: 0
	수정한 시간: 6월 10 월 20:41:26
KTNET	파일 크기: 0
	수정한 시간: 2월 07 수 08:19:20
NEO2	파일 크기: 0
	수정한 시간: 6월 05 금 16:29:46
test.txt	파일 크기: 48
	수정한 시간: 6월 10 월 16:09:32
test1.out	파일 크기: 6
	수정한 시간: 6월 10 월 16:23:29
test2.txt	파일 크기: 10
	수정한 시간: 6월 10 월 20:04:24
중앙관리시스템_Agent	파일 크기: 0
	수정한 시간: 6월 22 월 14:36:24
----c:\Temp의 서브 리스트 입니다.----
AUtempR	파일 크기: 0
	수정한 시간: 4월 16 화 20:50:38
javasample	파일 크기: 0
	수정한 시간: 6월 10 월 20:41:26
KTNET	파일 크기: 0
	수정한 시간: 2월 07 수 08:19:20
NEO2	파일 크기: 0
	수정한 시간: 6월 05 금 16:29:46
test.txt	파일 크기: 48
	수정한 시간: 6월 10 월 16:09:32
test1.out	파일 크기: 6
	수정한 시간: 6월 10 월 16:23:29
test2.txt	파일 크기: 10
	수정한 시간: 6월 10 월 20:04:24
중앙관리시스템_Agent	파일 크기: 0
	수정한 시간: 6월 22 월 14:36:24

Process finished with exit code 0
*/

 

 

✏️ 파일 복사

● 텍스트 파일 복사 : FileReader와 FilerWriter를 이용하기

package ex;
import java.io.*;
public class TextCopyEx {
    public static void main(String[] args) {
        File src = new File("c:\\windows\\system.ini"); // 원본 파일 경로명
        File dest = new File("c:\\Temp\\system.txt"); // 복사 파일 경로명

        int c;
        try{
            FileReader fr = new FileReader(src); // 파일 입력 문자 스트림 생성
            FileWriter fw = new FileWriter(dest); // 파일 출력 문자 스트림 생성
            while((c= fr.read())!=-1) // 문자를 읽고
                fw.write(c); // 문자를 씀
            fr.close();
            fw.close();
            System.out.println(src.getPath()+"를 "+dest.getPath()+"로 복사하였습니다.");
        }
        catch (IOException e) {
            System.out.println("파일 복사 오류");
        }
    }
}

 

● 바이너리파일 복사 : FileInputStream과 FileOutputStream 이용해서 이미지 파일 복사

package ex;
import java.io.*;
public class BinaryCopyEx {
    public static void main(String[] args) {
        File src = new File("c:\\Windows\\Web\\Wallpaper\\Theme1\\img1.jpg");

        File dest = new File("c:\\Temp\\copyimg.jpg");

        int c;
        try{
            FileInputStream fi = new FileInputStream(src);
            FileOutputStream fo = new FileOutputStream(dest);

            while((c=fi.read())!=-1)
                fo.write((byte)c);
            fo.close();
            fi.close();
            System.out.println(src.getPath()+"를 "+dest.getPath()+"로 복사하였습니다.");
        }
        catch (IOException e){
            System.out.println("파일 복사 오류");
        }
    }
}

 

● 블록 단위로 파일 고속 복사

package ex;
import java.io.*;
public class BlockBinaryCopyEx {
    public static void main(String[] args) {
        File src = new File("c:\\Windows\\Web\\Wallpaper\\Theme1\\img1.jpg");

        File dest = new File("c:\\Temp\\desert.jpg");

        try{
            FileInputStream fi = new FileInputStream(src);
            FileOutputStream fo = new FileOutputStream(dest);
            byte [] buf = new byte[1024*10];
            while(true){
                int n = fi.read(buf);
                fo.write(buf,0,n);
                if(n<buf.length)
                    break;
            }
            fi.close();
            fo.close();
            System.out.println(src.getPath()+"를 "+dest.getPath()+"로 복사하였습니다.");
        }
        catch (IOException e){
            System.out.println("파일 복사 오류");
        }
    }
}

 

반응형

'PL > JAVA' 카테고리의 다른 글

[JAVA] 자바 - 이벤트  (0) 2024.06.12
[JAVA] 자바 - GUI 기초(AWT와 스윙)  (2) 2024.06.11
[JAVA] 자바 - 제네릭과 컬렉션  (2) 2024.06.07
[JAVA] 자바 - 모듈과 패키지 2  (2) 2024.05.28
[JAVA] 자바 - 모듈과 패키지  (0) 2024.05.27
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함