컴퓨터 관련/JAVA 강의

java #28 IO Stream -입력-

승명 2016. 12. 18. 20:44

java #28 IO Stream -입력-

 

* IO Stream

- JVM 외부에 있는 데이터를 읽어들이거나 JVM이 목적지로 연결하는 것.
- 단방향 stream(입력과 출력을 동시에 할수 있는 Stream 없다.)

입력의 근원 (InputStream)


출력의 목적지

1. 시스템(키보드)
2. 파일 

3. 네트워크


JVM
클래스

 

버퍼

- java.io package의 Stream 관련 클래스들

bit

8bit Stream

(byte 기반 Stram)

8bit Stream

(byte 기반 Stram)

16bit Stream

(문자열 기반 Stream)

16bit Stream

(문자열 기반 Stream)

역할읽기쓰기읽기쓰기
상위 스트림InputStream OutputstreamReaderWriter
스트림FileInputStreamFileOutputStreamFileReaderFileWriter
스트림ObjectInputStreamObjectOutputStreamBufferedReaderBufferedWriter
스트림BufferedDataInputStreamDataOutputStream



* Stream의 연결(입력)

8bit + 8bit
8bit + 16bt = 16bit

- 16bit의 관이 넓지만 8bit가 빠르다. 호스의 유속과 마찬가지.
- 8bit는 한글이 깨진다.

형식

키보드로부터 입력받기

파일로부터 입력받기

설명
키보드->마더보드의 키보드버퍼->OS->JVM
(OS에 관을 꽂아두고 있어서 키보드 버퍼의 내용을 빼앗아간다. 
System.In.InputStream)
2바이트의 한글을 1바이트의 공간에 넣을때는 %??%?? 형식으로 두개로 나눠서 저장함.
8비트 : FileInputStream
16비트 : FileReader

* 파일의 정보 얻기
- File class 사용
File f=new File("경로"); // 객체화
길이f.length() -> long으로 반환
절대경로
f.getAbsolutePath(); // c:\dev\a.txt
파일 이름f.getName();
읽기 가능한가?f.canRead();
쓸수 있는가? f.canWrite();
파일인가?f.isFile();
폴더인가?f.isDirectory();
히든인가?f.isHidden();
마지막 수정일f.lastModified();
폴더안에 모든 파일, 폴더f.listFiles();
파일이 존재하는가f.exists();
객체화
및 사용
1
2
3
4
InputStream is = System.in;
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new Bufferedreader(isr)
String S = br.readline();
cs

1
2
3
4
BufferedReader br = new BufferedReader()
new InputstreamReader(System.in));
String s = br.readline();
br.close();
cs
1
2
FileInputStream fis = new FileInputStream("파일의 경로");
cs


1
FileReader fr = new FileReader("파일의 경로);
cs
예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package day0306;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Calendar;
 
/**
*8bit stream과 16bit stream의 연결 사용.
*키보드의 입력값을 받아와서 줄단위로 읽어드리는 스트림의 사용
*/
public class UseSystemIm {
 
     public static void main(String[] args) {
 
          BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
     try {
          System.out.print("이름 입력 : ");
          String name=br.readLine();
          System.out.print("\n나이 입력 : ");
          String age=br.readLine();
          if(name.equals("홍길동")){
               System.out.print("반장 ");
          }
          
          System.out.println(name+"님 "+age +"살 입니다.");
          int temp_age=Integer.parseInt(age);
          System.out.println((Calendar.getInstance().get(Calendar.YEAR)-temp_age+1)+"년대생");     
 
     } catch (IOException e) {
          e.printStackTrace();
     }catch(NumberFormatException nfe){
          System.out.println("나이는 숫자입니다.");
     }//end catch
     }//main 
}//class
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package day0306;
 
import java.io.File;
import java.sql.Date;
import java.text.SimpleDateFormat;
 
/**
* File class를 사용하여 입력된 파일의 정보를 얻는 클래스
*/
public class UseFile {
 
public static void main(String[] args) {
String path = "c:/dev/temp/java_read.txt"
File file= new File(path);
if(file.exists()){//파일존재
System.out.println("절대 경로 : "+file.getAbsolutePath());
System.out.println("경로 : "+file.getPath());
System.out.println("경로만 : "+file.getParent());              
System.out.println("파일명 : "+file.getName());
System.out.println(file.isFile()?"파일":"폴더");
System.out.println(file.isDirectory()?"폴더":"파일");
System.out.println(file.isHidden()?"숨김파일":"일반파일");
System.out.println(file.canRead()?"읽기가능":"읽기불가능");
System.out.println(file.canWrite()?"쓰기가능":"쓰기불가능");
System.out.println(file.canExecute()?"실행가능":"실행불가능");
System.out.println("파일이 마지막으로 수정된날짜: "+
new SimpleDateFormat("yyy-MM-dd ,EEEE HH:mm:ss").format(new Date(file.lastModified())));
}else{//파일 없음
System.out.println(path+"에는 파일이 존재"
                               + "하지 않습니다.");
}
}
 
}
cs


* 파일읽기

- 8bit, 8bit+16bit 결합, 16bit 3가지 방법이 있다.

1. 8bit

대상 파일에 관계없이 읽어낼 수 있다.

가. 객체화
1
FileInputStream fis = new FileInputStream();
cs

나. 사용
1
2
3
4
5
int data = 0;
while ((data = fis.read()) != -1) {
System.out.print((char) data);
}
 
cs

다. 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public void octalStream() throws IOException {
          File file = new File("c:/dev/temp/Penguins.jpg");
          if (file.exists()) {
               FileInputStream fis = new FileInputStream(file);
               // System.out.println(fis.read());
               int data = 0;
               // 파일의 내용을 읽어 낼수 없다면 -1이 나온다.
               while ((data = fis.read()) != -1) {
                    System.out.print((char) data);
 
               }// end while
                    // 모든 작업이 끝나면 파일과 연결된 스트림 끊기
          } else {
               System.out.println(file.getAbsolutePath() + "파일의 경로를 확인하세요 ");
          }
     }
 
public static void main(String[] args) {
          UseFileRead ufr = new UseFileRead();
          try {
               // ufr.octalStream(); //8bit 스트림만 사용한 경우
               // ufr.Combine(); // 8bit와 16bit stream의 결합
               ufr.hexStream();
          } catch (IOException e) {
               e.printStackTrace();
          }
     }
}
cs


2. 8bit & 16bit결합

c:\dev\a.txt   →F.I.S →I.S.R →B.R →JVM-class


가. 객체화
1
2
3
4
File f=new File("path");
FileInputStream fis = new FileInputStream(f);
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader bg=new BufferedReader(isr);
cs

※ 아래와 같이 한줄로 객체화 할 수 있음.

1
BufferedReader br=new BufferedReader(new InputStreamReader(new FileReader(f)));

cs


나. 사용
1
2
3
4
String s="";
while (s=br.readLine())!=null){ // readLine은 \n까지 읽는다.
s.o.p(s);
}
cs


다. 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 8bit와 16bit 스트림의 복합 사용
*/
public void Combine() throws IOException {
     File file = new File("c:/dev/temp/java_read.txt");
     if (file.exists()) {
          BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
          String data = "";
          while ((data = br.readLine()) != null) {
               System.out.println(data);
          }// end whlie
 
          br.close();
     } else {
          System.out.println(file.getAbsolutePath() + "파일이 존재하지 않습니다.");
     }
}// combine
cs

3. 16bit
c:\dev\a.txt   →F.R →B.R →JVM-class

가. 객체화
1
2
3
File f = new File("path");
File Reader fr=new FileReader(f);
BufferedReader br = new BufferedReader(fr);
cs


※ 아래와 같이 한줄로 객체화 할 수 있음.
1
BufferedReader br=new BufferedReader(new FileReader(f));
cs

나. 사용
1
2
3
4
5
String temp="";
while((temp=br.readline())!=null){
s.o.p(temp);
}
 
cs

다. 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void hexStream() throws IOException {
     File file = new File("c:/dev/temp/java_read.txt");
     if (!file.exists()) {
          // 파일이 없을 때
          System.out.println(file.getName() + "파일의 경로를 확인하세요");
     } else {
          // 파일이 있을 때
          BufferedReader br = new BufferedReader(new FileReader(file));
          String data = "";
          int i = 1;
          while ((data = br.readLine()) != null) {
               System.out.println(i + " " + data);
               i++;
          }// while
          br.close();
     }// else
}// hex