파일 입출력(I/O)

귀찮Lee·2022년 5월 22일
0

Java

목록 보기
12/15

◎ InputStream, OutputStream

  • 자바에서는 입출력을 다루기 위한 InputStream, OutputStream을 제공
  • 스트림은 단방향으로만 데이터를 전송할 수 있기에, 입력과 출력을 동시에 처리하기 위해서는 각각의 스트림이 필요
  • 입출력 스트림 : 어떤 대상을 다루느냐에 따라 종류를 나눔
    • FileInputStream / FileOutputStream : File을 다룸
    • PipedInputStream / PipedOutputStream : 프로세스를 다룸

◎ FileInputStream & FileOutputStream

  • FileInputStream

    • 가장 빈번하게 사용
    • 파일에서 값을 바이트 단위로 값을 가져옴
  • BufferedInputStream

    • FileInputStream의 보조 스트림, 성능이 향상
    • 여러 바이트를 저장하여 한 번에 많은 양의 데이터를 입출력할 수 있도록 도와주는 임시 저장 공간
long beforeTime = System.currentTimeMillis();
for (int in = 0; in < 10000; in++) {

    try {
        FileInputStream fileInput = new FileInputStream("codestates.txt");

        int i = 0;
        while ((i = fileInput.read()) != -1) { //fileInput.read()의 리턴값을 i에 저장한 후, 값이 -1인지 확인합니다.
            System.out.print((char) i);
        }
        fileInput.close();
    } catch (Exception e) {
        System.out.println(e + " ");
        System.out.println("ERROR!");
    }

}

long afterTime = System.currentTimeMillis();
System.out.println(afterTime - beforeTime); // 550 (10000번 실행시 걸린 시간)


long beforeTime2 = System.currentTimeMillis();
for (int in = 0; in < 10000; in++){

    try {
        FileInputStream fileInput = new FileInputStream("codestates.txt");
        BufferedInputStream bufferedInput = new BufferedInputStream(fileInput);
        int i = 0;
        while ((i = bufferedInput.read()) != -1) {
            System.out.print((char)i);
        }
        fileInput.close();
    }
    catch (Exception e) {
        System.out.println(e);
    }
}

long afterTime2 = System.currentTimeMillis();
System.out.println(afterTime2 - beforeTime2); // 477 (10000번 실행시 걸린 시간)
  • FileOutputStream

    • OutputStream 중에 가장 빈번하게 사용
    • 바이트 기반 스트림 (입출력 단위가 1byte)
    try {
        FileOutputStream fileOutput = new FileOutputStream("codestates.txt");
        String word = "code";
    
        byte b[] = word.getBytes();
        fileOutput.write(b);
        fileOutput.close();
    }
    catch (Exception e) {
        System.out.println(e);
    }

◎ FileReader & FileWriter

  • FileReader & FileWriter

    • 앞서 살펴본 FileInputStream & FileOutputStream 은 바이트 기반 스트림이지만, java의 char는 2byte이다. (문자가 이상하게 출력될 가능성이 농후)
    • 따라서 java에서 FileReader와 FileWriter라는 문자 기반 스트림 제공
  • FileReader & BufferedReader

    • 바이트 기반 스트림과 마찬가지로, Reader에도 성능을 개선할 수 있는 BufferedReader가 있음
long beforeTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++){
    try {
        String fileName = "codestates.txt";
        FileReader file = new FileReader(fileName);

        int data = 0;

        while((data=file.read()) != -1) {
            System.out.print((char)data);
        }
        file.close();
    }
    catch (IOException e) {
        e.printStackTrace();
    }
}

long afterTime = System.currentTimeMillis();
System.out.println(afterTime - beforeTime); // 534



long beforeTime2 = System.currentTimeMillis();
for (int i = 0; i < 10000; i++){
    try {
        String fileName = "codestates.txt";
        FileReader file = new FileReader(fileName);
        BufferedReader buffered = new BufferedReader(file);

        int data = 0;

        while((data=buffered.read()) != -1) {
            System.out.print((char)data);
        }
        file.close();
    }
    catch (IOException e) {
        e.printStackTrace();
    }
}

long afterTime2 = System.currentTimeMillis();
System.out.println(afterTime2 - beforeTime2); // 522
  • FileWriter
    • 문자 기반 스트림의 OutputStream
try {
    String fileName = "codestates.txt";
    FileWriter writer = new FileWriter(fileName);

    String str = "백현우가 8수를 진행합니다.";
    writer.write(str);
    writer.close();
}
catch (IOException e) {
    e.printStackTrace();
}

◎ File

  • File 클래스로 파일과 디렉토리에 접근 가능
  • Method
import java.io.*;

public class FileExample {
    public static void main(String args[]) throws IOException {
        File file = new File("../codestates.txt");

        System.out.println(file.getPath()); // ..\codestates.txt (파일의 위치를 나타냄)
        System.out.println(file.getParent()); // ..\  상위의 폴더의 위치를 나타냄
        System.out.println(file.getCanonicalPath()); // C:\Users\c\Desktop\Codestate\000_Test\codestates.txt  이 위치하는 절대위치를 나타냄
        System.out.println(file.canWrite()); // true 파일 변경 여부 확인
        
        
        // 위치와 파일 이름을 지정 (인스턴스를 만든다고 만들어지지는 않음)
        File file = new File("./", "newCodestates.txt");
        file.createNewFile(); // 파일 만들기
        
        
        // 폴더을 지정해 안에 있는 파일들을 지정 가능
        File parentDir = new File("./");
        File[] list = parentDir.listFiles(); // 현재 위치에 있는 파일을 배열로 만듦
		
        // 반복문 작업도 가능
        String prefix = "code";
        for(int i =0; i <list.length; i++) {
            String fileName = list[i].getName(); 

			if(fileName.endsWith("txt") && !fileName.startsWith("code")) {
                list[i].renameTo(new File(parentDir, prefix + fileName));
            }
        }
    }
}
profile
배운 것은 기록하자! / 오류 지적은 언제나 환영!

0개의 댓글