관리 메뉴

거니의 velog

230905_입출력 1 본문

대덕인재개발원_자바기반 애플리케이션

230905_입출력 1

Unlimited00 2023. 9. 4. 16:27

입출력 명령어 배우기 전에 파일을 많이 다루므로 먼저 배우도록 한다.

파일과 디렉토리를 동시에 다룰 수 있는 클래스

파일 객체 생성. 파일 클래스의 생성자를 알아야 함.

크게 3가지 형태
1. 파일 객체 생성 시 파일 대상에 대한 파일 경로와 파일 이름 정보를 문자열로 줘야 한다.
2. 파일 경로와 파일 이름을 따로따로 주는 방법.
3. 경로를 문자열로 주느냐, 디렉토리 정보만 주는 방법.


[FileTest01.java]

package kr.or.ddit.basic;

import java.io.File;

public class FileTest01 {

	public static void main(String[] args) {
		
		// File객체 만들기 연습
		
		// 1. new File(String 파일 또는 경로)
		//	  ==> 디렉토리와 디렉토리 사이 또는 디렉토리와 파일명 사이의
		//        구분 문자는 '/'를 사용하거나 '\'를 사용할 수 있다.
		
//		File file1 = new File("d:/d_other/test.txt"); // 구분문자를 '/'로 사용.
		File file1 = new File("d:\\d_other\\test.txt"); // 구분문자를 '\'로 사용.
		
		System.out.println("파일명 : " + file1.getName()); // 파일명 : test.txt
		System.out.println("디렉토리 여부 : " + file1.isDirectory()); // 디렉토리 여부 : false
		System.out.println("파일 여부 : " + file1.isFile()); // 파일 여부 : true
		System.out.println();
		
		File file2 = new File("d:/d_other");
		System.out.println("파일명 : " + file2.getName()); // 파일명 : d_other
		System.out.println("디렉토리 여부 : " + file2.isDirectory()); // 디렉토리 여부 : true
		System.out.println("파일 여부 : " + file2.isFile()); // 파일 여부 : false
		System.out.println();
		
		// 2. new File(File parent, String child)
		//    => 'parent' 디렉토리 안에 있는 'child' 파일을 갖는다.
		File file3 = new File(file2, "test.txt");
		System.out.println("파일명 : " + file1.getName()); // 파일명 : test.txt
		System.out.println("디렉토리 여부 : " + file1.isDirectory()); // 디렉토리 여부 : false
		System.out.println("파일 여부 : " + file1.isFile()); // 파일 여부 : true
		System.out.println();
		
		// 3. new File(String parent, String child)
		//    => 'parent' 디렉토리 안에 있는 'child' 파일을 갖는다.
		File file4 = new File("d:/d_other", "test.txt");
		System.out.println("파일명 : " + file4.getName()); // 파일명 : test.txt
		System.out.println("디렉토리 여부 : " + file4.isDirectory()); // 디렉토리 여부 : false
		System.out.println("파일 여부 : " + file4.isFile()); // 파일 여부 : true
		System.out.println();
		
		// 디렉토리(폴더) 만들기
		/*
		 * - mkdir() ==> File 객체 전체의 경로 중 마지막 위치의 디렉토리를 만든다.
		 * 			 ==> 반환값 : 만들기 성공(true), 만들기 실패(false)
		 * 			 ==> 전체 경로 중 중간 부분의 경로가 모두 만들어져 있어야 
		 * 				  마지막 위치의 디렉토리(폴더)를 만들 수 있다.
		 * - mkdirs() ==> 중간 부분의 경로가 없으면 중간 부분의 경로도 같이 만들어준다.
		 */
		File file5 = new File("d:/d_other/연습용");
		System.out.println(file5.getName() + "의 존재 여부 : " + file5.exists()); // 연습용의 존재 여부 : false
		
		if(!file5.exists()) {
			if(file5.mkdir()) {
				System.out.println(file5.getName() + " 만들기 성공!!!"); // 맨 처음 실행 : 연습용 만들기 성공!!!
			}else {
				System.out.println(file5.getName() + " 만들기 실패~~~"); // 나중에 실행 : 연습용 만들기 실패~~~
			}
		}
		System.out.println();
		
		File file6 = new File("d:/d_other/test/java/src");
		System.out.println(file6.getName() + "의 존재 여부 : " + file6.exists()); // src의 존재 여부 : false
		
//		if(file6.mkdir()) {
		if(file6.mkdirs()) {
			System.out.println(file6.getName() + " 만들기 성공!!!");
		}else {
			System.out.println(file6.getName() + " 만들기 실패~~~"); // src 만들기 실패~~~, d:/d_other/test/java 폴더가 실제로 있어야 그 안에 src 폴더를 만드는 것.
		}
		System.out.println();
		
	}

}


mkdirs() 메서드 사용시 성공!


[FileTest02.java]

package kr.or.ddit.basic;

import java.io.File;

public class FileTest02 {

	public static void main(String[] args) {
		
		File f1 = new File("d:/d_other/test.txt");
		System.out.println(f1.getName() + "파일의 크기 : " + f1.length() + "bytes"); // test.txt파일의 크기 : 84bytes
		System.out.println("path : " + f1.getPath()); // path : d:\d_other\test.txt
		System.out.println("absolute path : " + f1.getAbsolutePath()); // absolute path : d:\d_other\test.txt
		System.out.println();
		
		// 이클립스에서 자바 프로그램이 실행되는 위치는 해당 프로그램이 위치하는
		// 프로젝트를 말한다. (즉,'프로젝트 이름'에 해당하는 폴더가 된다.)
		File f2 = new File("."); // 상대 경로.
		System.out.println("path : " + f2.getPath()); // path : .
		System.out.println("absolute path : " + f2.getAbsolutePath()); // absolute path : D:\A_TeachingMaterial\03_HighJava\workspace\javaIOTest\.
		System.out.println();
		
		if(f1.isFile()) {
			System.out.println(f1.getName() + "은(는) 파일입니다."); // test.txt은(는) 파일입니다.
		}else if(f1.isDirectory()) {
			System.out.println(f1.getName() + "은(는) 디렉토리입니다.");
		}else {
			System.out.println(f1.getName() + "은(는) 뭘까용?");
		}
		System.out.println();
		
		if(f2.isFile()) {
			System.out.println(f2.getName() + "은(는) 파일입니다.");
		}else if(f2.isDirectory()) {
			System.out.println(f2.getName() + "은(는) 디렉토리입니다."); // .은(는) 디렉토리입니다.
		}else {
			System.out.println(f2.getName() + "은(는) 뭘까용?");
		}
		System.out.println();
		
		// 현재 디스크에 존재하지 않는 파일 정보를 갖는 File 객체는
		// 파일 또는 디렉토리 여부를 검사하지 못한다.
		File f3 = new File("d:/d_other/sample.exe");
		if(f3.isFile()) {
			System.out.println(f3.getName() + "은(는) 파일입니다.");
		}else if(f3.isDirectory()) {
			System.out.println(f3.getName() + "은(는) 디렉토리입니다.");
		}else {
			System.out.println(f3.getName() + "은(는) 뭘까용?"); // sample.exe은(는) 뭘까용?
		}
		
	}

}


[FileTest03.java]

package kr.or.ddit.basic;

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

public class FileTest03 {

   public static void main(String[] args) {
	   
      FileTest03 test = new FileTest03();
//      test.displayFileList(new File("d:/d_other"));
      test.displayFileList(new File("d:/b_util"));
      
   }
   
   // 디렉토리를 매개변수로 받아서 해당 디렉토리에 있는
   // 모든 파일과 디렉토리 목록을 출력하는 메서드
   public void displayFileList(File dir) {
	   
      if(!dir.isDirectory()) {
         System.out.println("디렉토리 (폴더)만 가능합니다...");
         return;
      }
   
      System.out.println("[" + dir.getAbsolutePath() + "] 디렉토리 내용");
      
      // 해당 디렉토리 안에 있는 모든 파일과 디렉토리 목록을 가져온다.
      File[] files = dir.listFiles();
//      String[] fileStrs = dir.list();
      
      SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
      
      // 가져온 파일과 디렉토리 목록 개수만큼 반복
      for(int i=0; i<files.length; i++) {
    	  
         String fileName = files[i].getName();
         
         String attr = "";    // 파일의 속성(읽기, 쓰기, 히든, 디렉토리 구분)
         long size = 0;      // 파일 크기
         
         if(files[i].isDirectory()) {
            attr = "<DIR>";
         } else {
            size = files[i].length();
            attr = files[i].canRead() ? "R" : "";
            attr += files[i].canWrite() ? "W" : "";
            attr += files[i].isHidden() ? "H" : "";
         }
         
         System.out.printf("%s %5s %d %s\n", df.format(new Date(files[i].lastModified())), attr, size, fileName);
         
      }
   
   }

}



[ByteArrayIOTest01.java]

package kr.or.ddit.basic;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Arrays;

public class ByteArrayIOTest01 {

	public static void main(String[] args) {
		
		byte[] inSrc = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
		byte[] outSrc = null;
		
		// 입력용 스트림 객체 생성
		ByteArrayInputStream bin = new ByteArrayInputStream(inSrc);
		
		// 출력용 스트림 객체 생성
		ByteArrayOutputStream bout = new ByteArrayOutputStream();
		
		// 입력용 스트림을 이용하여 데이터를 읽어와서 
		// 출력용 스트림을 이용하여 출력하기
		
		int data; // 읽어온 자료가 저장될 변수
		
		// read()메서드 ==> 더 이상 읽어올 자료가 없으면 -1을 반환한다.
		while( (data = bin.read()) != -1 ) { // 읽어오기
			
			// 읽어온 자료를 처리하는 작업을 작성한다.
			bout.write(data); // 출력하기
			
		}
		
		// 출력된 스트림값을 배열로 변환하기
		outSrc = bout.toByteArray();
		
		// 입출력 작업이 완료되면 사용했던 자원(스트림 객체)을 반납한다.
		// ==> 이 때는 close()메서드를 사용한다.
		try {
			bin.close();
			bout.close();
		} catch (IOException e) {
			// TODO: handle exception
		}
		
		System.out.println(" inSrc => " + Arrays.toString(inSrc)); //  inSrc => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
		System.out.println("outSrc => " + Arrays.toString(outSrc)); // outSrc => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
		
	}

}


[ByteArrayIOTest02.java]

package kr.or.ddit.basic;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Arrays;

public class ByteArrayIOTest02 {

	public static void main(String[] args) {
		
		byte[] inSrc = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
		byte[] outSrc = null;
		
		byte[] temp = new byte[4];
		
		// 스트림 객체 생성
		ByteArrayInputStream bin = new ByteArrayInputStream(inSrc);
		ByteArrayOutputStream bout = new ByteArrayOutputStream();
		
		try {
			
			// bin.available() ==> 읽어올 수 있는(남아 있는) 데이터의 개수 반환
			while(bin.available() > 0) {
//				bin.read(temp); // 배열 크기만큼 읽어오기
//				bout.write(temp); // 배열의 데이터 출력하기
				
				// read(byte[] 배열명) ==> 반환값 : 실제 읽어온 데이터 개수
				int len = bin.read(temp);
				
				// temp 배열의 내용 중 0번째 부터 len 개수만큼 출력한다.
				bout.write(temp, 0, len);
				
				System.out.println("반복문 안에서 temp => " + Arrays.toString(temp));
//				반복문 안에서 temp => [0, 1, 2, 3]
//				반복문 안에서 temp => [4, 5, 6, 7]
//				반복문 안에서 temp => [8, 9, 6, 7]
			}
			
			outSrc = bout.toByteArray();
			
			System.out.println(" inSrc => " + Arrays.toString(inSrc)); //  inSrc => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
			System.out.println("outSrc => " + Arrays.toString(outSrc)); // outSrc => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 6, 7]
			
			// 스트림 닫기
			bin.close();
			bout.close();
			
		} catch (IOException e) {
			// TODO: handle exception
		}
		
	}

}


[FileIOTest01.java]

package kr.or.ddit.basic;

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

public class FileIOTest01 {

	public static void main(String[] args) {
		
		// 바이트 기반의 스트림을 이용하여 파일 내용 읽어와 출력하기
		try {
			// 파일 입력용 스트림 객체 생성
			
			// 방법 1
//			FileInputStream fin = new FileInputStream("d:/d_other/test.txt");
			
			// 방법 2
			File file = new File("d:/d_other/test.txt");
			FileInputStream fin = new FileInputStream(file);
			
			int c; // 읽어온 데이터가 저장될 변수
			while( (c = fin.read()) != -1 ) {
				// 읽어온 데이터를 화면에 출력하기
				System.out.print((char)c);
			}
			
			// 작업 완료 후 스트림 닫기
			fin.close();
			
		} catch (IOException e) {
			System.out.println("입출력 오류입니다.");
			e.printStackTrace();
		}
		
	}

}


[FileIOTest02.java]

package kr.or.ddit.basic;

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

public class FileIOTest02 {

	public static void main(String[] args) {
		
		// 바이트 기반 스트림을 이용한 파일로 출력하기 예제
		try {
			FileOutputStream fout = new FileOutputStream("d:/d_other/out.txt"); // 파일이 없으면 새로 생성함. 파일이 있으면 덮어쓰기함.
			
			for(char ch='A'; ch<='Z'; ch++) {
				fout.write(ch); // ch변수의 데이터를 파일로 출력한다.
			}
			
			System.out.println("출력 작업 완료!!!");
			
			// 스트림 닫기
			fout.close();
			
		} catch (IOException e) {
			// TODO: handle exception
		}
		
	}

}


[FileIOTest03.java]

package kr.or.ddit.basic;

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

public class FileIOTest03 {

	public static void main(String[] args) {
		
		// 문자 기반 스트림을 이용한 파일 내용 읽어와 화면에 출력하기
		try {
			// 입력용 스트림 객체 생성
			FileReader fr = new FileReader("d:/d_other/test.txt");
			
			int c;
			
			while( (c = fr.read()) != -1 ) {
				System.out.print( (char)c );
			}
			
			// 스트림 닫기
			fr.close();
			
		} catch (IOException e) {
			// TODO: handle exception
		}
		
	}

}


[FileIOTest04.java]

package kr.or.ddit.basic;

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

public class FileIOTest04 {

	public static void main(String[] args) {
		
		// 사용자가 입력한 내용을 그대로 파일로 저장하기
		try {
			// System.in ==> 콘솔(표준 입출력 장치) 입력장치의 
			// 입력용 스트림 객체가 저장되어 있다. (바이트 기반 스트림)
			
			// 입력용 바이트 기반 스트림을 문자 기반 스트림으로 변환하기
			InputStreamReader isr = new InputStreamReader(System.in);
			
			// 문자 기반의 파일 출력용 스트림 객체 생성
			FileWriter fw = new FileWriter("d:/d_other/testChar.txt");
			
			System.out.println("아무 내용이나 입력하세요. (입력의 끝은 Ctrl + Z키 입니다.)");
			
			int c;
			
			while( (c = isr.read()) != -1 ) { // 콘솔로 입력 받기
				fw.write(c); // 입력 받은 데이터를 파일로 출력하기
			}
			
			// 스트림 닫기
			isr.close();
			fw.close();
			
		} catch (IOException e) {
			// TODO: handle exception
		}
		
	}

}

'대덕인재개발원_자바기반 애플리케이션' 카테고리의 다른 글

230907_입출력 3  (2) 2023.09.07
230906_입출력 2  (0) 2023.09.06
230904_스레드 5  (0) 2023.09.04
230901_스레드 4  (0) 2023.09.01
230831_스레드 3  (0) 2023.08.31