티스토리 뷰
1. Scanner
- Console 클래스는 문자열은 읽을 수 있지만, 기본타입인 정수 타입이나 실수 타입은 바로 읽을 수 없다는 단점이 있는데,
- Scanner은 콘솔로부터 기본 타입의 값을 바로 읽을 수 있다.
- 형태 : Scanner scanner = new Scanner(System.in)
- 제공되는 메소드 : nextLine( ); [ String값을 읽는다. ] , nextInt( ); [ 정수값을 읽는다. ] ...
2. File 클래스
- 파일 시스템의 파일을 표현하는 클래스
- 파일의 크기 / 속성 / 이름 등의 정보를 제공하고, 파일을 생성 및 삭제하는 기능을 제공한다.
- 디렉토리 생성 및 디렉토리에 존재하는 파일 리스트를 얻어내는 기능을 제공한다.
- 파일 객체 생성 : File file = new File( “파일의 위치“ );
- 파일이 없으면 파일을 생성하게 된다.
- 파일 또는 디렉토리의 존재 유무 확인 메소드 : Boolean isExist = file.exists( );
- 생성 및 삭제 메소드 :
- createNewFile( ); [ 새로운 파일을 생성한다. ], mkdir( ); [ 새로운 디렉토리를 생성 ], mkdirs( ); [ 경로상에 없는 모든 디렉토리를 생성 ], deletr( ); [ 파일 / 디렉토리 삭제 ]
- + URL = Uniform Resource Locator ( 표준화된 자원의 위치를 알려준다. )
- + URL ex) https://www.naver.com:80/index.html
- + 이때 /index.html를 URI라고 하는데, URL( = Uniform resorce Indicator )는 다양한 웹 자원 중에 필요한 자원을 알려주는 지시자이다.
3. 파일 입출력
- 1 ) FileInputStream : 파일로부터 바이트 단위로 읽어 들일 때 사용
- 그림, 오디오, 비디오, 텍스트 파일 등 모든 종류의 파일을 읽을 수 있다.
- InputStream의 하위 클래스이기에 사용방법은 InputStream과 같다.
- 객체 생성 방법 : FileInputStream 객체가 생성될 때 파일과 직접적으로 연결된다.
- Try - catch문으로 예외처리를 해줘야 한다.
- 2 ) FileOutputStream : 파일에 바이트 단위로 데이터를 저장할 때 사용한다.
- 파일에 바이트 단위로 데이터를 저장할 때 사용하며, 모든 종류의 데이터를 파일로 저장한다.
4. 보조스트림
- 다른 스트림과 연결되어 여러 가지 편리한 기능을 제공해주는 스트림
- 입력 스트림 - > 보조 스트림 - > 프로그램 - > 보조 스트림 - > 출력 스트림
- 문자변환, 입출력 성능 향상, 기본 데이터 타입의 입출력, 객체 입출력 등의 기능을 제공해 준다.
- 보조 스트림 생성 : 보조스트림 변수 = new 보조스트림( 연결스트림 )
- 보조 스트림 체인 : 다른 보조 스트림과 연결되어 역할을 수행한다.
5. 문자 변환 보조 스트림 ( 다국어 변환 처리 )
- 소스 스트림이 바이트 기반 스트림이지만, 데이터가 문자일 경우에 사용한다.
- 바이트 기반 입/출력 스트림을 문자 기반의 입/출력 스트림으로 바꿔준다.
- InputStreamReader : InputStream을 Reader로 변환해준다.
6. 성능 향상 보조 스트림
- 입출력 성능에 영향을 미치는 입출력 소스이다.
- 입출력 소스와 직접 작업하는 것이 아니라 메모리에 버퍼(buffer)를 만들어서 작업하여 실행 성능을 향상시킨다.
- 버퍼를 사용하게 되면 데이터를 한번에 하드 디스크로 보내 출력 횟수를 줄여준다.
- Ex. BufferedInputStream / BufferedReader / BufferedOutputStream / BufferedWriter
7. 프린트 보조 스트림
- PrintStream / PrintWriter
8. 객체 입출력 보조 스트림
- 객체를 파일 또는 네트워크로 입출력할 수 있는 기능을 제공
- 객체 직렬화 : 객체는 문자는 아니기에 바이트 기반 스트림으로 데이터 변경 필요
01. Scanner
package scanner;
import java.util.Scanner;
import lombok.Cleanup;
public class ScannerExample {
public static void main (String[] args) {
@Cleanup
Scanner sc = new Scanner(System.in); // Scanner 객체 생성
// ========================================
System.out.print("문자열 입력 > "); // 입력유도 프롬프트 메세지 출력
String inputString = sc.nextLine(); // 문자열로 입력받음
System.out.println(inputString);
System.out.println();
// ========================================
System.out.print("정수 입력 > "); // 입력유도 프롬프트 메세지 출력
int inputInt = sc.nextInt(); // 정수로 입력받음
System.out.println(inputInt);
System.out.println();
// ========================================
System.out.print("실수 입력 > "); // 입력유도 프롬프트 메세지 출력
double inputDouble = sc.nextDouble(); // 실수로 입력받음
System.out.println(inputDouble);
// sc.reset(); - 스캐너를 다시 처음으로 리셋시킨다.(?)
// sc.close(); - 스캐너도 자원객체이기에 닫아야 한다.
// ========================================
// 출력 :
// 문자열 입력 > 문자열!
// 문자열!
//
// 정수 입력 > 70
// 70
//
// 실수 입력 > 8.0
// 8.0
// ========================================
} // main
} // end class
02. InputStreamReader - 바이트 기반을 문자기반 입력 스트림으로
package inputstreamreader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
public class InputStreamReaderExample {
public static void main (String [] args) throws Exception {
InputStream is = System.in;
// 1. 문자변환 보조 스트림 : InputStream -> Reader 변환
Reader reader = new InputStreamReader(is);
int readCharNo;
char [] cbuf = new char [100]; // 바가지
while( ( readCharNo = reader.read(cbuf)) != -1 ) {
String data = new String(cbuf,0,readCharNo);
System.out.println(data);
} // while
reader.close();
} // main
} // end class
03. OutputStreamWriter - 바이트 기반을 문자 기반 출력 스트림으로
package outputstreamwriter;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
public class OutputStreamWriterExamle {
public static void main (String[] args) throws Exception {
FileOutputStream fos = new FileOutputStream("C:/Temp/file.txt");
Writer writer = new OutputStreamWriter(fos);
String data = "바이트 출력 스트림을 문자 출력 스트림으로 변환하였습니다.";
writer.write(data);
writer.flush();
writer.close();
System.out.println("출력이 완료되었습니다!");
} // main
} // end class
04. PrintStream
package print_stream;
import java.io.FileOutputStream;
import java.io.PrintStream;
public class PrintStreamExample {
public static void main (String[] args) {
try {
FileOutputStream fos = new FileOutputStream("C:/Temp/file.txt");
PrintStream ps = new PrintStream(fos);
try ( fos; ps; ) {
ps.println("[ 프린터 보조 스트림 ]");
ps.print("마치 ");
ps.println("프린터가 출력하는 것처럼 ");
ps.println("데이터를 출력합니다. ");
ps.printf("이름 : %s, 나이 : %s ", "Yoseph",23); // 진정한 포멧팅 : printf (***)
// %s 자리에 입력한 순서대로 들어가게 된다.
// 이름 : Yoseph, 나이 : 23
ps.flush();
} // try - with - resource
} catch (Exception e) {
e.printStackTrace();
} // Outer try - catch
} // main
} // end class
05. DataInput / OutPutStream
package datainput_outputstream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class DataInputOutputStreamExample {
public static void main ( String[] args ) throws Exception {
// 1. 출력할 때
FileOutputStream fos = new FileOutputStream("C:/Temp/primitive.dat");
DataOutputStream dos = new DataOutputStream(fos); // 바이트로 바뀌어서 출력된다.
dos.writeUTF("홍길동");
dos.writeDouble(95.5);
dos.writeInt(1);
dos.writeUTF("김자바");
dos.writeDouble(90.3);
dos.writeInt(2);
dos.flush();
// 근간이 되는 스트림과 보조 스트림을 자원해제할 때에는
// 순서대로 닫히게 된다. ( 1. 보조스트림 해제 -> 2. 근간 스트림 해제 )
dos.close();
fos.close();
// =======================================================
// 2. 읽어낼 때
// 읽을 때도 입력한 순서대로 파일의 처음부터 읽어내게 된다.
FileInputStream fis = new FileInputStream("C:/Temp/primitive.dat");
DataInputStream dis = new DataInputStream(fis);
for (int i=0; i<2; i++) {
String name = dis.readUTF();
double score = dis.readDouble();
int order = dis.readInt();
System.out.println( name + " : " + score + " : " + order);
} // for
// ======================================================
// 출력 :
// 홍길동 : 95.5 : 1
// 김자바 : 90.3 : 2
// ======================================================
dis.close();
fis.close();
} // main
} // end class
06. BufferedInputStream
package bufferedstream;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
public class BufferedInputStreamExample { // 성능 향상 보조 스트림
public static void main(String [] args) throws Exception {
long start = 0;
long end = 0;
// ===================================================================
// 1. 성능향상 보조 스트림을 사용하지 않고, 직접 바이트 기반의 입력 스트림으로
// 파일을 읽어내었을 때의 실행소요시간 측정
FileInputStream fis1 = new FileInputStream("C:\\Users\\Junhyun\\Desktop\\kh 자바 자료\\PPT\\10장(예외처리).ppt");
start = System.currentTimeMillis();
while(fis1.read() != -1 ) { ;; }
end = System.currentTimeMillis();
System.out.println("사용하지 않았을 때 : " + ( end - start ));
fis1.close();
// ===================================================================
// 2. 성능향상 보조 스트림을 연결해서 동일 파일을 읽어내었을 때의 소요 시간 측정
FileInputStream fis2 = new FileInputStream("C:\\Users\\Junhyun\\Desktop\\kh 자바 자료\\PPT\\10장(예외처리).ppt");
// 성능향상보조 스트림 연결 (****)
BufferedInputStream bis = new BufferedInputStream(fis2);
start = System.currentTimeMillis();
while(bis.read() != -1 ) { ;; }
end = System.currentTimeMillis();
System.out.println("사용했을 때 : " + ( end - start ));
bis.close(); // 버퍼도 닫아야 한다.
fis2.close();
// 출력 : 버퍼를 사용했을 때 더 짧게 걸린다.
// 사용하지 않았을 때 : 9335
// 사용했을 때 : 36
} // main
} // end class
07. 파일 및 디렉토리의 생성
package file;
import java.io.File;
import java.net.URI;
import java.text.SimpleDateFormat;
import java.util.Date;
public class FileExample {
public static void main (String[] args) throws Exception { // 파일 및 디렉토리의 생성(***)
// 객체 생성
File dir = new File("C:/Temp/Dir");
File file1 = new File("C:/Temp/file1.txt");
File file2 = new File("C:/Temp/file2.txt");
File file3 = new File(new URI("file:///C:/Temp/file3.txt") ); // 지시자
// 파일이나 디렉토리가 없으면, 새로 생성하게 된다.
// file:///C:/Temp/file3.txt [ file:///는 URI를 통해 로컬에 있는 파일이나 디렉토리를 다룰때 꼭 붙여야 하는 규약이다. ]
// 그러나 이렇게 사용하면 코드의 길이가 길어지기에 로컬에서는 그냥 위의 코드를 사용하는 것이 좋다.
System.out.println("1. dir : " + dir );
// 출력 : 1. dir : C:\Temp\Dir
System.out.println("2. file1 : " + file1);
// 출력 : 2. file1 : C:\Temp\file1.txt
// =========================================================
// 파일과 디렉토리의 존재 여부 확인 및 생성
if(dir.exists() == false) { dir.mkdirs(); } // 지정된 경로에 필요한 모든 디렉토리를 생성하게 된다. (**)
if( file1.exists() == false ) { file1.createNewFile(); }
if( file2.exists() == false ) { file2.createNewFile(); }
if( file3.exists() == false ) { file3.createNewFile(); }
// 출력 결과 :
// dir라는 이름의 파일과 file1 file2 file3라는 이름의 txt파일이 생성되었다.
// =========================================================
// 도스 창 출력과 같이 포멧팅하기
File temp = new File("C:/Temp");
// 지정된 위치에 지정된 파일이나 디렉토리가 없다면 생성하게 된다.
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd a HH:mm");
System.out.println("3. sdf : " + sdf);
// 출력 : 3. sdf : java.text.SimpleDateFormat@a76d63bb
// 날짜를 포멧팅하는 클래스이다.
System.out.println();
File [] contents = temp.listFiles(); // (****)
// C:/Temp에 있는 파일 및 디렉토리 리스트를 가지고 와서 배열로 만든다.
System.out.println(" 날짜 시간 형태 크기 이름 ");
System.out.println("---------------------------------------------------------");
for ( File file : contents ) { // 파일타입 원소를 contents배열에서 1개씩 가지고 온다.
System.out.print(sdf.format(new Date(file.lastModified())));
// file.lastModified은 파일의 최종 수정 시각을 long타입의 (00:00:00 GMT, January 1, 1970)로 표시한다.
if(file.isDirectory()) { // 뽑아낸 원소가 디렉토리이면...
System.out.print("\t<DIR>\t\t\t" + file.getName());
// 디렉토리는 주머니 역할을 할 뿐이지, 사이즈가 없다.
} else { // 뽑이낸 원소가 파일이면...
System.out.print("\t\t\t" + file.length() + "\t" + file.getName());
}// if-else
System.out.println();
} // enhanced for
// =========================================================
// 출력 :
// 날짜 시간 형태 크기 이름
// ---------------------------------------------------------
// 2020-04-22 오후 15:39 <DIR> 2020
// 2021-10-19 오전 00:11 <DIR> AUtempR
// 2022-04-04 오전 10:20 <DIR> Dir
// 2022-04-04 오전 10:20 0 file1.txt
// 2022-04-04 오전 10:20 0 file2.txt
// 2022-04-04 오전 10:20 0 file3.txt
// 2022-04-01 오전 11:32 24 TTT.txt
// 2022-04-01 오전 10:12 6 TTT2.txt
// =========================================================
} // main
} // end class
08. FileInputStream
package file;
import java.io.File;
import java.io.FileInputStream;
import lombok.Cleanup;
public class FileInputStreamExample {
public static void main(String[] args) {
try {
@Cleanup
FileInputStream fis =
// Path Separator ( 경로 구분자) - 운영체제마다 다르다.
new FileInputStream("C:\\app\\workspace\\JSE\\project1\\src\\file\\FileInputStreamExample.java");
// 해당 주소에 있는 자바 클래스에 있는 코드가 그대로 콘솔창에 출력된다.
System.out.println("1. " + File.separator); // 1. \
System.out.println("2. " + File.pathSeparator); // 2. ;
int data; // 데이터를 바이트 기반으로 읽어 들인다.
int [] datas;
while( ( data = fis.read()) != -1 ) { // 탈출 조건식 : EOF
System.out.write(data); // FileInputStream // System.out : PrintStream < InputStream ( 여기의 write 메소드 호출 )
} // while
// fis.close(); // 운영체제에 자원 반납
}catch( Exception e) {
e.printStackTrace();
} // try-catch
} // main
} // end class
09. FileInputStream
package file;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import lombok.Cleanup;
public class FileInputStreamExample3 {
public static void main(String[] args) { // String buffer 버전
try {
Charset cs = Charset.forName("UTF-8"); // Charset 생성
@Cleanup
FileInputStream fis =
// Path Separator ( 경로 구분자) - 운영체제마다 다르다.
new FileInputStream("C:\\app\\workspace\\JSE\\project1\\src\\file\\FileInputStreamExample.java");
// 해당 주소에 있는 자바 클래스에 있는 코드가 그대로 콘솔창에 출력된다.
InputStreamReader is = new InputStreamReader(fis, cs); // 일단 fis생성쪽에서는 불가능해서 한 단계 더 걸쳤어요ㅠㅠ
int data; // 데이터를 바이트 기반으로 읽어 들인다.
// 버퍼 생성
StringBuffer sb = new StringBuffer();
while( ( data = is.read()) != -1 ) { // 탈출 조건식 : EOF
sb.append((char) data);
} // while
String source = sb.toString();
System.out.println(source);
}catch( Exception e) {
e.printStackTrace();
} // try-catch
} // main
} // end class
10. FileOutputStream
package file;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import lombok.Cleanup;
public class FileOutputStreamExample {
public static void main(String[] args) { // 파일 복사하기 ( 사진을 복사 )
String originalFileName = "C:/Temp/wow.jpg"; // 복사할 대상
String targetFileName = "C:/Temp/peakpx.jpg"; // 복사해서 생성할 대상
try {
@Cleanup FileInputStream fis = new FileInputStream(originalFileName); // For source file
@Cleanup FileOutputStream fos = new FileOutputStream(targetFileName); // For target file
int readByteNo;
byte [] readByte = new byte [100]; // 바가지 생성
while ( ( readByteNo = fis.read(readByte)) != -1 ) { // 바가지를 이용해서 한번에 100바이트를 읽는다.
fos.write(readByte,0,readByteNo);
// 바가지에 읽은 바이트를 한번에 출력 버퍼에 넣는다.
// 어디에서부터 어디까지 얼마나 읽은지 지정
} // while
fos.flush();
System.out.println("복사가 잘 되었습니다.");
} catch ( Exception e ) {
e.printStackTrace();
} // try - catch
} // main
} // end class
11. FileReader
package file;
import java.io.FileReader;
import lombok.Cleanup;
public class FileReaderExample { // 문자 기반으로 읽어내자
public static void main(String [] args) {
try {
@Cleanup FileReader fr
= new FileReader("C:\\app\\workspace\\JSE\\project1\\src\\file\\FileInputStreamExample.java");
int readCharNo;
char [ ] cbuf = new char [100]; // 사이즈 100의 바가지 준비
while( (readCharNo = fr.read(cbuf)) != -1 ) {
String data = new String(cbuf,0,readCharNo);
System.out.print(data);
} // while
} catch ( Exception e) {
e.printStackTrace();
} // try - catch
} // main
} // end class
12. FileWriter
package file;
import java.io.File;
import java.io.FileWriter;
import lombok.Cleanup;
public class FileWriterExample {
public static void main (String[] args) {
try {
File file = new File("C:/Temp/file.txt");
@Cleanup
FileWriter fw = new FileWriter(file, true); // 파일타입의 파일이라는 객체에 추가한다는 의미이다.
fw.write("FileWriter는 한글로 된 " + "\r\n" );
fw.write("문자열을 바로 출력할 수 있다. " + "\r\n");
fw.flush();
} catch ( Exception e ) {
e.printStackTrace();
} // try catch
} // main
} // end class
13. format
package file;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TTT { // 날짜 포멧팅하기 (*****)
public static void main (String [] args) {
// 1. 현재의 날짜와 시간 정보를 가지고 온다. ( 구버전 )
Date now = new Date();
System.out.println("1. now ( 구버전 ) : " + now);
// 출력 : 1. now ( 구버전 ) : Mon Apr 04 10:34:08 KST 2022
// ===============================================================
// 2. 우리나라에 익숙한 날짜 및 시간형식으로 바꾸기 : 2022/04/04 - 10:35:54
String pattern = "yyyy/MM/dd a HH:mm:ss"; // 몇 자리로 표시할지를 규정하고 있다.
// ss.SSS로 작성하게 된다면, 밀리세컨드 단위로 포멧팅되게 된다.
DateFormat df = new SimpleDateFormat(pattern); // 다형성 1
// DateFormat은 추상 클래스이기에 바로 객체를 생성할 수 없어서 자식 클래스 중 SimpleDateFormat를 활용한다.
// public SimpleDateFormat(String pattern)
// String pattern은 포켓팅한 날짜의 형식을 넣어야 한다.
System.out.println( "2. df.format(now) [ 우리나라 버전 ] : " + df.format(now) ); // 다형성 2
// 출력 : 2. df.format(now) [ 우리나라 버전 ] : 2022/04/04 오전 11:06:39
} // main
} // end class
'KH 정보교육원 [ Java ]' 카테고리의 다른 글
KH - 2차 시험 + 국비 1개월차 후기 (0) | 2022.04.05 |
---|---|
KH 27일차 - 보조스트림 / 네트워크 (0) | 2022.04.05 |
KH 25일차 - 콘솔 (0) | 2022.04.01 |
KH 24일차 - 자바 입출력 ( Reader / Writer ) (0) | 2022.03.31 |
KH 23일차 - 컬렉션 프레임워크 및 IO (0) | 2022.03.30 |