Search

반응형

'자바'에 해당되는 글 51건

  1. 2021.02.21 [자바/java]파일 읽기를 위해 I/O Streams 중 Character Streams(문자열 스트림)에 대해 알아봅니다.
  2. 2020.05.15 [자바/java]Iterator 와 Enumeration 쉽게 이해하기 편.
반응형

안녕하세요. 신기한 연구소입니다.

요즘 프로젝트를 하는 중인데요.

기존 SQL을 참고해서 새로운 SQL문을 사용하는 방식인데 문제는 테이블명과 컬럼명이 변경되었다는 겁니다.

기존 컬럼명을 새로 바뀐 컬럼으로 바꾸는 작업이 거의 노동 수준이라 자동화를 위해 고민해봤습니다.

매핑 정보를 CSV로 변경해서 자동으로 비교 후 변환하는 작업을 하려다 보니

파일 정보를 읽어야 하는 상황이 생겼습니다.

그래서 간단하게 사용할 수 있게 코딩해봤습니다.

 

 

자바에서 제공하는 I/O Streams(스트림)은

Byte Streams, Character Streams, Buffered Streams, Scanning, Data Streams, Object Streams으로 구성되는데요.

Character Streams를 사용해서 파일을 읽는 방법을 알아보겠습니다.

먼저 CSV 파일을 만들었습니다.

이 파일을 읽어서 txt파일로 변환도 하고 출력도 하도록 코딩해보겠습니다.

 

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
47
48
package a.b;
 
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
 
 
public class TestExcel {
 
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        
        //스트림 IO 선언
        FileReader inputStream = null;
        FileWriter outputStream = null;
        
        //스트림으로 읽을  파일 변수
        int c;
 
        try {
            //읽을 파일
            inputStream = new FileReader("C:/TestData/csvData.csv");
            //읽은 내용으로 새로 만들 파일
            outputStream = new FileWriter("C:/TestData/csvData.txt");
 
            
            //read()메서드를 사용해서 한 글자씩 읽음.
            while ((c = inputStream.read()) != -1) {
                //int로 읽은 스트림을 문자로 확인하기 위해 char ch로 형변환.
                char ch = (char)c;                
                System.out.println(ch);
                
                //새로운 파일을 만듬
                outputStream.write(c);
            }
            
        } finally {
            //사용 후에는 무조건 닫아줘야 함.
            if (inputStream != null) {
                inputStream.close();
            }
            if (outputStream != null) {
                outputStream.close();
            }
        }
    }
 
}
cs

 

실행을 하면 csvData.txt가 생성됩니다.

그리고 char로 출력이 됩니다.

이렇게 한 글자씩 출력이 됩니다. (윗부분만 캡처했습니다.)

하지만 불편한 점 이 있네요.

CSV의 처음 파일을 보면 한 줄씩 row단위로 데이터를 만들고 있는데 

출력은 한 글자씩 나오고 있습니다.

한 줄로 데이터를 받으면 더 편하겠네요.

그런 경우는 BufferedReader()를 사용해서 rereadLine() 메서드를 사용하면

문자열 라인으로 출력이 가능합니다.

 

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
package a.b;
 
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
 
 
public class TestExcels {
 
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        
        //스트림 IO 선언
        BufferedReader inputStreamLine = null;
        String l = "";
        
        try {
            //읽을 파일
            inputStreamLine = new BufferedReader(new FileReader("C:/TestData/csvData.csv"));
 
            while ((l = inputStreamLine.readLine()) != null) {
                //문자열 단위, 한 줄씩 읽음.
                System.out.println(l);
            }
            
        } finally {
            //사용 후에는 무조건 닫아줘야 함.
            if (inputStreamLine != null) {
                inputStreamLine.close();
            }
        }
    }
}
 
cs

 

위 예제는 문자열 단위로 뽑아 옵니다.

결과는 다음과 같습니다.

코드가 무겁지 않아 보이네요.

문자 단위나 문자열로 추출하는 방법에 대해 알아봤습니다.

이 코드를 가지고 잘 사용해봐야겠네요.

 

오라클 자바 튜토리얼을 참고해서 만들어봤는데요. 

자바 공부하기에는 가장 좋은 교재로 생각됩니다.

아래 하트(공감) 버튼을 눌러서 더 다양한 글을 쓸 수 있게 응원 부탁드립니다. 감사합니다.

반응형
반응형

Iterator와 Enumeration

컬렉션(collection) 인터페이스를 사용하는 클래스의 데이터를 순환해서 사용하는 경우 클래스에서 제공하는 size()를 사용해서 for문으로 데이터를 가져오는 방법도 있지만 순환 인터페이스인 iteratorEnumeration을 사용하는 방법도 있습니다.

두 개의 인터페이스는 거의 비슷하지만 스레드(thread)의 지원 여부가 다릅니다.

Iterator는 스레드에 안전하지 않는 구조입니다.

스레드에 안전한 구조로 사용하고 싶다면 Enumeration을 사용하면 됩니다.

ArrayList, HashSet 등은 Iterator을 사용하면 되고,

Vector, Hashtable 등은 Enumeration을 사용하면 됩니다.

 

사실 이 두 개의 인터페이스는 ArratList, Vector 등 클래스에서 제공하는 size를 통해 데이터를 받는 것 보도 더 느립니다. 이유는 List 데이터를 받아 새로운 구조로 다시 만들기 때문인데..

그렇다면 왜 더 느린 이 친구들을 사용하는 것일까?

유지보수 등의 유연성을 더 좋게 하기 위해서입니다.

예를 들어 기존에 사용하던 컬렉션의 클래스를 다른 컬렉션의 클래스로 변경하는 경우 지원하는 메서드가 다르면 수정하는 부분이 많아질 수 있습니다.

하지만 Iterator 인터페이스를 사용한다면 이 부분의 구현부는 굳이 수정할 이유가 없게 됩니다.

Iterator는 다음 내용이 있는지 확인하는 hasNext() 메서드와 그 값을 가져오는 next() 메서드가 있습니다. 또한 해당 컬렉션의 값을 삭제할 수 있는 remove() 메서드도 제공하게 됩니다.

 

Enumeration은 다음 내용이 있는지 확인하는 hasMoreElements() 메서드와 그 값을 가져오는 nextElement() 메서드가 있고 컬렉션의 데이터를 삭제하는 기능은 없습니다.

예제를 통해서 사용법을 익혀봅니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
ArrayList<String> nameList = new ArrayList<String>();
String name;
nameList.add("A");
nameList.add("B");
nameList.add("C");
nameList.add("D");
nameList.add("E");
nameList.add("F");
        
Iterator<String> it = nameList.iterator();
 
while(it.hasNext()) {
    name = it.next();
    if ("F".equals(name)) {
            it.remove();
    }
}
 
        
for(String l : nameList) {
    System.out.println(l);
}
cs

 ArrayList 클래스를 사용한 예제입니다.

해당 클래스는 스레드를 사용하지 않는 클래스입니다.

ArrayList 객체의 iterator() 메서드를 사용해서 Iterator 인터페이스의 it 객체를 생성합니다.

사용법을 잘 확인해 보세요.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
Vector<String> vt = new Vector<String>();
 
vt.addElement("A");
vt.addElement("B");
vt.addElement("C");
vt.addElement("D");
vt.addElement("E");
 
Enumeration<String> e = vt.elements();
 
while(e.hasMoreElements()) {
    System.out.println(e.nextElement());            
}
cs

이 예제는 Vector 클래스를 사용해서 Enumeration 인터페이스의 e 객체를 Vector의 elements() 메서드를 통해 생성했습니다.

스레드 지원이 가능하며 컬렉션에 대한 클래스의 데이터 삭제 기능은 없습니다.

사용법을 잘 확인해 보세요.

지금까지 컬렉션의 순환기능을 제공하는 두 개의 인터페이스에 대해 알아봤습니다.

즐코딩하세요..

반응형