개인용 복습공간

[Java] 파일 채널 ,메모장 만들기 -3 본문

Java

[Java] 파일 채널 ,메모장 만들기 -3

taehwanis 2021. 5. 25. 23:33

 

 

 

파일 채널을 공부하고 파일 채널을 이용한
메모장을 만들어보려고 한다.

 

 

 

 

 

파일 채널

NIO 기반의 데이터 흐름을 위한 수단을 제공하려는 클래스이다. 입출력을 양방향으로 지원하고 기본적으로 버퍼를 이용한다. java.nio.channels 패키지에 있는 추상 클래스이고 일반적으로 소용량 파일을 처리할 땐
FileChannel이 빠르지만 대용량 파일이라면 IO 기반의 파일 처리보다 복잡하고 성능이 떨어질 수 있다.

객체 생성은 FileInputStream이나 FileOutputStream의 getChannel(), FileChannel의 open()로 생성한다.
open()의 Option에는
읽기용 : StandardOpenOption.READ
쓰기용 : StandardOpenOption.WRITE
신규 파일 생성 : StandardOpenOption.CREATE 정도가 있다.

 

다음은 파일 채널을 이용하여 복사하는 예제이다.

FileChannelCopyEx.java

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
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
 
public class FileChannelCopyEx {
    public FileChannelCopyEx() {
        try {
            FileInputStream fis = new FileInputStream("./sample.pdf");
            Path path = Paths.get("./sample_c1.pdf");
            
            FileChannel org = fis.getChannel();
            FileChannel cpy = FileChannel.open(path, StandardOpenOption.WRITE,StandardOpenOption.CREATE);
            
            ByteBuffer buf = ByteBuffer.allocate(10240);
            
            while(org.read(buf) != -1) {
                buf.flip();
                cpy.write(buf);
                buf.clear();
            }
            org.close();
            cpy.close();
            
        }catch(IOException e) {
            e.printStackTrace();
        }
    }
 
    public static void main(String[] args) {
        new FileChannelCopyEx();
    }
 
}
cs

FileInputStream의 getChannel()과 FileChannel의 open()으로 채널을 연결하여 파일을 복사한 예제이다.
read()와 write()할 때 ByteBuffer를 이용하여 읽거나 쓴다.

 

 

메모장

파일채널을 이용한 메모장

메모장의 loadFile과 saveFile부분을 FileChannel을 사용하여 작성해 보았다.

 

 

Notepad.java

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
40
41
42
43
44
45
46
    public void loadFile(String fn){
                
        try {
            Path path = Paths.get(fn);
            FileChannel fc = FileChannel.open(path,
                    StandardOpenOption.READ);       
             
             ByteBuffer buf = ByteBuffer.allocate(1024);
             
             ta.setText("");
             int c = 0;
             while(true) {
                 c = fc.read(buf);
                 if(c == -1break;
                 buf.flip();
                 ta.append(Charset.defaultCharset().decode(buf).toString());
                 buf.clear();
             }
             fc.close();
            
        } catch (IOException e) {
                e.printStackTrace();
        }
 
    }
    
    public void saveFile(String fn){
        try {    
            Path path = Paths.get(fn);
            FileChannel fc = FileChannel.open(path,
                    StandardOpenOption.WRITE,
                    StandardOpenOption.CREATE);
            
                ByteBuffer buf = ByteBuffer.allocate(10240);
 
                 buf.put(ta.getText().getBytes());
                 buf.flip();
                 fc.write(buf);
                 buf.clear();
 
             fc.close();
            
        } catch (IOException e) {
                e.printStackTrace();
        }
    }
cs
Comments