Reader

    문자 기반 입력 스트림의 최상위 클래스로 추상 클래스

    (문자만 특화되어 읽을수 있다.)


    read() 사용

    package kr.co.kihd.reader;
    
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.Reader;
    
    public class ReaderTest01 {
    	
    	public static void main(String[] args) throws Exception {
    		//Reader 클래스는 문자특화 클래스로 하위클래스만 FileReader를
    		//생성해서 대입
    		Reader reader = new FileReader("C:\\workspace\\test5.txt");
    		int readData;
    		
    		//readData는 int값으로 끝 2바이트(문자 2바이트이니까)에 저장된다.
    		while( (readData = reader.read()) != -1) {
    			//문자출력(바이트정보를 강제로 캐스팅)
    			System.out.println("읽은 문자 : " + (char)readData);
    			//영문자는 아스키코드가 출력이 되고 , 한글은 유니코드가 출력
    			System.out.println("읽은 문자 : " + readData);
    		}
    		
    //		while(true) {
    //			readData = reader.read();
    //			if(readData == -1) {
    //				break;
    //			
    //			System.out.println("읽은 문자 : " + (char)readData);
    //			//영문자는 아스키코드가 출력이 되고 , 한글은 유니코드가 출력
    //			System.out.println("읽은 문자 : " + readData);
    //			reader.close();
    //			
    //			}
    //	
    //		}
    		
    		
    		reader.close();
    	}
    	
    }
    

     

    StringBuilder 사용 

    package kr.co.kihd.reader;
    
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.Reader;
    
    public class ReaderTest02 {
    	
    	public static void main(String[] args) throws Exception {
    		
    		Reader reader = new FileReader("C:\\workspace\\test5.txt");
    		int readData;
    		char[] cArr = new char[2];
    		//String str = "";
    		
    		//하나의 인스턴스만 만들어서 작업 StringBuilder 객체를 하나만 만들어 놓고 수정이됨.
     		StringBuilder sBuilder = new StringBuilder();
    		
    		
    		//read() 매개변수 char[]타입이라는 것에 주목을 반드시 하자.
    		while( (readData = reader.read(cArr)) != -1) {
    			//읽은 문자를 문자열로 생성
    			//str += new String(cArr, 0, readData);
    			sBuilder.append(cArr);
    			System.out.println("읽은 문자수 : " + readData);
    		}
    		
    		//문자열 출력
    		//System.out.println(str);
    		System.out.println(sBuilder);
    		reader.close();
    	}
    	
    }
    

     

    read(cbuf, off, len) 사용

    package kr.co.kihd.reader;
    
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.Reader;
    
    public class ReaderTest03 {
    
    	public static void main(String[] args) throws Exception {
    		
    		Reader reader = new FileReader("C:\\workspace\\test5.txt");
    		char[] cArr = new char[4];
    		
    		//cArr배열에 1번째 인덱스부터 test5.txt파일에 있는 3자를 읽어서
    		//저장하라.
    		int readData = reader.read(cArr, 1, 3);
    		System.out.println("읽은 문자 수 : " + readData);
    		
    		//출력결과는 0인덱스에는 공백이 출력며, 1부터 3의 길이만큼만 
    		//읽어서 출력함.
    		for(int i = 0; i<cArr.length; i++) {
    			System.out.println(i + "번째 문자 : " + cArr[i]);
    		}
    		
    		reader.close();
    
    	}
    
    }
    
    

    Writer

    문자 기반 출력 스트림의 최상위 클래스로 추상 클래스

    (문자만 특화되어 출력할 수 있다.)

     

    방법1  덜 효율적임

    package kr.co.kihd.writer;
    
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Writer;
    
    public class writerTest01 {
    
    	public static void main(String[] args) throws Exception {
    		
    		//toCharArray()는 문자열을 char[]로 리턴해준다.
    		char[] str = "이순신".toCharArray();
    		System.out.println(str);
    		
    		Writer writer = new FileWriter("C:\\workspace\\test6.txt");
    		for(int i = 0; i < str.length; i++) {
    			//한 문자씩 보내는 형태 
    			writer.write(str[i]);            //비 효율적
    			System.out.println("루핑수 : " + i);
    		}
    		
    		//강제로 버퍼에 남아있다면 비워줌
    		writer.flush();
    		System.out.println("파일이 생성되었습니다.");
    		writer.close();
    
    	}
    
    }
    


    이전파일의 write(int b)보다 훨씬 효율적이다.

    package kr.co.kihd.writer;
    
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Writer;
    
    
    public class WriterTest02 {
    
    	public static void main(String[] args) throws Exception {
    		
    		Writer writer = new FileWriter("C:\\workspace\\test7.txt");
    		char[] str = "두두등장".toCharArray();
    		
    		//write()의 매개변수 타입이 문자배열이다.
    		//이전파일의 write(int b)보다 훨씬 효율적이다.
    		writer.write(str);
    		writer.flush();
    		System.out.println("파일이 생성되었습니다.");
    		
    		writer.close();
    		
    	}
    
    }
    

     

    write(cbuf, off, len) 사용

    package kr.co.kihd.writer;
    
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Writer;
    
    public class WriterTest03 {
    
    	public static void main(String[] args) throws Exception {
    		
    		Writer writer = new FileWriter("C:\\workspace\\test8.txt");
    		
    		//문자열 => 문자배열로 리턴함.
    		char[] str = "두두등장이다".toCharArray();
    		
    		writer.write(str, 1, 4);
    		System.out.println("파일이 생성되었습니다.");
    		writer.flush();
    		writer.close();
    
    	}
    
    }
    

     

    매개변수가 String타입인 write

    package kr.co.kihd.writer;
    
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Writer;
    
    public class WriterTest04 {
    
    	public static void main(String[] args) throws Exception {
    		
    		Writer writer = new FileWriter("C:\\workspace\\test9.txt");
    		String str = "안녕하세요. 지금 자바 IO 기반의 입출력을 공부하고 있습니다.";
    		
    		//매개변수가 String타입이다.
    		writer.write(str);
    		System.out.println("파일이 생성되었습니다.");
    		
    		writer.flush();
    		writer.close();
    	}	
    
    }
    

     

    문자열 2번째 인덱스부터 10개의 문자를 write 

    package kr.co.kihd.writer;
    
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Writer;
    
    public class WriterTest04 {
    
    	public static void main(String[] args) throws Exception {
    		
    		Writer writer = new FileWriter("C:\\workspace\\test10.txt");
    		String str = "안녕하세요. 지금 자바 IO 기반의 입출력을 공부하고 있습니다.";
    		
    		//매개변수가 String타입이다.
    		//writer.write(str);
    		//문자열 2번째 인덱스부터 10개의 문자를 파일(test10.txt)로 저장하기
    		writer.write(str, 2, 10);
    		
    		System.out.println("파일이 생성되었습니다.");
    		
    		writer.flush();
    		writer.close();
    	}	
    
    }
    

    File 클래스

    파일 시스템의 파일을 표현하는 클래스

    package kr.co.kihd.fileinputstream;
    
    import java.io.File;
    import java.net.URI;
    import java.net.URISyntaxException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class FileTest {
    	
    	public static void main(String[] args) throws Exception {
    		
    		//아래라인을 실행한다고 해서 C:/Temp1/directory폴더를 만들지 않는다.
    		File directory = new File("C:/Temp1/directory");
    		
    		File file1 = new File("C:/Temp1/file1.txt");
    		File file2 = new File("C:/Temp1/file2.txt");
    		File file3 = new File(new URI("file:///C:/Temp1/file3.txt"));
    		
    //		String uriName = "https://www.google.com/Temp/file3.txt";
    //		URI uri = new URI(uriName);
    //		System.out.println(uri);
    		/*
    		 * URI 객체 : 문자열 전송과 조작을 위한 프로토콜
    		 * URL 객체 : 네트워크 전송을 위한 프로토콜
    		 * 프로토콜 : 통신규약(TCP/IP, UDP)
    		 * URI : 통합자원 식별자는 인터넷에 있는 자원을 나타내는 유일한 주소.
    		 */
    		
    		//directory 폴더가 존재하느냐?
    		if(directory.exists() == false) {
    			/*
    			 * mkdir() : 부모디렉토리가 없으면 자기자신의 폴더만들고,
    			 * 			 부모가 있다면 그 안에 자신의 폴더를 만든다.
    			 * 			 단 부모 폴더가 없는데 경로에 부모를 줬다면 폴더는
    			 * 			 안 만들어진다.
    			 */
    			//mkdirs() : 경로상 없는 디렉토리를 다 생성한다.
    			directory.mkdirs();
    		}
    		
    			if(file1.exists() == false) {
    				file1.createNewFile();
    				System.out.println("file1.txt가 생성되었습니다.");
    			}
    			
    			if(file2.exists() == false) {
    				file2.createNewFile();
    				System.out.println("file2.txt가 생성되었습니다.");
    			}
    			
    			if(file3.exists() == false) {
    				file3.createNewFile();
    				System.out.println("file3.txt가 생성되었습니다.");
    			}
    			
    			
    			File temp = new File("C://workspace");
    			File[] contents = temp.listFiles();
    			
    			System.out.println("날짜 \t 시간 \t\t       크기 \t   이름");
    			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd a HH:mm");
    			System.out.println("-------------------------------------------------------");
    			
    			for(File file : contents) {						//마지막 수정한 날짜
    				System.out.print(sdf.format(new Date(file.lastModified())));
    				
    				//file이 디렉토리이냐?
    				if(file.isDirectory()) {
    					//디렉토리 이름 출력
    					System.out.print("\t<DIR>\t\t" + file.getName());
    				}
    				//file이면
    				else {
    					//파일의 크기와 이름을 출력한다.
    					System.out.print("\t\t" + file.length() + "\t" + file.getName());
    				}
    				
    				System.out.println();
    			}
    		
    	}
    	
    }
    
    날짜 	 시간 		       크기 	   이름
    -------------------------------------------------------
    2020-10-13 오후 13:06	<DIR>		.metadata
    2020-10-13 오후 14:28	<DIR>		1-2
    2020-10-13 오후 13:19	<DIR>		chap-01(환경설정)
    2020-10-14 오전 10:03	<DIR>		chap-02(변수)
    2020-10-19 오전 10:08	<DIR>		chap05(반복문)
    2020-10-20 오후 12:18	<DIR>		chap06(배열)
    2020-10-23 오전 09:22	<DIR>		chap07(예외처리)
    2020-10-26 오전 10:26	<DIR>		chap08(클래스와객체)
    2020-10-27 오전 10:15	<DIR>		chap09(변수와 메서드)
    2020-10-29 오전 09:12	<DIR>		chap10(메서드와 오버로딩,상수필드)
    2020-10-29 오전 11:28	<DIR>		chap11(생성자와변수의 초기화,싱글톤)
    2020-11-02 오전 11:12	<DIR>		chap12(상속과오버라이딩)
    2020-11-04 오전 09:43	<DIR>		chap13(제어자와다형성)
    2020-11-06 오전 09:18	<DIR>		chap14(추상클래스와인터페이스)
    2020-11-10 오전 10:21	<DIR>		chap15(중첩클래스)
    2020-11-11 오전 09:09	<DIR>		chap16(Object클래스)
    2020-11-11 오전 11:05	<DIR>		chap17(String클래스)
    2020-11-12 오전 10:12	<DIR>		chap18(기타클래스들)
    2020-11-13 오전 09:47	<DIR>		chap19(유용한클래스들)
    2020-11-16 오전 10:32	<DIR>		chap20(제네릭)
    2020-11-17 오전 10:04	<DIR>		chap21(멀티스레드1)
    2020-11-18 오전 11:44	<DIR>		Chap22(멀티스레드2)
    2020-11-19 오전 09:30	<DIR>		chap23(컬렉션프레임워크1)
    2020-11-20 오전 09:10	<DIR>		chap24(컬렉션프레임워크2)
    2020-11-23 오전 09:24	<DIR>		chap25(IO입출력1)
    2020-11-24 오전 11:31	<DIR>		chap26(IO입출력2)
    2020-10-26 오전 09:26	<DIR>		Exercise
    2020-11-23 오후 12:37		682	FileCopyTest.java
    2020-11-24 오전 11:24		1042	FileCopyTest_복사본.java
    2020-10-13 오후 13:10	<DIR>		languageServers-log
    2020-10-19 오전 08:57	<DIR>		oda
    2020-10-19 오전 08:35		2005849	oda.zip
    2020-10-20 오전 09:29	<DIR>		Practice
    2020-11-23 오전 09:46		3	test.txt
    2020-11-24 오전 10:41		24	test10.txt
    2020-11-23 오전 10:14		3	test2.txt
    2020-11-23 오전 10:26		18	test3.txt
    2020-11-23 오전 10:43		5	test4.txt
    2020-11-24 오전 10:20		19	test5.txt
    2020-11-24 오전 10:19		9	test6.txt
    2020-11-24 오전 10:25		12	test7.txt
    2020-11-24 오전 10:32		12	test8.txt
    2020-11-24 오전 10:38		83	test9.txt
    2020-11-23 오전 11:59		3	write.txt
    2020-11-23 오후 12:20		12	write2.txt
    2020-11-23 오후 12:28		15	write3.txt
    2020-11-23 오후 12:42		1000	write3_복사본.txt
    2020-11-23 오전 10:14		0	새 텍스트 문서.txt
    

     

    FileInputStream 으로 자기자신 읽어들이기

    package kr.co.kihd.fileinputstream;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    
    public class FileInputStreamTest {
    
    	public static void main(String[] args) throws Exception {
    		
    		File file = new File("C:\\workspace\\chap26(IO입출력2)\\src\\kr\\co\\kihd\\fileinputstream\\FileInputStreamTest.java");
    		//파일의 경로 얻기
    		System.out.println("파일의 경로 : " + file.getPath());
    		System.out.println("부모 디렉토리 : " + file.getParent());
    		System.out.println("실행 가능한가 : " + file.canExecute());
    		System.out.println("읽기 가능한가 : " + file.canRead());
    		System.out.println("숨긴 파일인가 : " + file.canWrite());
    		System.out.println("파일 이름 : " + file.getName());
    		System.out.println("파일 크기 : " + file.length());
    		System.out.println("URI출력 형태 : " + file.toURI());
    		
    		//지금 작성중인 파일 읽어들이기
    		FileInputStream fis = new FileInputStream(file);
    		int data;
    		int i = 0;
    		while( (data = fis.read()) != -1) {
    			System.out.write(data);
    			i++;
    		}
    		System.out.println("루핑 수 : " + i);
    		fis.close();
    	}
    
    }
    

     

    이미지 파일 복사

    package kr.co.kihd.fileoutputstream;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    
    public class FileOutputStreamTest {
    
    	public static void main(String[] args) throws Exception {
    		
    		//파일 복사를 하기위한 경로를 설정
    		String originFileName = "C:\\workspace\\chap26(IO입출력2)\\src\\kr\\co\\kihd\\fileoutputstream\\earth_and_moon-Universe_Photography_Wallpaper_1366x768.jpg";
    		String targetFileName = "C:\\Temp1\\earth.jpg";
    		
    		File file = new File(originFileName);
    		//파일로부터 데이터를 복사(입력)
    		FileInputStream fis = new FileInputStream(file);
    		//복사한 파일출력
    		FileOutputStream fos = new FileOutputStream(targetFileName);
    		
    		int readByteCount;
    		int i = 0;
    		
    		byte[] bArr = new byte[100];
    		
    		long startTime = System.currentTimeMillis();
    		while( (readByteCount = fis.read(bArr)) != -1) {
    			fos.write(bArr);
    			i++;
    		}
    		
    		long endTime = System.currentTimeMillis();
    		
    		System.out.println("총 루핑수 : " + i);
    		System.out.println("복사 시간 : " + (endTime - startTime) + "ms");
    		System.out.println("복사한 파일의 크기 : " + (file.length()/1024)+ "kbyte");
    		
    		fos.close();
    		fis.close();
    		System.out.println(file.getName() + "파일의 복사가 완료되었습니다.");
    		
    	}
    
    }
    

     

    읽은 바이트 수만큼 출력스트림으로 보내는 것.

    package kr.co.kihd.fileoutputstream;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    
    public class FileOutputStreamTest {
    
    	public static void main(String[] args) throws Exception {
    		
    		//파일 복사를 하기위한 경로를 설정
    		String originFileName = "C:\\workspace\\chap26(IO입출력2)\\src\\kr\\co\\kihd\\fileoutputstream\\earth_and_moon-Universe_Photography_Wallpaper_1366x768.jpg";
    		String targetFileName = "C:\\Temp1\\earth.jpg";
    		
    		File file = new File(originFileName);
    		//파일로부터 데이터를 복사(입력)
    		FileInputStream fis = new FileInputStream(file);
    		//복사한 파일출력
    		FileOutputStream fos = new FileOutputStream(targetFileName);
    		
    		int readByteCount;
    		int i = 0;
    		
    		byte[] bArr = new byte[100];
    		
    		//현재 시점을 저장한다.
    		long startTime = System.currentTimeMillis();
    		while( (readByteCount = fis.read(bArr)) != -1) {
    			//fos.write(bArr);
    			fos.write(bArr, 0, readByteCount); //읽은 바이트 수만큼 출력스트림으로 보내는 것.
    			i++;
    		}
    		fos.flush();
    		//복사의 종료시점
    		
    		long endTime = System.currentTimeMillis();
    		
    		System.out.println("총 루핑수 : " + i);
    		System.out.println("복사 시간 : " + (endTime - startTime) + "ms");
    		System.out.println("복사한 파일의 크기 : " + (file.length()/1024)+ "kbyte");
    		
    		fos.close();
    		fis.close();
    		System.out.println(file.getName() + "파일의 복사가 완료되었습니다.");
    		
    	}
    
    }
    

     

    크기가 복사시간에 영향을 준다. 동영상

    바이트 배열을 크게 잡을수록 복사시간이 빨라진다.

    package kr.co.kihd.fileoutputstream;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    
    public class FileOutputStreamTest {
    
    	public static void main(String[] args) throws Exception {
    		
    		//파일 복사를 하기위한 경로를 설정
    		//String originFileName = "C:\\workspace\\chap26(IO입출력2)\\src\\kr\\co\\kihd\\fileoutputstream\\earth_and_moon-Universe_Photography_Wallpaper_1366x768.jpg";
    		String originFileName = "C:\\workspace\\chap26(IO입출력2)\\src\\kr\\co\\kihd\\fileoutputstream\\Norway AMAZING Beautiful Nature with Relaxing Music and sound - 4k Ultra HD Quality.mp4";
    		
    		//String targetFileName = "C:\\Temp1\\earth.jpg";
    		String targetFileName = "C:\\Temp1\\Nature.mp4";
    		
    		File file = new File(originFileName);
    		//파일로부터 데이터를 복사(입력)
    		FileInputStream fis = new FileInputStream(file);
    		//복사한 파일출력
    		FileOutputStream fos = new FileOutputStream(targetFileName);
    		
    		int readByteCount;
    		int i = 0;
    		
    		//byte[] bArr = new byte[100];
    		byte[] bArr = new byte[1000000]; //크기가 복사시간에 영향을 준다.
    		
    		//현재 시점을 저장한다.
    		long startTime = System.currentTimeMillis();
    		while( (readByteCount = fis.read(bArr)) != -1) {
    			//fos.write(bArr);
    			fos.write(bArr, 0, readByteCount); //읽은 바이트 수만큼 출력스트림으로 보내는 것.
    			i++;
    		}
    		fos.flush();
    		//복사의 종료시점
    		
    		long endTime = System.currentTimeMillis();
    		
    		System.out.println("총 루핑수 : " + i);
    		System.out.println("복사 시간 : " + (endTime - startTime) + "ms");
    		System.out.println("복사한 파일의 크기 : " + (file.length()/1024)+ "kbyte");
    		
    		fos.close();
    		fis.close();
    		System.out.println(file.getName() + "파일의 복사가 완료되었습니다.");
    		
    	}
    
    }
    

     

    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기
    loading