java2019. 9. 22. 00:04

텍스트 기반의 파일을 다룰 경우, FileWriterBufferedWriter를 활용한다.

FileWriter 만 사용해도 되지만 그럴 경우, buffer를 사용하지 않으므로 비효율적 따라서 BufferedWriter를 사용한다.

종료시 close는 반드시 호출할 수 있도록 하며, try ~ finally 구문에 넣어주는 것이 좋다.

왜냐하면 예외 발생시, close()를 호출하지 않고 종료될 수 있기 때문.

 

자세한 내용은 예제를 통해 참조

public class StreamTest {
	
	
	
	public StreamTest() {
		super();
		this.test();
	}

	private void test() {
		String fullPath = "C:"+File.separator+"Users"+File.separator+"Lee"+File.separator+"test"+File.separator+"numbers.txt";
		writeFile(fullPath,10);
		
	}

	private void writeFile(String fullPath, int i) {
		FileWriter fileWriter=null;
		BufferedWriter bufferedWriter=null;
		
		try {
			//fileWriter= new FileWriter(fullPath); //write mode.
			fileWriter= new FileWriter(fullPath, true);//append mode
			bufferedWriter = new BufferedWriter(fileWriter);
			
			for ( int loop=0; loop < i ; loop ++) {
				bufferedWriter.write(Integer.toString(loop));
				bufferedWriter.newLine();
			}
		
			System.out.println("Write done!");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			
		} finally {
			
			if( bufferedWriter!=null) {
				try {
					bufferedWriter.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			} 
			
			if (fileWriter != null) {
				
				try {
					fileWriter.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		
		
		
		
	}
	


출처 : 자바의 신

Posted by easy16
java2019. 9. 21. 23:33

 

 

1, 해당 interface를 구현하고, accept를 override하면 File 객체의 listFiles 메소드를 호출할 때 Filter로 사용가능.
2, 경로 지정시, separator 사용하는 부분은 기억.
String pathName = "C:"+ File.separator+"Users"+File.separator +"Lee" + File.separator + "test";

 

ex)

package com.test.testapplication.file;

import java.io.File;

public class FileFilterSample {

	public FileFilterSample() {
		super();
		String pathName = "C:"+ File.separator+"Users"+File.separator +"Lee" + File.separator + "test";
		//System.out.println(pathName);
		this.sampleTest(pathName);
	}
	
	public void sampleTest(String pathName) {
		File file; 
		
		try {
			file = new File(pathName);
			//File [] mainFileList = file.listFiles();
			//File [] mainFileList = file.listFiles( new PNGFileNameFilter());
			File [] mainFileList = file.listFiles( new PNGFileFilter());
			
			for (File tempFile : mainFileList) {
				System.out.println(tempFile.getName());
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	} 
	
}


package com.test.testapplication.file;

import java.io.File;
import java.io.FileFilter;

public class PNGFileFilter implements FileFilter {
	
	@Override
	public boolean accept(File file) {
	
		if (file.isFile()) {
			String fileName = file.getName();
			if ( fileName.endsWith(".png")) 
				return true;
			 else 
				return false;
		}
		return false;
		
	}

}

package com.test.testapplication.file;

import java.io.File;
import java.io.FilenameFilter;

public class PNGFileNameFilter implements FilenameFilter {
	
	
	@Override
	public boolean accept(File dir, String fileName) {
		 
		
		
		if ( fileName.endsWith(".png"))
			return true;
		
		
		
		return false;
	}

}

'java' 카테고리의 다른 글

FileReader 및 BufferedReader + (Scanner)  (0) 2019.09.22
FileWriter 및 BufferedWriter 텍스트기반 처리  (0) 2019.09.22
Thread interrupt 및 getState 예제  (0) 2019.09.21
synchronized 정리  (0) 2019.09.21
Thread Priority 와 Daemon Thread  (0) 2019.09.17
Posted by easy16
java2019. 9. 21. 15:04

ex)


package com.test.testapplication;




public class TestApplication {
	
	
	public static void main(String [] args) {
			
		TestApplication test = new TestApplication();
		test.doTest();
	}
	
	
	private int count;
	StringBuffer sBuffer = new StringBuffer();
	StringBuilder sBuilder = new StringBuilder();
	
	
	private   void doTest() {

		count=0;
		
		
		ThreadSample t1= new ThreadSample("t1");
		ThreadSample t2= new ThreadSample("t2");
	
		
		System.out.println("t1 : state :" + t1.getState());
		t1.start();
		
		System.out.println("t1 : state :" + t1.getState());
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e1) {
			e1.printStackTrace();
		}
		
		System.out.println("t1 : state :" + t1.getState());
		
		
		try {			
			
			t1.join();
			
		}catch(InterruptedException e ) {
			e.printStackTrace();
		}
		t1.interrupt();
		
		System.out.println("t1 : state :" + t1.getState());
		
		
	}
	
	
	/*참조해야할 변수가 여러개일 경우 , 서로 다른 lock을 사용한다.*/
	private Object builderLock = new Object();
		
	class ThreadSample extends Thread{
		
		
		public ThreadSample(String name) {
			super(name);
			
		}
		@Override
		public void run() {
			
			
			
			int loop = 0;
			while( loop < 10) {
				++loop;
				synchronized(builderLock) {
					//System.out.println( this.getName() + " run!"  + " count :  "+(count++));
					try {
						Thread.sleep(5000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			
			}
	
		}
	}

}

 

출처 : 자바의 신

'java' 카테고리의 다른 글

FileWriter 및 BufferedWriter 텍스트기반 처리  (0) 2019.09.22
FileFilter , FileNameFilter interface  (0) 2019.09.21
synchronized 정리  (0) 2019.09.21
Thread Priority 와 Daemon Thread  (0) 2019.09.17
Runnable interface와 Thread class  (0) 2019.09.17
Posted by easy16
java2019. 9. 21. 14:47

Syncronized 목적 :

 

Thread Safe 언제 문제가 발생하는가?

-> 여러 쓰레드가 한 객체에 선언된 변수에 접근하는 경우

-> 단 메소드에서 인스턴스 변수를 "수정"하려 하는 때만 발생. 어떻게 

-> 메소드 자체를 syncronized로 선언 (syncronized method)

-> 특정 문장만 선언(syncronized statements) sycrhonized 블록을 사용

-> 참조해야할 변수가 여러 개 인 경우, 각 참조할 객체마다 다른 Syncronized block을 만들어 준다.

 

(예제 참조)

ex)


package com.test.testapplication;




public class TestApplication {
	
	
	public static void main(String [] args) {
			
		TestApplication test = new TestApplication();
		test.doTest();
	}
	
	
	
	//각 쓰레드에서 참조할 변수
	public int count ;
	public int timeCount ;
	
	private   void doTest() {

		count=0;
		
		ThreadSample t1= new ThreadSample("t1");
		ThreadSample t2= new ThreadSample("t2");
	
		t1.start();
		t2.start();
		
		
		/*
		 * try { Thread.sleep(10000); } catch (InterruptedException e) {
		 * 
		 * System.out.println( e.toString() ); e.printStackTrace(); }
		 */
		//tip : thread 종료를 기다리도록 join method 사용
		try {
			t1.join();
			t2.join();
		}catch(InterruptedException e ) {
			e.printStackTrace();
		}
		
		System.out.println("final count : " + count);
		System.out.println("final timecount : " + timeCount);
		
	}
	
	
	/*참조해야할 변수가 여러개일 경우 , 서로 다른 lock을 사용한다.*/
	private Object lock = new Object();
	private Object timeCountLock = new Object();
	
	class ThreadSample extends Thread{
		
		
		public ThreadSample(String name) {
			super(name);
			
		}
		@Override
		public void run() {
			
			
			
			int loop = 0;
			while( loop < 10) {
				++loop;
				synchronized(lock) {
					System.out.println( this.getName() + " run!"  + " count :  "+(count++));
				}
				synchronized(timeCountLock) {
					System.out.println( this.getName() + " run!"  + " timeCount :  "+(timeCount++));
				}
				
				try {
					Thread.sleep(200);
				} catch (InterruptedException e) {
				
					System.out.println( e.toString() );
					e.printStackTrace();
				}
			}
			
		}
		/*
		 * @Override public void run() { synchronizedRun(); }
		 */
		
		
	}
	
	// 각 쓰레드에서 공통으로 참조하는 method에 synchronized 선언을 해준다. 
	public  synchronized void synchronizedRun() {
		
		int loop = 0;
		while( loop < 10) {
			++loop;
			System.out.println( getClass().getSimpleName() + " run!"  + " count :  "+(count++));
		
			try {
				Thread.sleep(200);
			} catch (InterruptedException e) {
			
				System.out.println( e.toString() );
				e.printStackTrace();
			}
		}
	}
}


'java' 카테고리의 다른 글

FileFilter , FileNameFilter interface  (0) 2019.09.21
Thread interrupt 및 getState 예제  (0) 2019.09.21
Thread Priority 와 Daemon Thread  (0) 2019.09.17
Runnable interface와 Thread class  (0) 2019.09.17
Simple HashSet 및 Iterator 사용 예제  (0) 2019.09.16
Posted by easy16
java2019. 9. 17. 23:01

- Priority 
* Java에선 우선순위 숫자가 클 수록 우선순위가 높다.


MAX_PRIORITY               10
NORM_PRIORITY (default) 5
MIN_PRIORITY                1


- Daemon thread
Thread 객체의 setDaemon(true) 메소드를 호출하므로써 지정.
해당 Thread 종료 유무 관계 없이, 나머지 스레드들이 종료되어 해당 프로세스가 종료 될 수 있다.

(일예로 모니터링 쓰레드에 사용-> 모니터링 쓰레드 때문에 프로그램이 종료 안되는 경우가 없어야 함.).

 

출처 : 자바의 신

 

'java' 카테고리의 다른 글

Thread interrupt 및 getState 예제  (0) 2019.09.21
synchronized 정리  (0) 2019.09.21
Runnable interface와 Thread class  (0) 2019.09.17
Simple HashSet 및 Iterator 사용 예제  (0) 2019.09.16
Generic  (0) 2019.09.16
Posted by easy16
java2019. 9. 17. 22:23

Runnable vs Thread


아래와 같이 하나도 특별할 것 없이, Runnable은 Thread 객체에 전달하여 start를 호출,
Thread를 확장한 클래스는 자체적으로 start를 호출하면 된다.

보통의 경우 Thread를 확장하여 사용하는 것이 편리하다.
그러나 이미 다른 클래스를 확장한 클래스의 경우,자바의 특성 상 다중 상속이 불가능하므로 Runnable 인터페이스를 구현하여 이용하면 되겠다.

public class TestApplication {
	
	
	public static void main(String [] args) {
			
		TestApplication test = new TestApplication();
				
		test.doTest();
	}
	
	
	private void doTest() {

		RunnableSample r = new RunnableSample();
		new Thread(r).start();
		
		RunnableSample2 r2 = new RunnableSample2();
		r2.start();
			

	}
	
	

	class RunnableSample implements Runnable{
		
		
		@Override
		public void run() {
			// TODO Auto-generated method stub
		
			System.out.println( getClass().getSimpleName() + " run!" );
		}
	}
	
	class RunnableSample2 extends Thread{
		
		
		@Override
		public void run() {
			// TODO Auto-generated method stub
		
			System.out.println( getClass().getSimpleName() + " run!" );
		}
	}

}


 

출처 : 자바의 신

'java' 카테고리의 다른 글

synchronized 정리  (0) 2019.09.21
Thread Priority 와 Daemon Thread  (0) 2019.09.17
Simple HashSet 및 Iterator 사용 예제  (0) 2019.09.16
Generic  (0) 2019.09.16
System class 의 기본 기능 활용  (0) 2019.09.16
Posted by easy16
java2019. 9. 16. 22:57

Arrary to HashSet : 중복 제거

HashSet to ArrayList : 일일이 삽입할 필요없이 아래의 생성자를 이용하면 쉽게 다른 콜렉션 생성 가능.

 

public ArrayList(Collection<? extends E> c

 

Iterator 인스턴스에서 next() 메소드 사용 시, 값을 하나 뱉고 다음 멤버를 가리킨다.

 

String [] str = {"a", "b", "c", "a"};
	HashSet hs = new HashSet<>();
	for ( String s  :str ) {
		hs.add(s);
	}
	
	System.out.println(hs);
	
	ArrayList ar = new ArrayList<>(hs);
	
	Iterator i = ar.iterator();
	
	while(i.hasNext() ) {
		System.out.println( i.next());
	}

 

결과 : 

[a, b, c]
a
b
c
[a, b, c]

 

출처 : 자바의 신

'java' 카테고리의 다른 글

Thread Priority 와 Daemon Thread  (0) 2019.09.17
Runnable interface와 Thread class  (0) 2019.09.17
Generic  (0) 2019.09.16
System class 의 기본 기능 활용  (0) 2019.09.16
Deprecated, SuppressWarnings 예시  (0) 2019.09.15
Posted by easy16
java2019. 9. 16. 17:39

목적:

1, 명시적으로 타입을 지정하여 형변환을 사용하지 않음

2, 런타임이 아닌 컴파일 타임에 오류를 찾아낼 수 있다.

 

 

3, 매개변수로 Generic class를 넘겨줄 경우, ?( wildcard ) 타입을 사용한다.

   넘어온 객체의 경우, 어떤 클래스의 인스턴스인지를 판별하기 위해 instanceof 예약어를 사용.

 

4, <? extends Object > : Object 클래스를 상속한 녀석만 허용 ( 넘어오는 Type을 제한할 수 있다.)

   Bounded Wildcard라고 불린다. 해당 녀석도 값을 할당하는 것은 불가능하므로 조회용으로 사용.

 

 

 

	
	private void doTest() {
		
		CastingGenericDTO d1 = new CastingGenericDTO();
		CastingGenericDTO d2 = new CastingGenericDTO();
		CastingGenericDTO<?> d3 = new CastingGenericDTO();
		
		
		d1.setObject(String.valueOf(123));		
		d2.setObject(new StringBuilder().append("sb"));
		
		d3.setObject(String.valueOf(456));//wildcard 사용하는 경우 값을 할당하는 것이 불가능.
		//The method setObject(capture#1-of ?) in the type CastingGenericDTO<capture#1-of ?> is not applicable for the arguments (String)
		//printDTO(d1);
		printAllDTO(d1);
		printAllDTO(d2);
		
		
	}
	
	
	
	void printDTO(CastingGenericDTO d) {//인자로 전달시, CastingGenericDTO 객체만 넘겨받을 수 있다.
		System.out.println(d.getObject());
	}
	
	void printAllDTO(CastingGenericDTO<?> d) {  //해결책  '?' 사용 -> wildcard 타입
		
		if ( d.getObject() instanceof StringBuilder )
			System.out.println("StringBuilder : "+ d.getObject());
		else if ( d.getObject() instanceof String ) {
			System.out.println("String : "+ d.getObject());
			
		}
	}
    

 

5, Wildcard/ Bounded Wildcard 모두 매개변수로 넘어온 객체에 대해 값을 할당할 수 없다는 단점.

6, 메소드를 아래와 같이 정의하면 매개변수로 넘어온 객체에 값을 할당 가능하다.

 

 

public /<T/> void setDataDTO(CastingGenericDTO c, T addValue) {

c.setObject(addValue);

}
public /<T/>  void setDataDTO2(CastingGenericDTO c, T addValue) {

c.setObject(addValue);
}

public <S, T extends Object > void setDataDTO3(CastingGenericDTO c, T addValue, S another) {

c.setObject(addValue);
}

 

출처 : 자바의 신

'java' 카테고리의 다른 글

Runnable interface와 Thread class  (0) 2019.09.17
Simple HashSet 및 Iterator 사용 예제  (0) 2019.09.16
System class 의 기본 기능 활용  (0) 2019.09.16
Deprecated, SuppressWarnings 예시  (0) 2019.09.15
Nested class의 개념  (0) 2019.09.15
Posted by easy16
java2019. 9. 16. 16:49



Gabage Collector 관련 메소드
System.gc(); // gc의 명시적 실행
System.runFinalization(); //시스템이 하던 일을 멈추고, gc 대기중인 모든 객체에 대해 finalize 메소드 실행

JVM 종료
Systme.exit(0); // 0은 정상 종료를 의미


현재 시간을 얻을 때는 System.currentTimeMillis()
시간 측정을 위해서는 System.nanoTime()를 사용한다.




객체에 대한 toString을 직접 호출하는 것보다 String.valueOf 메소드를 활용하는 것이 좋다.
객체에 대한 null 예외처리를 해주기 때문에 훨씬 안전하다.

private void doTest() {
	
	
	long startTime = System.currentTimeMillis();
	long startNanoTime = System.nanoTime();
	
	
	
	try {
		Thread.sleep(1000);
	} catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	
	Object obj=null;
	//System.out.println(obj.toString());//exception!
	System.out.println(String.valueOf(obj));//print null
	System.out.println("time : " + String.valueOf(System.currentTimeMillis() - startTime));
	System.out.println("n time : " + ((System.nanoTime() - startNanoTime)/1000000));
	
	
	
	
	System.out.format("%d %s\n", 10, "10");//format과 printf의 사용방법 및 출력결과는 동일하다. 참조 : String.format()
	System.out.printf("%d %s\n", 11, "11");
	
}


 

 

출처 : 자바의 신

'java' 카테고리의 다른 글

Simple HashSet 및 Iterator 사용 예제  (0) 2019.09.16
Generic  (0) 2019.09.16
Deprecated, SuppressWarnings 예시  (0) 2019.09.15
Nested class의 개념  (0) 2019.09.15
StringBuilder, StringBuffer, CharSequence 용도  (0) 2019.09.15
Posted by easy16
java2019. 9. 15. 22:12


public class A {
	
	@Deprecated
	public void print() {
		
	}
	
}


class B extends A{
	
	@SuppressWarnings("deprecation")
	B(){
		super();
	}
	private void foo() {
		
		print();
	}
	
}



'java' 카테고리의 다른 글

Generic  (0) 2019.09.16
System class 의 기본 기능 활용  (0) 2019.09.16
Nested class의 개념  (0) 2019.09.15
StringBuilder, StringBuffer, CharSequence 용도  (0) 2019.09.15
throws 명령어와 예외 처리 방법 두가지  (0) 2019.09.15
Posted by easy16