*์ฑ
์ ํ ๋ฐ์ ๋ ๋ณด์๋๋ฐ. 2์๋ฌ์์ ๋๋จธ์ง๋ฅผ ๋ณผ์ ์๋ค.
*ํ์ง๋ง ๋ฌธ์๋ฅผ ๋จ๊ธฐ๋ฉด์ ์ฑ ์ ๋ณด๋๊ฒ ์์ง ์ฑ ๋ด์ฉ์ ํ์คํ ์ดํดํ์ง ์์์ด์ ํ๋ค๋ค ใ .ใ
*์ง๊ธ์ ์ฌ๊ธฐ์ ์ ๋๊ฒ์ด๊ณ . ๋๊ตฐ๊ฐ Java Network Programming์ ๋ณธ๋ค๋ฉด ์ฐธ์ฌํ๊ธฐ ๋ฐ๋๋ค ^^;;
*ํ์ง๋ง ๋ฌธ์๋ฅผ ๋จ๊ธฐ๋ฉด์ ์ฑ ์ ๋ณด๋๊ฒ ์์ง ์ฑ ๋ด์ฉ์ ํ์คํ ์ดํดํ์ง ์์์ด์ ํ๋ค๋ค ใ .ใ
*์ง๊ธ์ ์ฌ๊ธฐ์ ์ ๋๊ฒ์ด๊ณ . ๋๊ตฐ๊ฐ Java Network Programming์ ๋ณธ๋ค๋ฉด ์ฐธ์ฌํ๊ธฐ ๋ฐ๋๋ค ^^;;
์ฑ
์ ๋ณด๋ค๊ฐ ์ฌ์ง ์ ์ผ๋ฉด์ ๋ณด๋๊ฒ ์ข๋ค๋ ์๊ฐ์ด ๋ ๋ค.
JAVA Network Programming
JAVA Network Programming
Contents
- 1. PART1 ๋ฐฐ๊ฒฝ์ง์
- 2. PART2 ์คํธ๋ฆผ
- 2.1. Chapter5 ์คํธ๋ฆผ์ ์๊ฐํฉ๋๋ค
- 2.2. Chapter6 ์คํธ๋ฆผ์ ์ฌ์ฉํ ํ์ผ์ฒ๋ฆฌ ํ๋ก๊ทธ๋๋ฐ์ ์ง์
- 2.3. Chapter7 ํํฐ๋ฅผ ์ด์ฉํ ์คํธ๋ฆผ ํ์ฅ ๊ธฐ๋ฒ
- 2.4. Chapter8 API๋ก ์ ๊ณต๋๋ ์คํธ๋ฆผ ํํฐ
- 2.5. Chapter9 ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ์ I/O ์คํธ๋ฆผ
- 2.6. Chapter10 ๋ฌธ์ ์คํธ๋ฆผ์ ์ฌ์ฉํ ๊ฐ์ ๋ I/O ๊ธฐ๋ฒ
- 2.7. Chapter11 ๋ฌธ์ ์คํธ๋ฆผ ํํฐ
- 2.8. Chapter12 ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ์ ๋ฌธ์ ์คํธ๋ฆผ
- 2.9. Chapter13 ํ์์ ! ๊ฐ์ฒด ์คํธ๋ฆผ
- 3. PART3 ๋คํธ์ํน
- 4. ์ก๋ด
1. PART1 ๋ฐฐ๊ฒฝ์ง์ ¶
- 1์ฅ : ํ๋ก๊ทธ๋๋จธ๊ฐ ์์์ผํ๋ ๋คํธ์ํฌ์ ๊ธฐ๋ณธ
- 2์ฅ : ์๋ฐ ๋ณด์ ๋ชจ๋ธ
- 3์ฅ : ์์ธ์ฒ๋ฆฌ
- 4์ฅ : ์๋ฐ๋ก ํ์ด๋ณด๋ ๋ค์ค ์ฐ๋ ๋ฉ
1.1. Chapter1 ํ๋ก๊ทธ๋๋จธ๊ฐ ์์์ผํ๋ ๋คํธ์ํฌ์ ๊ธฐ๋ณธ ¶
- ๋คํธ์ํฌ๊ดํ ๊ธฐ์ด์ง์๋ค์ด ๋์จ๋ค. (TCP/IP,UDP.๋ฑ๋ฑ์ ์๊ฐ)
1.2. Chapter2 ์๋ฐ ๋ณด์ ๋ชจ๋ธ ¶
- ์๋ฐ์ ๋๊ฐ์ง ๋ณด์
- ๋ณธ์ง์ ์ฑ๊ฒฉ์ ๋๋ ๋ก์ฐ ๋ ๋ฒจ ๋ณด์ : ๋คํธ์ํฌ๋ฅผ ํตํด์ ์ฝํ์ง ๋ฐ์ดํธ์ฝ๋์ ๋ฌด๊ฒฐ์ฑ๊ณผ ๊ด๋ จ ๋งค์ฐ์ค์ํ ๋ถ๋ถ์ด๊ธดํ๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ์ ์ผ๋ก ์ธ์ธํ๊ฒ ์ํ์์์
- ์์๊ณผ ๊ด๋ จ๋ ๋ณด์ : ์์๊ณผ ๊ด๋ จ๋ ๋ณด์์ ๋ก์ฐ ๋ ๋ฒจ ๋ณด์๋ณด๋ค ์ข๋ ํ๋ก๊ทธ๋๋จธ์๊ฒ ์ง์ ์ ์ผ๋ก ๊ด๋ จ๋์ด์์ ์ ํ๋ฆฟ์ ํด๋ผ์ด์ธํธ๋ก ์ฌ์ฉํ ๋ ๋ ์ค์ํจ ์ด๋ ์ ํ๋ฆฟ์ด ๋ณด์ ์ ์ฝ์ ์ง์ ์ ์ผ๋ก ์ฐ๊ด๋์ด ์๊ธฐ ๋๋ฌธ
- ๊ทธ์ธ URLํ๋กํ ์ฝ,IP๋ฉํฐ์บ์คํธ,DNS,๋ฐฉํ๋ฒฝ,HTTP ํ๋ก์ ์๋ฒ,SOCKS,๋ฐฉํ๋ฒฝ ๋ด๋ถ์ DNS์ ๊ดํด ๊ฐ๋จํ ์ค๋ช
๋์ด
- ๋ณธ์ง์ ์ฑ๊ฒฉ์ ๋๋ ๋ก์ฐ ๋ ๋ฒจ ๋ณด์ : ๋คํธ์ํฌ๋ฅผ ํตํด์ ์ฝํ์ง ๋ฐ์ดํธ์ฝ๋์ ๋ฌด๊ฒฐ์ฑ๊ณผ ๊ด๋ จ ๋งค์ฐ์ค์ํ ๋ถ๋ถ์ด๊ธดํ๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ์ ์ผ๋ก ์ธ์ธํ๊ฒ ์ํ์์์
1.3. Chapter3 ์์ธ์ฒ๋ฆฌ ¶
- ๋ณดํต ์๋ฐ์ฑ
์์ ๋ณผ์์๋ ์ ๋์ ์์ธ์ฒ๋ฆฌ์ ๊ดํ ์ค๋ช
์ด ๋์์์
- ๊ฐ๋จํ ์ฌ์ฉ์ ์์ธ
~cpp import java.io.IOException; public class AuthException extends IOException{ //์ฌ์ฉ์ ์์ธ๋ฅผ ์ ์ํ ๋ ์ ๋นํ ์์ธ ํด๋์ค์ ์๋ธํด๋์ค๊ฐ ๋๋๊ฒ์ด ์ค์ํ๋ฐ public AuthException(){ //๋คํธ์ํน ์ฝ๋์์๋ IOException์ด ์ ๋นํ๋ค. } //๋น์ฐํ ์๊ธฐ์ง๋ง IOException์ ์ฒ๋ฆฌํ๋ ๋ค๋ฅธ ๋ชจ๋ ์ฝ๋์์ ์ฒ๋ฆฌ๋ ์์๋ค. public AuthException(String detail){ super(detail); } }
1.4. Chapter4 ์๋ฐ๋ก ํ์ด๋ณด๋ ๋ค์ค ์ฐ๋ ๋ฉ ¶
- ๋ค์ค ์ฐ๋ ๋ฉ์ ์๋ฐ ๋คํธ์ํฌ ํ๋ก๊ทธ๋๋ฐ์์ ๋งค์ฐ ์ค์ํ ๋ถ๋ถ์ด๋ค. ^^;;
- ๋๊ธฐํ(Synchronization) : ๋๊ธฐํ๋ ์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ๋์์ ์์
ํ ๋ ๊ฐ ์ฐ๋ ๋์ ์์
์์๋ฅผ ์ ์ดํ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ์ด๋ค.
- ์๋ฐ์์ ์ฝ๋์ ํน์ ๋ถ๋ถ์ ํ๋ฒ์ ํ ์ฐ๋ ๋๋ง์ด ์ ๊ทผํ ์ ์๋๋ก ํด์ฃผ๊ธฐ์ํด synchronized ๋ฌธ์ฅ์ ์ฌ์ฉ
~cpp synchronized(anObject){ //์ค์ํ ์ฝ๋๋ค }
- ์ธ๋งํฌ์ด(semaphores) : ์ธ๋งํฌ์ด๋, ์๋ฐ ๊ฐ์ฒด๊ฐ ์๋๋ผ ํน๋ณํ ํํ์ ์์คํ
๊ฐ์ฒด์ด๋ฉฐ, ์ด๊ฐ์ฒด๋ '์ป๊ธฐ(get)'์ '๋๊ธฐ(release)'๋ผ๋ ๋ ๊ฐ์ง ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค ํ ์๊ฐ์, ์ค์ง ํ๋์ ์ฐ๋ ๋๋ง์ด ์ธ๋งํฌ์ด๋ฅผ ์ป์ ์ ์์ผ๋ฉฐ(get), ํ ์ฐ๋ ๋๊ฐ ์ธ๋งํฌ์ด๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋์ ์ธ๋งํฌ์ด๋ฅผ ์ป์ผ๋ ค๊ณ ์๋ํ ๋ค๋ฅธ ์ฐ๋ ๋๋ค์ ๋ชจ๋ ๋๊ธฐ ์ํ์ ๋ค์ด๊ฐ๋ค. ๋ค์ ์ฐ๋ ๋๊ฐ ์ธ๋งํฌ์ด๋ฅผ ๋์ผ๋ฉด(release) ๋ค๋ฅธ ์ฐ๋ ๋๊ฐ ์ธ๋งํฌ์ด๋ฅผ ์ป๊ณ (get) ๋ค์ ๋๊ธฐ์ํ๋ก ๋ค์ด๊ฐ๋ค. ์ด๋ฐํ ๋งค์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ ํน์ ์์
์ ๋๊ธฐํ ํ ์์๋ค.
- ๋๊ธฐํ์ ํจ์จ : ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋๊ธฐํ ์์
์ ๋งค์ฐ ์ค์ํ๋ฉฐ, ๋๋ก๋ ์ ๋ ์๋ตํด์๋ ์๋๋ ๊ฒฝ์ฐ๋ ์๋ค. ๊ทธ๋ฌ๋ ๋ถํ์ํ ๋๊ธฐํ ์์
์ ํ๋ก๊ทธ๋จ์ ์ํ ์ฑ๋ฅ์ ๋จ์ด๋จ๋ฆฌ๊ณ , ์ฌ์ฌ์ฉ์ฑ์ ๊ฐ์์ํค๋ฉฐ, ํ๋ก๊ทธ๋จ์ด ๊ต์ฐฉ ์ํ์ ๋น ์ง๊ฒ ํ ์๋ ์๋ค.
- ์๋ฐ์์ ์ฝ๋์ ํน์ ๋ถ๋ถ์ ํ๋ฒ์ ํ ์ฐ๋ ๋๋ง์ด ์ ๊ทผํ ์ ์๋๋ก ํด์ฃผ๊ธฐ์ํด synchronized ๋ฌธ์ฅ์ ์ฌ์ฉ
- Thread ํด๋์ค : ๋ณดํต ์์๋ฐ์์ ์ฌ์ฉ
~cpp public class SubThread extends Thread{ public void run(){ //์ฐ๋ ๋ ์์ } public static void main(String[] args){ SubThread subThread = new SubThread(); subThread.start(); //์ฐ๋ ๋ ์์ }
- Runnable ์ธํฐํ์ด์ค : Thread ํด๋์ค๋ฅผ ์ง์ ์์๋ฐ์ง ์์ ํด๋์ค์ ๊ฐ์ฒด๊ฐ ์์ฝ๊ฒ ์ฐ๋ ๋๋ฅผ ์์ฑํ ์ ์๋๋ก ํด์ค
~cpp public class ThreadDemo implements Runnable{ protected Thread execution; public synchronized void begin(){ //๋๊ธฐํ if(execution == null){ execution = new Thread(this); //Runnable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฒ์ ๋ฃ์ด์ค execution.setPriority(Thread.MIN_PRIORITY); //์ฐ์ ์์๋ฅผ ์ ํจ execution.start(); // ์ฐ๋ ๋์์ } } public synchronized void end(){ //๋๊ธฐํ if(execution !=null){ execution.interrupt(); //stop()์ ์ฐ๋ ๊ฒ์ ๋ณ๋ก ๋ฐ๋์งํ์ง ์๋ค stop()์ ์ฐ๋ ๋๊ฐ ์ด๋ค ์ํฉ์ ์๋๋ผ๋ ์ฐ๋ ๋๋ฅผ ๋ฐ๋ก ๋ฉ์ถ์ด ๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์, execution = null; //์ฐ๋ ๋๊ฐ ํฌ๋ฆฌํฐ์ปฌ ์น์ ์ ์ํํ๋ ๋์ค ์ด ๋ฉ์๋๊ฐ ํธ์ถ๋๋ ๊ฒฝ์ฐ,์ค์ํ ๋ฐ์ดํฐ์ ๋ค๋ฅธ ์ฐ๋ ๋๊ฐ ์์ ์ ๊ทผํ ์ ์๋ } //๊ฒฝ์ฐ๊ฐ ์๊ธธ ์๋ ์๋ค. ๋ฐ๋ผ์ stop() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๋์ ์ฐ๋ ๋ ์์ ์ ์ข ๋ฃ์ํ๋ฅผ ์ธ์งํ๊ณ , ์ํ์ ์ค์งํ๋ ํ๋๊ทธ } //์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ๋์ข๋ค. ๊ฐ์ฅ ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ์ ์์ ๊ฐ์ ํ๋๊ทธ์ ํจ๊ป interrupt()๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. public void run(){ try{ Thread myself = Thread.currentThread(); //ํ์ฌ ์คํ์ค์ธ ์ฐ๋ ๋๋ฅผ ๊ฐ์ ธ์จ๋ค. while(execution == myself){ //์ฐ๋ ๋ ์์ } }finally{ synchronized(this){ execution =null; } } }
- ThreadGroup ํด๋์ค : ์ฌ๋๊ฐ์ ์ฐ๋ ๋๋ฅด ๊ทธ๋ฃน์ผ๋ก ๋ง๋ค์ด ์์ฝ๊ณ Thread๋ฅผ ๊ด๋ฆฌ
- Thread ํต์ง(notification)๋ฉ์๋ : ์ฃผ์ํด์ผ ํ ์ ์, ์ด ๋ฉ์๋๋ค ํธ์ถํ๋ ์ฐ๋ ๋ค์ด ๋ฐ๋์ synchronized ๋ธ๋ก์ผ๋ก ๋๊ธฐํ ๋์ด์ผ ํ๋ค๋ ์ ์ด๋ค.
- wait() : notify() ๋ฉ์๋๋ฅผ ํธ์ถํ ๋๊น์ง ๋ธ๋กํน๋๋ค.
- notify() : ๋๊ธฐํ๊ณ ์๋ ์ฐ๋ ๋์ค ํ๋๋ฅผ ๊บ ์ด๋ค.
- notifyAll() : ๋ฉ์๋๊ฐ ํธ์ถ๋ ๊ฐ์ฒด์์ ๋๊ธฐํ๊ณ ์๋ ๋ชจ๋ ์ฐ๋ ๋๋ค์ ๊นจ์ด๋ค.
- wait() : notify() ๋ฉ์๋๋ฅผ ํธ์ถํ ๋๊น์ง ๋ธ๋กํน๋๋ค.
- ํจ๊ณผ์ ์ธ ๋ค์ค ์ฐ๋ ๋ฉ : ์๋ฐ์์ ์ฐ๋ ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋งค์ฐ ๋๋ฆฐ ์์
์ด๋ฉฐ ์ผ๋ถ ์๋ฐ ๊ฐ์ ๋จธ์ ์ ์ฐ๋ ๋์ ๊ด๋ จ๋ ๋ฉ๋ชจ๋ฆฌ ๋์ค ๋๋ฌธ์ ๊ณ ์ํ๊ธฐ๋ ํ๋ค. ๋ฐ๋ผ์ ํจ๊ณผ์ ์ธ ์ฐ๋ ๋ฉ์ ์ํด์๋ ์๋ก ์ฐ๋ ๋๋ฅด ์์ฑํ๋ ๊ฒ ๋ณด๋ค ์ด์ ์ ์์ฑํ๋ ์ฐ๋ ๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค ์ง๋ณด๋ ํ๋์ ์๋ฐ ๊ฐ์ ๋จธ์ ์์๋ ์์คํ
๋ ๋ฒจ์์ ์ด๋ฌํ ์ฐ๋ ๋ ์ฌ์ฌ์ฉ์ ์ง์ํ๊ธฐ๋ ํ์ง๋ง, ์ด๊ฒฝ์ฐ์กฐ์ฐจ๋ ์ฐ๋ ๋๋ฅผ ์ฌ์์ฉํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ๊ฐ์ง ์ด์ ์ ์ป์์ ์๋ค. --์์ ๋ 17์ฅ์ฏค์..
- ThreadGroup ํด๋์ค : ์ฌ๋๊ฐ์ ์ฐ๋ ๋๋ฅด ๊ทธ๋ฃน์ผ๋ก ๋ง๋ค์ด ์์ฝ๊ณ Thread๋ฅผ ๊ด๋ฆฌ
2. PART2 ์คํธ๋ฆผ ¶
- 5์ฅ : ์คํธ๋ฆผ์ ์๊ฐํฉ๋๋ค.
- 6์ฅ : ์คํธ๋ฆผ์ ์ฌ์ฉํ ํ์ผ ์ฒ๋ฆฌ ํ๋ก๊ทธ๋จ๋ฐ์ ์ง์
- 7์ฅ : ํํฐ๋ฅผ ์ด์ฉํ ์คํธ๋ฆผ์ ํ์ฅ ๊ธฐ๋ฒ
- 8์ฅ : API๋ก ์ ๊ณต๋๋ ์คํธ๋ฆผ ํํฐ
- 9์ฅ : ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ์ I/O์คํธ๋ฆผ
- 10์ฅ : ๋ฌธ์ ์คํธ๋ฆผ์ ์ฌ์ฉํ ๊ฐ์ ๋ I/O๊ธฐ๋ฒ
- 11์ฅ : ๋ฌธ์ ์คํธ๋ฆผ ํํฐ
- 12์ฅ : ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ์ ๋ฌธ์ ์คํธ๋ฆผ
- 13์ฅ : ํ์์
! ๊ฐ์ฒด ์คํธ๋ฆผ
2.1. Chapter5 ์คํธ๋ฆผ์ ์๊ฐํฉ๋๋ค ¶
- ์คํธ๋ฆผ : ๋คํธ์ํฌ ํ๋ก๊ทธ๋จ์์ ์์ฃผ์ค์ํ๋ถ๋ถ
> ์์ฑ ์ด ์คํธ๋ฆผ์๋ํด์ ์์ธํ๋์จ๋ค.๋ด๋ฐ๋ ๋์ถฉ ์ค๋ช ํ๋๋ฐ...;
- OutpuStream,InputStream : ๋ชจ๋ ๋ค๋ฅธ ์คํธ๋ฆผ ํด๋์ค๋ค์ ์ํผํด๋์ค์ด๋ค. ์ด Chapter์์๋ ์ด๋ ํด๋์ค ์ค๋ช
- OutputStream ํด๋์ค : OutputStream ํด๋์ค๋ ํต์ ์ฑ๋๋ก์ ๊ด๋ฌธ์ ์๋ฏธํ๋ค. ์ฆ, OutputStream์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์จ๋ฃ์ผ๋ฉด ๋ฐ์ดํฐ๋ ์ฐ๊ฒฐ๋ ํต์ ์ฑ๋๋ก ์ ์ก๋ ๊ฒ์ด๋ค.
~cpp import java.io.*; public class SimpleOut { //๊ฐ๋จํ OutputStream ์์ public static void println(String msg) throws IOException{ synchronized(System.out){ //๋ฉ์์ง๋ฅผ ํฐ๋ฏธ๋์ ์ถ๋ ฅํ๋ ๋์ค์ ๋ค๋ฅธ ์ฐ๋ ๋์ ์ํด String์ด ์ถ๋ ฅ๋ ์ ์๋๋ก ๋๊ธฐํ์ฒ๋ฆฌ for(int i=0; i<msg.length(); ++i) System.out.write(msg.charAt(i) & 0xff); //16๋นํธ ์ ๋์ฝ๋๋ก ๊ตฌ์ฑ๋ String์ ์ฐ์ํ ๋ฐ์ดํธ๋ก ๋งค์คํนํํ ์ถ๋ ฅ System.out.write('\n'); //๊ฐํ๋ฌธ์ ์ถ๋ ฅ } System.out.flush(); //๋ฒํผ์ ์ ์ฅ๋ ๋ชจ๋ ๋ฐ์ด์ปค๊ฐ ์ถ๋ ฅ๋์์์ ํ์ธํ๋ ์๋ฏธ์์ ์คํธ๋ฆผ์ flush์ํจ๋ค. } public static void main(String[] args) throws IOException { for(int i=0; i<args.length;i++){ println(args[i]); //๋๊ฒจ๋ฐ์ ๋ฌธ์๋ฅผ ํ๋์ฉ ๋๊น } } }
- InputStream ํด๋์ค : InputStream ํด๋์ค๋ ํต์ ์ฑ๋๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ๋ด๋ ๊ด๋ฌธ์ ์๋ฏธํ๋ค. OutputStream์ ์ํด ํต์ ์ฑ๋๋ก ์ฐ์ฌ์ง ๋ฐ์ดํฐ๋ ํด๋นํ๋ InputStream์ ์ํด ์ฝํ์ง๋ค.
~cpp import java.io.*; public class SimpleIn { //๊ฐ๋จํ InputStream ์์ public static void main(String[] args) throws IOException { byte[] buffer = new byte[8]; //์์ ๋ฒํผ๋ฅผ ๋ง๋ค๊ณ int numberRead; while((numberRead =System.in.read(buffer))>=0) //๊ฐ๋ฅํ ๋ง์ ์์ ์ฝ๋๋ค. EOF๊ฐ -1์ ๋ฐํํ๋ฉด ์ถ๋ ฅํ๋ค. System.out.write(buffer,0,numberRead); } }
- OutputStream ํด๋์ค : OutputStream ํด๋์ค๋ ํต์ ์ฑ๋๋ก์ ๊ด๋ฌธ์ ์๋ฏธํ๋ค. ์ฆ, OutputStream์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์จ๋ฃ์ผ๋ฉด ๋ฐ์ดํฐ๋ ์ฐ๊ฒฐ๋ ํต์ ์ฑ๋๋ก ์ ์ก๋ ๊ฒ์ด๋ค.
- ๊ทธ์ธ ๋ค์์ ๋ฐฐ์ธ ์คํธ๋ฆผ๋ค์ ์๊ฐํ๊ณ ์๋ค.
2.2. Chapter6 ์คํธ๋ฆผ์ ์ฌ์ฉํ ํ์ผ์ฒ๋ฆฌ ํ๋ก๊ทธ๋๋ฐ์ ์ง์ ¶
- ์ด์ฅ์์๋ FileOutputStream๊ณผ FileInputStream์ ๊ดํด ๋ค๋ฃจ๊ณ ์๋ค.
- ์ด์ธ์ File,FileDescriptor,RandomAccessFile์ ๊ดํด ๊ฐ๋ตํ ๋์ค๊ณ ํ์ผ์คํธ๋ฆผ๊ณผ ๊ฐ์ด ์ฌ์ฉํ๋ ์์ ๊ฐ ๋์จ๋ค.
- Fileํด๋์ค : ์์คํ
์ ๋
๋ฆฝ์ ์ธ ํ์ผ์ ์ด๋ฆ์ ๋ํ๋ด๊ณ ์ค์ ํ์ผ์ ๊ดํ ์ ๋ณด๋ฅผ ๊ฒฐ์ ํ๋ ๋ฉ์๋๋ฟ๋ง์๋๋ผ, ํ์ผ์ ์์ฑ์ ๋ฐ๊พธ๋ ๋ฉ์๋๋ ์ ๊ณต
- FileDescriptorํด๋์ค : FileDescriptor ๊ฐ์ฒด๋ ํ์ ๋ ๋ฒจ์ ์์คํ
ํ์ผ ์ค๋ช
์๋ก์ ํธ๋ค์ด๋ค. ํ์ผ ์ค๋ช
์๋ ์ด๋ ค์ง ํ์ผ์ ์๋ฏธํ๋ฉฐ, ์ฝ๊ธฐ ์์
์ด๋ ์ฐ๊ธฐ ์์
์ ์ํ ํ์ฌ์ ํ์ผ ๋ด์ ์์น์ ๊ฐ์ ์ ๋ณด๋ค์ ํฌํจํ๋ค. RandomAccessFile์ด๋ FileOutputStream, FileInputStream์ ์ฌ์ฉํ์ง ์๊ณ ๋ ์ ์ฉํ๊ฒ FileDescritor๋ฅผ ์์ฑํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๋ค . --;
- RandomAccessFileํด๋์ค : ํ์ผ์คํธ๋ฆผ์ ์ฌ์ฉํ์ง์๊ณ ํ์ผ์ ์ฝ๊ฒ ๋ค๋ฃฐ์ ์์ ์ฅ์ ์ ํ์ผ์คํธ๋ฆผ ํด๋์ค๋ ์์ฐจ์ ์์ธ์ค๋ง์ด ๊ฐ๋ฅํ์ง๋ง ์ด๊ฒ์ ์์์ ์์ธ์ค๊ฐ ๊ฐ๋ฅํ๋ค. ์ฌ๊ธฐ์ RandomAccessFileํด๋์ค๋ ํ์ผ ์คํธ๋ฆผ์ ๊ฐ์ด ์ฐ๋๋ฐ RandomAccessFile์ ์ฅ์ ์ ๊ฐ์ง๊ณ ๋คํธ์ํฌ์์๋ ๋ณ๋ค๋ฅธ ์์ ์์ด ์ฌ์ฉํ ์์๋ค. ์์ ๋ ๋ฐ์ --;
- Fileํด๋์ค : ์์คํ
์ ๋
๋ฆฝ์ ์ธ ํ์ผ์ ์ด๋ฆ์ ๋ํ๋ด๊ณ ์ค์ ํ์ผ์ ๊ดํ ์ ๋ณด๋ฅผ ๊ฒฐ์ ํ๋ ๋ฉ์๋๋ฟ๋ง์๋๋ผ, ํ์ผ์ ์์ฑ์ ๋ฐ๊พธ๋ ๋ฉ์๋๋ ์ ๊ณต
- FileOutputStream ํด๋์ค : ์ฐ์์ ์ธ ๋ฐ์ดํฐ๊ฐ ํ์ผ์ ์ฐ์ฌ์ง์ ์๋๋ก ํด์ค
- FileInputStream ํด๋์ค : ์ฐ์์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ฝ์์ ์๊ฒ ํด์ค --;
- ๊ฐ๋จํ ํ์ผ ์คํธ๋ฆผ ์์
~cpp import java.io.*; public class copy { //๋ฉ์ธ public static void main(String[] args) throws IOException { if(args.length !=2) //๋์ด์ค๋ args๊ฐ ํ์ผ์ด ์๋ณธ ๋ณต์ฌ๋ณธ ๋๊ฐ์ฌ์ผํ๋ค. throw ( new IllegalArgumentException ("Syntax:Copy <src> <dst>")); FileInputStream in = new FileInputStream(args[0]); //์๋ณธ ํ์ผ FileOutputStream out = new FileOutputStream(args[1]); //๋ณต์ฌ๋ณธ ํ์ผ byte[] buffer = new byte[16]; int numberRead; while((numberRead = in.read(buffer)) >=0) //ํ์ผ์ ๋ฒํผ์ ๊ฐ๋ฅํ ๋ง์ ์์ ์ฝ๊ณ ์ฝ์ ์๋งํผ ํ์ผ์ ์ด๋ค. ํ์ผ์ด EOF์ผ ๋๊น์ง. out.write(buffer,0,numberRead); //์ฌ๊ธฐ์ 0์ ์ด๊ธฐ์์์์น์ด๊ณ ํ์ผ์ ์ธ๋๋ง๋ค ์ ์ ์์ผ๋ก ์ด๋ํ๋ค --; out.close(); //close๊ฐ ํธ์ถ๋์ง ์์ผ๋ฉด FileOutputStream์ ๊ฐ๋น์ง ์ฝ๋ ์ ์ด ์ผ์ด๋ ๋์ ํ์ผ๊ณผ ํ๋ถ์ FileDescriptor๊ฐ ์๋์ผ๋ก ๋ซํ๋ค. in.close(); //์์๋ ๋ง์ฐฌ๊ฐ์ง } }
- ๋ฎ์ด์ฐ๊ธฐ(Overwriting)๊ธฐ๋ฅ์ ๊ฐ์ถ FileOutputStream
~cpp import java.io.*; public class SimpleOverwritingFileOutputStream extends OutputStream { protected RandomAccessFile file; //๋๋ค ์์ธ์ค ํ์ผ public SimpleOverwritingFileOutputStream(String filename) throws IOException { file = new RandomAccessFile(filename,"rw"); //RandomAccessFile์ ํ์ผ์ด ์กด์ฌํ์ง ์์ผ๋ฉด ์๋์ผ๋ก ํ์ผ์์ฑ ํ๊ณ ๊ทธ๋ ์ง //์์ผ๋ฉด ํ์ผ์ ์ฐ๋ค ํ์ผ์ ์ด๋ฉด ํฌ์ธํฐ๋ ์๋์ผ๋ก ํ์ผ์ ์์๋ถ๋ถ์ ๊ฐ๋ฆฌํค๋ฏธ๋ก //๋ฐ์ดํฐ๋ฅผ ์ฐ๋ฉด ๊ธฐ์กด์ ํ์ผ ๋ด์ฉ ์์ ๋ฎ์ด ์ฐ์ฌ์ง๋ค. } public void write(int datum) throws IOException { /**@todo: implement this java.io.OutputStream abstract method*/ file.write(datum); } public void close() throws IOException{ file.close(); } }
- ์์น ์ด๋(Seeking)๊ธฐ๋ฅ์ ๊ฐ์ถ FileOutputStream
~cpp import java.io.*; public class SeekableFileOutputStream extends FileOutputStream { protected RandomAccessFile file; public SeekableFileOutputStream(String filename)throws IOException { this(new RandomAccessFile(filename,"rw")); // ์์ ์ ๋๋ค๋ฅธ ์์ฑ์์๊ฒ ๋๊ฒจ์ค๋ค.--; } public SeekableFileOutputStream(File file) throws IOException{ this(file.getPath()); //์ญ์ ์์ ์ ์์ฑ์๋ฅผ ํธ์ถํจ } protected SeekableFileOutputStream(RandomAccessFile file) throws IOException{ super(file.getFD()); //FileOutputStream์๋ค๊ฐ FileDescriptor๋ฅผ ์ธ์๋ก ๋ ๊ฒจ์ค this.file=file; } public void setPosition(long position) throws IOException{ file.seek(position); //position์ ์์น๋ก ํ์ผ ํฌ์ธํฐ ์์น๋ฅผ ๋ณ๊ฒฝ } public long getPosition() throws IOException{ return file.getFilePointer(); //ํ์ฌ ํ์ผ ํฌ์ธํฐ ์์น๋ฅผ ๋๋ ค์ค } public long getLength() throws IOException{ return file.length(); //ํ์ผ ๊ธธ์ด๋ฅผ ๋๋ ค์ค } public void write(int b) throws java.io.IOException { /**@todo: implement this java.io.OutputStream abstract method*/ file.write(b); } }
- ํ์/๋ฆฌ์
(mark/reset)๊ธฐ๋ฅ์ ๊ฐ์ถ FileInputStream๋ง๋ค๊ธฐ
~cpp import java.io.*; public class MarkResetFileInputStream extends FileInputStream { protected long markedPosition; //๋งํฌ๋ ์์ง protected RandomAccessFile file; //๋๋ค ์์ธ์ค ํ์ผ public MarkResetFileInputStream(String filename)throws IOException { this(new RandomAccessFile(filename,"r")); //๋๋ค์์ธ์ค ํ์ผ์ ์์ฑํด์ ๋ค๋ฅธ ์์ฑ์๋ก } public MarkResetFileInputStream(File file)throws IOException { this(file.getPath()); //ํ์ผ๋ช ์ ๋๊ฒจ์ฃผ์ด ์๋ก --; } protected MarkResetFileInputStream(RandomAccessFile file) throws IOException{ super(file.getFD()); //FileDescriptor๋ฅผ ๋๊ฒจ์ฃผ๊ณ this.file=file; //ํ์ผ์ ์ ์ฅํด๋ ผ๋ค. ์ด๋ฌ๋ฉด ๋๋ค์์ธ์ค๋ FileInputStream ์ฌ์ฉํ ์์๋ค. markedPosition = -1; } public boolean markSupported(){ return true; } public void mark(int readAheadLimit){ try{ markedPosition = file.getFilePointer(); //ํ์ฌ์์น๋ฅผ ๊ธฐ์ตํ๋ค. }catch(IOException ex){ markedPosition = -1; } } public void reset() throws IOException{ if(markedPosition == -1) throw new IOException("No mark set."); file.seek(markedPosition); //๋งํฌํด๋ ผ์์น๋ก ๋ค์๊ฐ๋ค. } }
2.3. Chapter7 ํํฐ๋ฅผ ์ด์ฉํ ์คํธ๋ฆผ ํ์ฅ ๊ธฐ๋ฒ ¶
- ์ง๊ธ๊น์ง๋ ํ ๋ฐ์ดํธ๋ ๋ฐ์ดํธ ๋ฐฐ์ด์ ๋์ ์ฝ๊ณ /์ฐ๊ธฐ๋ฅผ ์ง์ํ๋ ๊ฐ๋จํ ์คํธ๋ฆผ๋ง์ ๋ณด์์๋ค. ์ด๋ฌํ ์์ค์ ํต์ ์ ํ์์ด์์ผ๋ก ๋ฒ๊ฑฐ๋กญ๋ค. ๊ทธ๋์ ์ด๋ฒ์ฅ์์๋ ๊ธฐ์กด์ ์คํธ๋ฆผ์ ์์ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํ ์ ์๋ ์คํธ๋ฆผ์ธ ์คํธ๋ฆผ ํํฐ(stream filter)์ ๋ํด ์๊ฒํ๊ณ๋ค.
- FileterOutputStream , FilterInputStream ํด๋์ค : ์ด๊ฒ์ ์
์ถ๋ ฅ ์คํธ๋ฆผ ํํฐ์ ๋ํ ํ
ํ๋ฆฌํธ๋ก ์ด๋ฏธ ์กด์ฌํ๋ InputStream,OutputStream์ ์ฐ๊ฒฐํด์ ์๊ตฌ๋ ๋ด์ฉ์ ์ฐ๊ฒฐ๋ ์คํธ๋ฆผ์ ๋ฉ์๋๋ก ์ ๋ํด ์ฃผ๋๊ฒ ์ด์ธ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์๋๋ค.
- ํ์ค ์คํธ๋ฆผ ํํฐ :๊ฐ๋ตํ ์ดํด๋ณธ๋ค.
- DataOutputStream๊ณผ DataInputStream : ๊ธฐ์กด์ ๋ฐ์ดํธ๋ง ์ฝ๊ณ ์ฐ๋ ์คํธ๋ฆผ์์์ ์์ ์์ค์ ํต์ ์ด ๊ฐ๋ฅํ๋ค. ์๋ฅผ ๋ค์ด String์ด๋ ๋ถ๋์ ์ค์์ ๊ฐ์ ๊ฒ์ ํต์ ํ ์์๋ค. ๊ธฐ์กด์ ์์ค๋ฎ์(?) ๊ฒ์ ๋ฐ์ดํธ ๋จ์๋ก ํต์ ํด์ผํ๋ค.
- PushbackInputStream : ์
๋ ฅ ์คํธ๋ฆผ์ผ๋ก ๋ฐ์ดํฐ์ ์ฝ๊ธฐ ๋ณต๊ตฌ ๊ธฐ๋ฅ์ ์ง์ํ๋ค. ๋ค์ ๋งํ๋ฉด, ๋ฐ์ดํฐ๊ฐ ์
๋ ฅ ์คํธ๋ฆผ์ผ๋ก ๋ค์ ๋ฃ์ด์ ธ์, ๋ค์ ๋ฒ์ ์ฝ๊ธฐ๋ฅผ ์ํํ ๋์ ๋ค์ ์ฝํ์ง ์ ์๊ฒ ๋๋ค.
- SequenceInputStream : ์ผ๋ จ์ InputStream๋ค์ด ์์ฐจ์ ์ผ๋ก ์ฐ๊ฒฐ๋๋ค. ํ๋์ SequenceInputStream์ ์ฌ๋ฌ InputStream์ด ์ฐ๊ฒฐ๋์ ํ๋์ ๊ธด InputStream์ฒ๋ผ ๋ณด์ธ๋ค.
- LineNumberInputStream : LineNumberReader ํด๋์ค์ ์ํด ์ธ๋ชจ๊ฐ ์์ด์ง ์ด ์คํธ๋ฆผ์ ์ด๋ณด์ ์ธ ์์ค์ผ๋ก ์ค์ ๋ฒํธ ๋งค๊ธฐ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- PrintStream : PrintWriter ํด๋์ค์ ์ํด ์ธ๋ชจ๊ฐ ์์ด์ง ์ด ํด๋์ค๋ ASCII ํ
์คํธ ๋ฐ์ดํฐ์ ์ถ๋ ฅ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- ์คํธ๋ฆผ ํํฐ์ ์ฌ์ฉ ์์ : System.in์ผ๋ก ์
๋ ฅ๋ฐ๋๊ฒ์ BufferedInputStreamํํฐ๋ฅผ ๊ฑฐ์ณ์ LineNumberInputStream์ ๊ฑฐ์ฒ DataInputStream์ ๊ฑฐ์ฒ์ DataOutputStream์ ์ฐ์ฌ์ง๊ณ BufferedOutputStream์ผ๋ก ๋ฒํผ๋ง๋ผ ํ๋ฒ์ ์ถ๋ ฅ๋๋ค. --;
~cpp import java.io.*; public class FilterTest{ public static void main(String[] args) { BufferedInputStream bufferedIn = new BufferedInputStream(System.in); //์ฅ์น ์ ๋ ฅ์ ๋ฒํผ ํํฐ๋ก ๋ฐ๋๋ค. BufferedOutputStream bufferedOut = new BufferedOutputStream(System.out); //ํ๋ฉด์ ์ถ๋ ฅํ๊ธฐ์ ๋ฒํผ์์ํ์คํธ๋ฆผ์ ๊ฑฐ์น๋ค. LineNumberInputStream lineNumberIn = new LineNumberInputStream(bufferedIn); //๋ฒํผ์ ๋ ฅ์ ๋ค์ ๋ผ์ธ์ ๋ถ์ฌ์ฃผ๋ ํํฐ๊ฐ ๋ฐ์ DataInputStream dataIn = new DataInputStream(lineNumberIn); //๋ผ์ธ์ด ๋ถ์ ์ ๋ ฅ์ DataInputStream์ผ๋ก ๋ฐ์์ ํ๋ฐ์ดํธ์ด์์ ์ ๋ฌํจ DataOutputStream dataOut = new DataOutputStream(bufferedOut); //ํ๋ฐ์ดํธ์ด์์ ๋ฐ์ try{ String line; while(true){ line = dataIn.readLine(); //ํ์ค ์ ๋ ฅ์ ๋ฐ๋๋ค. String response = lineNumberIn.getLineNumber() + " : " + line.toUpperCase() + "\n"; //์ค๋ฒํธ๋ฅผ ์ป์ด์ ๋ถ์ ๋๋ฌธ์๋ก ๋ฐ๊ฟ dataOut.writeBytes(response); //BufferdOutputStream์ ์ด๋ค. if(line.equals("exit")) //exit๊ฐ ๋ค์ด์ค๋ฉด ๋ฃจํ๋ฅผ๋๊ฐ๋ค. break; } dataOut.flush(); //์ด์ ๊น์ง ๋ฒํผ์ ๋ชจ์๋ ผ๊ฒ์ ์ถ๋ ฅํ๋ค. }catch(IOException ex){ System.err.println(ex); } } }
2.4. Chapter8 API๋ก ์ ๊ณต๋๋ ์คํธ๋ฆผ ํํฐ ¶
- ์ง๊ธ๊น์ง๋ ์คํธ๋ฆผ ํํฐ์ ๊ฐ๋
์ ์ค์ฌ์ผ๋ก ๋ณด์๊ณ ์ด๋ฒ์ฅ์์๋ API๋ก ์ ๊ณต๋๋ ๋ช๊ฐ์ง ์คํธ๋ฆผ์ ๊ดํด ์ดํด๋ณด๊ณ ์๊ธฐ๋ง์ ํํฐ๋ฅผ ๋ง๋ค์ด๋ณธ๋ค.
- ํ 2์๊ฐ ๋ณธ๊ฑฐ ๊ฐ์๋ฐ ๋ง๋
ํ ์ ์๊ป ์๋ค --; ํ์ ์ค๋ชฉ๋๋๋ถ๋ถ์ด ๋ง๋ค. --;
2.6. Chapter10 ๋ฌธ์ ์คํธ๋ฆผ์ ์ฌ์ฉํ ๊ฐ์ ๋ I/O ๊ธฐ๋ฒ ¶
- ์ง๊ธ๊น์ง๋ ๋ฐ์ดํธ ์คํธ๋ฆผ์ ์ฃผ๋ก ๋ดค๋๋ฐ ์ด์ ๋ถํฐ๋ ์คํธ๋ฆผ์ ์๋์ฐ๋งฅ์ธ ๋ฌธ์ ์คํธ๋ฆผ์ ๋ํด ์์๋ณธ๋ค.
- Write : ๋ฐ์ดํธ ์คํธ๋ฆผ์ OutputStream๊ณผ ๊ฐ์ ์ญํ
- Reader : ๋ฐ์ดํธ ์คํธ๋ฆผ์ InputStream๊ณผ ๊ฐ์ ์ญํ
- OutputStreamWriter : ๋ฌธ์ ๊ธฐ๋ฐ์ Writer์์ ๋ฐ์ดํธ ๊ธฐ๋ฐ์ OutputStream ์ฑ๋๋ก์ ์ฐ๊ฒฐ์ ์ง์ ๋ฌธ์->OutputstreamWriter->๋ฐ์ดํธ
- InputStreamReader : ๋ฐ์ดํธ ๊ธฐ๋ฐ์ InputStream์ ๋ฌธ์ ์คํธ๋ฆผ๊ณผ ์ฐ๊ฒฐ ๋ฐ์ดํธ->InputStreamReader->๋ฌธ์
- FileWriter : ํ
์คํธ ํ์ผ์ ํ๋ซํผ์ ๊ธฐ๋ณธ ๋ฌธ์ ์ธ์ฝ๋ฉ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ์ถ๋ ฅํ๋ ๋ฌธ์ ์คํธ๋ฆผ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณต ํ์ผ์ ์ฐ๋๊ฒ์ --;
- FileReader : ํ๋ซํผ์ ๊ธฐ๋ณธ ๋ฌธ์ ์ธ์ฝ๋ฉ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ํ
์คํธ ํ์ผ์ ์ฝ๊ธฐ ์ํ ๋ฌธ์ ์คํธ๋ฆผ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค. ํ์ผ์์ ์ฝ๋๊ฒ์ --;
2.7. Chapter11 ๋ฌธ์ ์คํธ๋ฆผ ํํฐ ¶
- ๋ฐ์ดํธ ์คํธ๋ฆผ์์ ๊ธฐ๋ฅ์ ํ์ฅํ๊ธฐ์ํ ํํฐ๊ฐ ์์๋ฏ์ด ๋ฌธ์ ์คํธ๋ฆผ์๋ ํํฐ๊ฐ ์๋ค.
- FilterWriter : ๋ชจ๋ ๋ฌธ์ ์คํธ๋ฆผ ํํฐ์ ์คํผํด๋์ค๋ก ๋ค๋ฅธ Writer ๊ฐ์ฒด์ ์ฐ๊ฒฐ๋์ด์ ๋ชจ๋ ํธ์ถ ์ฐ๊ฒฐ๋ ์คํธ๋ฆผ์ผ๋ก ์ ๋ฌํ๋ค.
- FilterReader : ๋ชจ๋ Reader ๋ฌธ์ ์คํธ๋ฆผ ํํฐ์ ์ํผํด๋์ค๋ก, ๋ค๋ฅธ Reader๊ฐ์ฒด์ ์ฐ๊ฒฐํ์ฌ ๋ชจ๋ ๋ฉ์๋์ ํธ์ถ์ ์ฐ๊ฒฐ๋ ์คํธ๋ฆผ์ผ๋ก ์ ๋จํ๋ค.
- BufferedWriter : ์ฐ๊ฒฐ๋ ์คํธ๋ฆผ์ ์ถ๋ ฅ ๋ฒํผ๋ง ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ๋ชจ๋ ๋ฐ์ดํฐ๋ ๋ฒํผ๊ฐ ๊ฐ๋ ์ฐพ๊ฑฐ๋ flush() ๋ฉ์๋๊ฐ ํธ์ถ๋๊ฑฐ๋ close() ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋๊น์ง ๋ด๋ถ ๋ฒํผ์ ์ ์ฅ๋์๋ค๊ฐ ์ฌ๋ฌ ๋ฌธ์๋ฅผ ํ๊บผ๋ฒ์ ์ถ๋ ฅํ๋ write()๋ฉ์๋์ ํธ์ถ์ ํตํด ์ฐ๊ฒฐ๋ ์คํธ๋ฆผ์ผ๋ก ์ถ๋ ฅ๋๋ค.
- BufferdReader : ์ฐ๊ฒฐ๋ ์คํธ๋ฆผ์ ์
๋ ฅ ๋ฒํผ๋ง์ ์ ๊ณตํ๋ FilterReader์ด๋ค. ๋ฐ์ดํฐ๋ ์ปค๋ค๋ ๋ฉ์ด๋ฆฌ๋ก ํ๊บผ๋ฒ์ ์ฐ๊ฒฐ๋ ์คํธ๋ฆผ์์ ๋ด๋ถ ๋ฒํผ๋ก ์ฝํ์ง๋ฏ๋ก ์์ ํฌ๊ธฐ์ ๋ฐ์ดํฐ๋ ๋ด๋ถ ๋ฒํผ๋ก๋ถํฐ ํจ์จ์ ์ผ๋ก ์ฝํ ์ ์๋ค.
- LineNumberReader :์ฐ๊ฒฐ๋ ์คํธ๋ฆผ์ ํ
์คํธ๋ฅผ ๊ตฌ์ฑํ๋ ๊ฐ์ค์ ๋ฒํธ๋ฅผ ์นด์ดํ
ํ๋ ๊ธฐ๋ฅ์ ์ด๋ณด์ ์ผ๋ก ๋๋ง ์ ๊ณตํ๋ค. ์ดํด๋์ค๋ BufferedReader์ ์๋ธํด๋์ค์ด๋ฏ๋ก, ์ฐ๊ฒฐ๋ ์คํธ๋ฆผ์ผ๋ก์์ ๋ฒํผ๋ง์ ์๋์ผ๋ก ์ ๊ณตํ๋ค.
- PrintWriter : PrintStream์ ๋์ฒดํ๋ Writer ํด๋์ค๋ก ๋ฐ์ดํฐ๋ฅผ ํ
์คํธ ํ์์ผ๋ก ์ถ๋ ฅํ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
- PushbackReader : PushbackInputStream๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ,ํธ์๋ฐฑ ๋ฒํผ๋ฅผ ์ ๊ณตํ์ฌ ์ด๋ฏธ ์ฝ์ ๋ฌธ์์ ๋ณต๊ตฌ๊ธฐ๋ฅ์ ์ ๊ณตํด ์ฃผ๋ ํด๋์ค์ด๋ค.
2.8. Chapter12 ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ์ ๋ฌธ์ ์คํธ๋ฆผ ¶
- PipedWriter : ํ์ดํ ํด๋์ค๋ ์ค๋ ๋ ํต์ ์๋จ์ธ๋ฐ Writer๋๊น ๋ฌธ์๊ธฐ๋ฐ์ด๋ค. PipedReader์ ์ฐ๊ฒฐ๋์ ํ์ชฝ์์ ์ฐ๊ณ ๋ค๋ฅธ์ชฝ์์ ์ฝ๋๋ค.
- PipedReader
- CharArrayWriter : ์ดํด๋์ค๋ ๋ฐ์ดํธ์คํธ๋ฆผ์ ByteArrayOutputStream๊ณผ ๋์๋๋๊ฒ์ผ๋ก Char๋ฐฐ์ด๋ก ๋ฌธ์๋ฅผ ๋ด๋ณด๋ผ์์๋ค.
- CharArrayReader
- StringWriter : ์ ๋ฐ์ ์ผ๋ก CharArrayWriter ํด๋์ค์ ๋น์ทํ๋ค.
- StringReader
2.9. Chapter13 ํ์์ ! ๊ฐ์ฒด ์คํธ๋ฆผ ¶
- ์ด๋ฒ์ฅ์์ Object๋ฅผ ํต์ ์ฑ๋๋ก ์ ์กํ ์์๋ ๊ฐ์ฒด ์คํธ๋ฆผ์ ๋ํด ๋ฐฐ์ฐ๊ณ ์๋ค --;
- ObjectOutputStream,ObjectInputStream์ ๋ํด ์์ธํ ๋ฐฐ์ฐ๋๋ฐ ๊ฐ๋
์ด ์ข ๋ง์ ์์จ๋ค.
- ๋์ ์์ ๋ฅผ ๋ณด๊ณ ์กฐ๊ธ ์ดํด๊ฐ ๊ฐ๊ธดํ๋๋ฐ ๋ค์์ฅ๋ถํฐ ๋ณธ๊ฒฉ์ ์ธ ๋คํธ์์ผ๋ก์จ ์ดํด๋ฅผ ํ๊ฒ ๋ค --;
- ๊ฐ์ฒด ์คํธ๋ฆผ์ ์๋ธํด๋์ค ๊ตฌํ : ์ง๋ ฌํ ๋ ์ ์๊ณ , ๊ทธ์ธ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก๋ ์ง๋ ฌํ์ํค๊ธฐ ์ด๋ ค์ด ํด๋์ค์ ์ ์ก์ ์ ๊ณตํ๊ธฐ ์ํด ๊ฐ์ฒด ์คํธ๋ฆผ์ ์๋ธํด๋์ค๋ฅผ ๊ตฌํํด์ผํจ
~cpp interface MyOSContants { final short myOSMagick = (short)0x1359; final short myOSVersion = (short)0x0010; } import java.io.*; import java.net.*; public class MyDatagramPacket implements Serializable { //์ดํด๋์ค๋ ์ง๋ ฌํ๋ฅผ ํ ์์๋ค. private byte[] data; //์ง๋ ฌํ๋ฅผ ํ ์์๋ DatagramPacket์ ๊น์ธ์ ์ง๋ ฌํ๋ฅผ ํ ์์๊ฒํ๋ค. private int offset,length,port; private InetAddress address; MyDatagramPacket(DatagramPacket packet) { //DatagramPacket์ผ๋ก๋ถํฐ ์ ๋ณด๋ฅผ ๋ ๊ฒจ๋ฐ๋๋ค. data = packet.getData(); offset = packet.getOffset(); address = packet.getAddress(); port = packet.getPort(); } DatagramPacket toDatagramPacket(){ //DatagramPacket์ ๋๊ฒจ์ค๋ค. return new DatagramPacket(data,offset,length,address,port); } } import java.io.*; public class MyFile extends File{//์ดํด๋์ค ์์ฒด๋ก ์ง๋ ฌํํ ์์์ง๋ง ์์ ๋ค --; private String originalPath; //์ค๋ฆฌ์ง๋ ํจ์ค public MyFile(File file) { //ํ์ผ์ ๋ฐ๊ณ super(file.getAbsolutePath()); //์ ๋๊ฒฝ๋ก๋ฅผ ๋๊ฒจ์ค๋ค/ originalPath = file.getPath(); //์ค๋ฆฌ์ง๋ ํจ์ค๋ฅผ ๋ฐ๋๋ค. } public String getOriginalPath(){ return originalPath; } } import java.io.*; import java.net.*; public class MyAltDatagramPacket extends MyDatagramPacket { public MyAltDatagramPacket(DatagramPacket packet) { super(packet); } private Object readResolve(){ return toDatagramPacket(); } } import java.io.*; import java.net.*; public class MyObjectOutputStream extends ObjectOutputStream implements MyOSContants{ public MyObjectOutputStream(OutputStream out)throws IOException { super(out); enableReplaceObject(true); //์ด๋ฉ์๋๋ฅผ ํธ์ถํด์ผ๋ง replaceObject๋ฅผ ํธ์ถํ ์์์ ๋ณด์๋ฌธ์ } protected void writeStreamHeader() throws IOException{ super.writeStreamHeader(); //์ํผํด๋์ค์ ํค๋๋ฅผ ์ถ๋ ฅํํ์ writeShort(myOSMagick); //์คํธ๋ฆผ์ ๋ฉ์ง๋๋ฒ์ธ myOSMagick๊ณผ writeShort(myOSVersion); //๋ฒ์ ๋ฒํธ์ธ myOSVersion์ ์ถ๋ ฅํ๋ค. } protected Object replaceObject(Object object) throws IOException{ if(object.getClass() == DatagramPacket.class) return new MyDatagramPacket((DatagramPacket)object); else if(object.getClass().getName().equals("java.io.File")) return new MyFile((File)object); else return object; } } import java.io.*; import java.net.*; public class MyObjectInputStream extends ObjectInputStream implements MyOSContants { public MyObjectInputStream(InputStream in)throws IOException { super(in); enableResolveObject(true); //resolveObject()ํธ์ถ ๊ฐ๋ฅํ๊ฒํ๋ค. } protected void readStreamHeader() throws IOException{ //์คํธ๋ฆผ์ ์ฝ๋๋ค. super.readStreamHeader(); if(readShort() !=myOSMagick) //๊ณ ์ ๋ฒํธ๊ฐ ํ๋ฆฌ๋ฉด throw new StreamCorruptedException("Incompatible myOSMagick number"); if(readShort() > myOSVersion) //๋ฒ์ ์ด ๋์ผ๋ฉด throw new StreamCorruptedException("Incompatible myOSVersion number"); } protected Object resolveObject(Object object) throws IOException{ if(object instanceof MyDatagramPacket) return ((MyDatagramPacket)object).toDatagramPacket(); else return object; } }
- PART2๋ฅผ ๋ง์น๋ฉฐ : ๊ทธ๋์ ์๋ฐ์ฑ
์ ๋ณด๋ฉด์ ํ๋ฒ๋ ๊น์ด ์ ํด๋ณด์ง๋ชปํ ์คํธ๋ฆผ์๊ดํด ๋ฐฐ์ ๋ค. ์ฌ๋ฐ์๋ค ^^;;
3. PART3 ๋คํธ์ํน ¶
- 14์ฅ : ํด๋ผ์ด์ธํธ ๋คํธ์ํน
- 15์ฅ : ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋๋ฐ ์ค์ ์์
- 16์ฅ : ์๋ฒ ๋คํธ์ํน
- 17์ฅ : ์น ์๋ฒ ํ๋ก๊ทธ๋๋ฐ
- 18์ฅ : ์๋ฒฝ ๊ตฌํ! ํด๋ผ์ด์ธํธ/์๋ฒ ์ธํฐ๋ท ์ ํ๋ฆฌ์ผ์ด์
- 19์ฅ : URL ํด๋์ค์ ํ์ฉ
- 20์ฅ : ๋ฐ์ดํฐ๊ทธ๋จ ๋คํธ์ํน
- 21์ฅ : ๋ฐ์ดํฐ๊ทธ๋จ ์ ํ๋ฆฌ์ผ์ด์
์ค์ ์์
- 22์ฅ : ๋ฉํฐ์บ์คํธ ๋คํธ์ํน
4. ์ก๋ด ¶
์ํ core java ๋ค๋ณผ๋ ๊น์ง ๊ธฐ๋๋ ค๋ผ. ๋ค์์ฃผ๊น์ง ๋ค ๋ด์ฃผ๋ง.. ์ผ์ผ์ผ.. + ๊ทธ๋ฆฌ๊ณ , Java Network ๋๊ฐ ์ธ๋ฏธ๋ ํด์ค.. ์๋ 1๋1 ๊ฐ์..?? ์บฌ์บฌ
๊ด์ ์ ๋จน๊ณ ์ฐ๋ ค๋๊น ์์์จ์ง๋ค --;
๊ด์ ์คํธ๋ฆผ ๋ถ๋ถ์ ๊ทธ๊ธฐ๊ฐ์ ๋ ๋์๋ค. ๋ฐ๋ฆฌ๋ ์ฐ๊ธฐ ํ๋ค๋ค. --; ์๋กญ๊ฒ ๋คํธ์๋ถํฐ ..
๊ด์ ์ ๋จน๊ณ ์ฐ๋ ค๋๊น ์์์จ์ง๋ค --;
๊ด์ ์คํธ๋ฆผ ๋ถ๋ถ์ ๊ทธ๊ธฐ๊ฐ์ ๋ ๋์๋ค. ๋ฐ๋ฆฌ๋ ์ฐ๊ธฐ ํ๋ค๋ค. --; ์๋กญ๊ฒ ๋คํธ์๋ถํฐ ..