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() + "파일의 복사가 완료되었습니다.");
}
}