반응형



이 게시물은 다음 게시물인 Java 파일 기본 입출력 (2)에서도 이어집니다.


이번 게시물에서는 File을 읽어오는 과정을 기술


다음 게시물에서는 File에 쓰는 과정을 기술 합니다.



자바에서 기본 파일 입/출력은 다음과 같다.


일단 입/출력에 관해 혼동스러울 수 있는 내용에 대해 이야기하면,


입력이라는 것은 파일에 입력되는것이 아닌, 파일에서 자바 프로그램(ex : 콘솔창)으로 입력됨을 의미한다.

(System.out.print 혹은 printf와 비슷)


출력이라는 것은 printf처럼 출력이 아닌 자바 파일로 출력되는 것을 의미한다.

(Scanner 혹은 scanf와 비슷)


다소 헷갈릴 수 있으니 주의하자.



아래 코드의 설명은 다음과 같다.


1. throws IOException을 통해 파일을 읽을 때 읽지 못하는 것 등등의 예외처리를 한다.


2. FileInputStream r = new ~를 통해 파일이 열림과 동시에 읽기 모드로 열린다.


3. ch는 int형으로 r.read()를 통해 아스키 코드의 문자를 받아온다.


4. 그리고 print를 통해 (char)로 형변환 후 출력한다.


5. read()함수는 1바이트씩 가져오기에 한글을 깨져서 출력된다. 


그리고 아스키 코드로 받아오기에 한글은 아스키 코드에 없다. 따라서 한글은 결국 깨진다.


6. close()를 통해 열린 파일을 닫아준다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package JavaRead;
 
import java.io.File; // File.seperator때문에 임시 import
import java.io.IOException; // Exception에 이용
import java.io.FileInputStream; // read(), close()에 이용
 
public class rwBasic{
    
    public static void main(String []args) throws IOException // file을 읽지 못하는 것에 대한 Exception을 throw 해야한다.
    {
        FileInputStream r = new FileInputStream("C:"+File.separator+"test"+File.separator+"text.txt");
        
        int ch;
        
        while( (ch = r.read()) != -1)
            System.out.print((char)ch);
            
        r.close(); // 항상 파일은 끝난 후 닫아주어야 한다.
    }
    
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus







다음 코드는 바이트 단위로 받아들이는 코드이다.


위의 코드와 다른점은 ch로 읽은 값을 바로 출력하지 않고, byte 배열에 모두 저장한 후, 마지막에 한번에 출력한다는 점이다.


한글은 2바이트니 바이트단위로 담은 배열에서는 new String(bt)를 통해 스트링으로 변환하면 한글이 깨지지 않는다.


다만 결과화면을 보면 알다시피, byte []bt = new byte[1024];에서 모든 1024개의 배열값이 0으로 초기화되며


문자열이끝나고도 계속 없는 문자가 출력되는 현상을 볼 수 있다.



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
package JavaRead;
 
import java.io.File;
import java.io.FileInputStream;
 
public class rwBasic{
 
    public static void main(String []args) throws Exception
    {
        FileInputStream r = new FileInputStream("C:"+File.separator+"test"+File.separator+"text.txt");
        
        int ch;
        byte []bt = new byte[1024];
        
        int i = 0;
        while((ch = r.read()) != -1)
        {
            bt[i] = (byte)ch;
            i++;
        }
        
        System.out.print(new String(bt));
        r.close();
        
    }
 
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus






이번 코드는 자주 이용하는 Scanner을 이용하여 제작한다.


아래 코드에 이용된 함수는 다음과 같다.


hasNextLine() :: 한줄 내용이 존재한다면 1을 리턴, 없다면 0을 리턴한다.


nextLine() :: 그 줄의 값을 String ch에 입력한다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package JavaRead;
 
import java.io.File;
import java.util.Scanner;
 
public class rwBasic{
    
    public static void main(String []args) throws Exception
    {
        Scanner sc = new Scanner(new File("C:"+File.separator+"test"+File.separator+"text.txt"));
        
        String ch = "";
        
        while( sc.hasNextLine() )
        {
            ch = sc.nextLine();
            System.out.print(ch);
        }
        sc.close();
    }
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus























반응형