레이블이 JAVA인 게시물을 표시합니다. 모든 게시물 표시
레이블이 JAVA인 게시물을 표시합니다. 모든 게시물 표시

네이버와 다음의 호스트 이름과 IP 주소를 알아보자 (자바 InetAddress 클래스를 활용)

안녕하세요

이번 시간에는 자바 네트워크 부분에 대해 글을 쓸까 합니다.

오늘 글 쓰는거는 자바 네트워크와 관련된거로 보시면 됩니다.


그리고 쉬는 날에 다시 자바 jdbc를 좀 더 다룰까 합니다.


어쨋든 잘 봐주십쇼~!

이론적인 부분은 제가 한번 올리고

오늘 올리는 것들은 자바 네트워크 예제와 주석입니다


========================================================


import java.net.*;

public class test {

public static void main(String[] args) {
/* InetAddress 클래스
* -IP를 추상화한 클래스
* -new에서 생성하는 것이 아니라 static 메소드로 얻는다.*/

try{
InetAddress inet=InetAddress.getByName("www.naver.com");
System.out.println("호스트 이름 : "+inet.getHostName());
System.out.println("호스트 IP 주소 : "+inet.getHostAddress());
/* IP주소 : 컴퓨터(호스트)를 구별하는 데 사용되는 고유한 주소값
* 4바이트 정수로 a.b.c.d와 같은 형식으로 표현하며
* (a,b,c,d는 0~255의 정수값)
* */

// 이 호스트 네임을 사용하고 있는 주소들을 배열로 저장하자
InetAddress[] inets=InetAddress.getAllByName("www.daum.net");
if(inets!=null){
for(InetAddress ia:inets){
System.out.println("호스트 명 : "+ia.getHostName());
System.out.println("IP 주소 : "+ia.getHostAddress());
}
}

}catch(UnknownHostException e){ // 이 부분을 명시하지 않으면 에러 발생
e.printStackTrace();
}

}
}

========================================================


실행 결과



네이버와 다음의 IP 주소는 위와 같이 나오네요

네이버는 공통적으로 나오는 것 같은데..

다음은 컴퓨터마다 다르게 나온것 같았습니다..

나중에 한번 그 이유를 알아보겠습니다




자바 Update문을 활용하여 db의 데이터 수정하기

안녕하세요

이번 시간에는 자바에서 Update문을 활용하여

SQL Develop문의 db 데이터를 수정하는 예제를 올려봅니다.

이번 예제도 앞선 예제와 크게 다른 바가 sql문만 차이가 있습니다.

자 그럼 예제를 보시죠


==========================================================

public class Test {

public static void main(String[] args) throws Exception {

//Memo 테이블의 내용을 수정하자 (작성자, 메모내용, 작성일)
Scanner sc = new Scanner(System.in);
System.out.println("수정할 글번호 입력=>"); // PK = WHERE 조건절
int idx = sc.nextInt();
System.out.println("수정할 작성자 입력=>");
String name = sc.next();
sc.skip("\r\n"); // 엔터값 건너뛰기
System.out.println("수정할 메모내용 입력=>");
String msg = sc.nextLine();
System.out.println(idx+"/"+name+"/"+msg);

FileReader fr = new FileReader("DB.properties");
Properties p = new Properties();
p.load(fr);

// 드라이버 로드
Class.forName(p.getProperty("driver"));
String url = p.getProperty("dburl");
String user = p.getProperty("user");
String pwd = p.getProperty("pwd");

Connection con = DriverManager.getConnection(url, user, pwd);
System.out.println("DB연결 성공");

//STMT 얻기
Statement stmt = con.createStatement();

//SQL문 작성 => UPDATE문
//String sql = "UPDATE MEMO SET NAME='"+name+"'" + ", MSG='"+msg+"'" + " where idx='"+idx+"'";
String sql = "UPDATE MEMO SET NAME='"+name+"',";
sql+=" msg='"+msg+"', wdate=SYSDATE WHERE idx="+idx;
System.out.println(sql);

//실행-> dml문 int executeUpdate()
int cnt = stmt.executeUpdate(sql);

String str=(cnt>0)?"수정 성공":"수정 실패-글 번호가 없어요";
System.out.println(str);

//DB연결 종료
stmt.close();
con.close();
sc.close();

}

}

==========================================================


-실행 결과-



SQL Developer에서 memo 테이블을 조회한 화면입니다.

데이터가 참 많죠.



저는 여기서 idx가 15번인 행의 데이터를 변경해보겠습니다.

작성자를 '박근혜' 로 수정할 메모내용 입력을 '대통령'으로 바꾸겠습니다.

위의 그림을 보면 성공적으로 변경 됬다는 것을 알 수 있습니다.




자 그럼 sql developer에 가서 다시 한번 확인해 봅시다

select * from memo를 한 결과 맨 첫번째 15번째 idx 번호의 데이터가

변경 됬다는 것을 알 수 있습니다.



자바 jdbc를 활용하여 해당 부서의 사원 정보를 출력하는 프로그램을 작성하세요

안녕하세요

이번 시간에는 자바 jdbc와 오라클을 활용하여

해당 부서의 사번, 사원명, 부서명, 업무, 급여, 근무지의 사원 정보를 출력하는 자바 프로그램 예제를 올려보겠습니다.

여기서 잠깐..

지금 같은 예제는 소스를 복사해서 붙여넣는다고 하여 실행되는것이 아니라

오라클 (sql developer)에 'EMP' 테이블과 'DEPT' 테이블이 있어야 가능합니다.

EMP, DEPT 테이블은 직접 만들어보셔서 테스트 해보시면 됩니다

테이블 만드는건 어렵지 않죠~


자 그럼 예제와 실행 결과 화면을 올려보겠습니다

렛츠고~!!

========================================================


public class test {

public static void main(String[] args) throws Exception {

String deptno = JOptionPane.showInputDialog("검색하고자 하는 부서번호를 입력하세요");
// 해당 부서의 사원 정보를 출력하는 프로그램을 작성하세요
// 사번, 사원명, 부서명, 업무, 급여, 근무지 - select (emp,dept와 조인)

//1. 드라이버 로딩
Class.forName("oracle:jdbc:driver:OracleDriver");

//2. DB연결
String url="jdbc:oracle:thin:@localhost:1521:ORCL";
String user="scott", pwd="tiger";
Connection con=DriverManager.getConnection(url, user, pwd);
System.out.println("DB에 연결");

//3. Statement 얻기
Statement stmt = con.createStatement();

//4. sql문 작성(select문, join문)
String sql = "SELECT e.deptno, empno, ename, dname, job, sal, loc "
+" FROM EMP E JOIN DEPT D"
+" ON E.DEPTNO=D.DEPTNO"
+" WHERE E.DEPTNO= "+deptno;
System.out.println(sql);

//5. 실행-executeXXXX()
ResultSet rs = stmt.executeQuery(sql);
System.out.println("-----------------------------------------------------------------------");
System.out.println("dno"+"\t"+"empno"+"\t"+"ename"+"\t"+"dname"+"\t"+"job"+"\t"+"sal"+"\t"+"loc");

//6. 실행 결과 데이터 가져와 출력하기
while(rs.next()){
int dno=rs.getInt(1);
int empno=rs.getInt(2);
String ename=rs.getString(3);
String dname=rs.getString(4);
String job=rs.getString(5);
float sal=rs.getFloat(6);
String loc=rs.getString(7);
System.out.println(dno+"\t"+empno+"\t"+ename+"\t"+dname+"\t"+job+"\t"+sal+"\t"+loc);
}

System.out.println("-----------------------------------------------------------------------");

//7. close
rs.close();
stmt.close();
con.close();
}
}

========================================================

위의 소스 코드를 실행하면 아래와 같은 화면이 자바 콘솔창에 출력됩니다


부서번호를 입력하라는 콘솔창이 뜨면 10,20,30번 부서 중에

30번 부서번호를 입력하게 되면




30번 부서의 정보가 출력되면서 프로그램은 끝이 나게 됩니다


자바 jdbc에서 데이터를 Insert 해보자

안녕하세요

이번 시간에는 자바 JDBC에서 데이터를 INSERT 하는 예제를 만들어

오라클 환경에 있는 데이터베이스의 memo 테이블에 데이터를 삽입하는 예제를

올려봅니다.


이 예제도 select문과 비슷한 로직이지만 메소드에 조금 차이가 있으니

신경 써서 보십쇼~!


========================================================

public class test {

public static void main(String[] args) throws Exception {

// 메모 테이블에 메모 내용을 등록해보자.
String name = JOptionPane.showInputDialog("작성자를 입력하세요");
String msg = JOptionPane.showInputDialog("메모 내용을 입력하세요");

//1. 드라이버 로딩
Class.forName("oracle:jdbc.driver.OracleDriver");
System.out.println("드라이버 로딩 성공");

//2. DB연결=> Connection 얻기 (DriverManager통해서)
String url = "jdbc:oracle:thin:@localhost:1521:ORCL";
String user="scott", pwd="tiger";
Connection con = DriverManager.getConnection(url,user,pwd);
System.out.println("DB에 연결");

//3. Statement 얻기 => Connection 통해서
Statement stmt = con.createStatement();

//4. SQL문 작성 => INSERT문 작성
String sql = "INSERT INTO MEMO(idx, name, msg, wdate)";
  sql += " VALUES(5, " + "'"+name+"', '"+msg+"',sysdate)";
System.out.println(sql);

//5. executeUpdate()메소드로 전송
int cnt=stmt.executeUpdate(sql);
System.out.println(cnt>0?"등록 성공":"등록 실패");

//6. DB 자원 반납
stmt.close(); con.close();
}
}

========================================================

위의 예제를 실행하면 아래와 같은 결과를 얻게 됩니다



select * from memo;

를 해서 나온 결과입니다.

현재 4개의 데이터만 있습니다.





작성자에 네이버를, 메모 내용에 포털사이트 라고 입력하면

memo 테이블에 name, msg 필드에 데이터를 추가하게 됩니다



자바 콘솔창에서는 위와 같은 출력문이 나오게 되고

sql developer 에서 select문으로 memo 테이블을 조회하게 되면



맨 마지막 필드에 네이버, 포털사이트 가 추가된것을 알 수 있습니다.





자바 JDBC로 데이터를 조회하는 Select문 활용

안녕하세요

이번 시간에는 테이블의 데이터를 조회 할 수 있는 데이터베이스의 Select문을

자바에 접목하여 자바에서도 오라클에 있는 db 정보를 조회 할 수 있는 예제를 올려봅니다.

잘 봐주세요~!!


=========================================================

public class test {

public static void main(String[] args) throws Exception {

//1. 드라이버 로딩 - odjbc7.jar
//=> Class.forName("패기지경로.드라이버명")메소드를 이용
// 자바와 오라클의 통역관(OracleDriver)
Class.forName("oracle:jdbc:driver:OracleDriver");
String url="jdbc:oracle:thin:@localhost:1521:ORCL";
//프로토콜:oracle:드라이버타입:@호스트:포트번호:SID
//url은 DBMS사마다 다르다.
String user="scott", pwd="tiger";
//2. DB와 연결: DriverManager.getConnection()
Connection con = DriverManager.getConnection(url,user,pwd);
System.out.println("DB연결됨");

//3. DB에 SQL문을 전송하기 위해 Statement 객체를 얻어온다.
Statement stmt = con.createStatement();

//4. SQL문 작성
String sql = "SELECT idx, name, msg, wdate FROM memo ORDER BY 1";
//DML 문장(INSERT, DELETE, UDPATE) => int executeUpdate(sql) / 반환 타입 int
//DQL 문장(SELECT문)=> ResultSet executeQuery(sql) / 반환 타입 ResultSet

//5. sql문을 DB에 전송(실행)
ResultSet rs = stmt.executeQuery(sql); // 결과 테이블 반환
System.out.println("--------------------------------------------------");
System.out.println("idx"+"\t"+"name"+"\t"+"msg"+"\t\t"+"wdate");
//ResultSet의 메소드
/*boolean next() : rs의 논리적 커서는 첫번째 행의 직전에 위치한다
=> before first
next()가 호출되면 커서를 다음으로 이동시킨다.
이동시켜 가리키는 지점에 레코드가 있으면 true를 반환, 없으면 false를 반환한다.
---------------------------------
자료형 getXXX("컬럼명") : 해당 컬럼 값을 꺼낼 때 호출
이 때 오라클 자료형과 자바 자료형을 맞춰서 꺼내오자
*/

while(rs.next()){// memo 테이블 1번 레코드 직전에 위치해서 next가 다음 칸으로 이동(첫번째 행을 가리킴)
// 메모 테이블에 컬럼 데이터를 뽑아오기
int idx=rs.getInt("idx"); // memo 테이블에 글번호값 받기
String name=rs.getString("name"); // 작성자
String msg=rs.getString("msg"); // 메모 내용
java.sql.Date wdate = rs.getDate("wdate"); //작성일
System.out.println(idx+"\t"+name+"\t"+msg+"\t"+wdate);
}

System.out.println("--------------------------------------------------");

//6. DB자원 반납 - 순서 지켜야 함
rs.close();
stmt.close();
con.close();
}
}

========================================================

위의 문장을 실행하면 아래와 같습니다.

memo 테이블에 있는 idx, name, msg, wdate 컬럼을 가지고 와 출력하면서

프로그램은 종료됩니다.


위의 예제는 사용자가 프로그램에 직접 개입하지 않고 단순히 조회하는 예제입니다

하지만 다음 예제는 사용자가 작성자 명을 입력하면 그 영역을 찾아주는 예제입니다

위의 예제와 비슷합니다만 그래도 유용합니다



검색할 작성자명에 '길' 이라는 키워드를 입력하면

이름에 '길' 이 들어가 있는 데이터 영역 다 보여주기

========================================================


public class test {

public static void main(String[] args) throws Exception {

Class.forName("oracle:jdbc:driver:OracleDriver");
String url="jdbc:oracle:thin:@localhost:1521:ORCL";
String user="scott", pwd="tiger";
Connection con = DriverManager.getConnection(url,user,pwd);
System.out.println("DB연결됨");

Statement stmt = con.createStatement();

String input_name = JOptionPane.showInputDialog("검색할 작성자명을 입력하세요");

// 특정 작성자가 쓴 글만 출력하세요 => where절 select문
//String sql = "SELECT idx,name,msg,wdate FROM memo WHERE name = " + "'"+input_name+"'";

// '길' 자가 입력되면 홍길동, 김길동.. 글이 모두 나오게.
String sql2 = "SELECT idx,name,msg,wdate FROM memo"
+" WHERE name LIKE '%" + input_name +"%'";

ResultSet rs = stmt.executeQuery(sql2);
System.out.println("----"+input_name+"님 글 검색 결과-------");
while(rs.next()){

int idx=rs.getInt(1);
String name=rs.getString(2);
String msg=rs.getString(3);
Date wdate=rs.getDate(4);
System.out.println(idx+"\t"+name+"\t"+msg+"\t"+wdate);
}

System.out.println("------------------------------");

// 순서 지켜야함
rs.close();
stmt.close();
con.close();

}
}


========================================================


위의 소스 코드를 실행하면 아래 그림과 같습니다



'길' 이라는 단어를 입력하면..



Memo 테이블에 name 필드에 '길' 이라는 이름이 전부 다 조회된다






자바 JDBC 설치법. 따라하기만 하면 100% 됨

안녕하세요

이번 시간에는 정말 유용한 자바와 오라클 연동 방법입니다.

쉽게 말해서 자바와 데이터베이스를 연동하는 것이죠

저도 옛날에 도전해봤는데, 잘 못해서 헤맸는데

얼마전에 확실히 방법을 알아서

이렇게 올려봅니다.



일단 본격적으로 설치법을 올리기 전에

먼저 깔아야 할게 있습니다.

http://www.oracle.com/technetwork/database/enterprise-edition/downloads/database12c-win64-download-2297732.html

위의 오라클 사이트 경로로 들어가서..



위 두 개의 파일을 다운받으세요

오라클 설치법은 다른 블로그를 보시면 됩니다. 굉장히 쉽습니다


자 그럼 오라클이 설치되었다고 가정하고 설치법을 올리겠습니다.


1.  JDBC 드라이버 경로에서 ojdbc7.jar 파일 복사




2. C:\Java\jre1.8.0_102\lib\ext 경로에 가서 복사 한 파일 붙여넣기




3.  CLASS PATH 설정 ' .;C:\JAVA\jre\lib\ext\ojdbc7.jar '






((3.5. 오라클 서버 실행 실행창에서 services.msc 치고 OracleServiceOrcl 시작, XXXXlistener 시작 (JDBCTest.java)))





보통 오라클을 설치 할 때 자동으로 실행 상태로 되기 때문에 이 작업은 필요없다

하지만 컴퓨터를 부팅할 때 오라클 서비스도 시작을 하기 때문에 부팅 속도가 조금 늦어

실행 상태를 수동으로 맞추는 경우가 많다

이 3.5 과정이 귀찮으면 그냥 자동으로 맞춰서 해도 무방하다.



4.  JRE System Library 우 클릭하여 'Configure Build Path' 클릭
 JRE System Libary [jre...] 우측에 Edit.. 버튼 클릭
두번째 Alternate JRE 옆에 Installed JREs... 클릭
Edit을 눌러 경로를 바꾸자(C:\JAVA\jre) – ojdbc7.jar 파일 있는 곳으로





(자바를 실행하기 전에 먼저 SQL Developer에서 테이블을 하나 생성하자)

5. INSERT 문을 수행하는 자바 예제를 실행해보자

코드는 아래와 같다

=======================================================

package jdbc.day1;
import java.sql.*;
public class MyFirstJDBC {
public static void main(String[] args) throws ClassNotFoundException, SQLException{
//1.  드라이버 로딩 Class.forName("oracle.jdbc.driver.OracleDriver"); System.out.println("  드라이버 로딩 성공");
//2. DB 연결 String url="jdbc:oracle:thin:@localhost:1521:ORCL"; String user="scott"; String pwd="tiger"; Connection con = DriverManager.getConnection(url,user,pwd); System.out.println("DB Connected..");
//3. Statement 얻어오기 Statement stmt=con.createStatement();
//4.  전송할 쿼리문(SQL문) 작성 String sql="INSERT INTO memo(idx,name,msg)";   sql+=" VALUES(1,'홍길동',' 첫번째 글입니다.*^.^*')"; System.out.println(sql);
//5. execute()  메소드로 실행 boolean isRs=stmt.execute(sql); System.out.println("isRs="+isRs);
//6. close() stmt.close(); con.close();
}
}

========================================================


6. SQL Developer에서 select문으로 조회를 하면 데이터가 들어가 있음





InputStream 보다 좀 더 빨리 데이터를 처리 할 수 있는 BufferedReader/Writer

안녕하세요

이번 시간에는 BufferedReader/Writer를 활용하여 좀 더 빨리 데이터를 처리 할 수 있는

예제를 올려봅니다.


=====================================================

public class BufferedRedaerTest {

public static void main(String[] args) throws IOException {

InputStream is = System.in;
PrintStream ps = System.out;
//BufferedReader br = new BufferedReader(is); // 1바이트 노드 스트림을 바로 못받음, 그래서 중간 다리스트림을넣어야함
BufferedReader br = new BufferedReader(new InputStreamReader(is));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(ps));


/*int input=0;
// 2byte는 char[]타입 배열에 넣어야 함
char[] buf = new char[100];

while((input=br.read(buf))!=-1){
bw.write(buf, 0, input);
bw.flush();
}*/

// 줄 단위로 입력
String line="";
bw.write("입력하세요=>");
while((line=br.readLine())!=null){
bw.write(line+"\r\n"); // 줄 바꿈을 강제로 넣어줘야 엔터가 됨
bw.newLine(); // 줄 바꿈 (리눅스 운영체제에서 Enter 키가 \n임 / 윈도우 운영체제는 \r\n)
bw.flush();
}

bw.close();
br.close();
is.close();
ps.close();
}

}

=====================================================

실행 결과는 이전에 했던 거와 같습니다





InputStreamReader를 활용하여 키보드 입력을 받아 콘솔에 출력 및 파일로 저장

안녕하세요

이번 시간에는 InputStreamReader / OutputStreamWriter를 활용한 예제를 보여드리겠습니다

일단 InputStreamReader / OutputStreamWriter를 설명하자면..

 [1] 2byte 기반 스트림
 [2] Bridge Stream
 - 1byte로 입력받은 데이터를 2byte로 조합하여 읽거나 내보낸다.
 - 1byte 기반 스트림을 2byte 기반 필터 스트림과 중간에 연결해주는 기능을 수행함


아래 예제는 키보드 입력을 받아서 콘솔에 출력하는 예제입니다.

=======================================================

public class InputStreamReadertest {

public static void main(String[] args) throws IOException {

InputStreamReader ir = new InputStreamReader(System.in);
OutputStreamWriter ow = new OutputStreamWriter(System.out);

ow.write("입력하세요=>");
ow.flush();

// 배열을 쓰려면 char[] 배열을 활용해야 한다.

int input=0;
while((input=ir.read())!=-1){

ow.write(input);
ow.flush();
}

ir.close(); ow.close();

}

}

=======================================================

저 소스 코드를 실행할 때 자바 콘솔 창에서 하는 것보다 도스 창에서 실행하는 것이

더 낫습니다.



소스코드를 실행하려면 해당 프로젝트에 src 폴더가 아닌 bin 디렉토리에 가서

java io,day4.InputStreamReaderTest 명령어를 쳐야 실행이 됩니다

중간에 io.day4는 패키지 명이고 그 안에 InputStreamReaderTest 라는 자바 파일이 있습니다.



InputStreamReader / OutputStreamWriter 를 활용한 두 번째 예제도 올려봅니다.

두 번째 예제는 c:myjava 밑에 utf-8 방식으로 파일을 저장하는 예제입니다.

이것 또한 매우 간단합니다.

하지만 저 같은 경우는 io 입출력 예제를 처음 접하기 때문에 잘 몰라 어렵더군요 ㅜ



public class InputStreamReadertest2 {

public static void main(String[] args) throws IOException {

//2바이트로 읽어서 2바이트로 내보내자
//FileReader fr = new FileReader("C:/MyJava/스트림테스트.txt"); // 글자가 깨짐

FileInputStream fis = new FileInputStream("C:/MyJava/스트림테스트.txt");
InputStreamReader ir = new InputStreamReader(fis, "UTF-8");
OutputStreamWriter ow = new OutputStreamWriter(System.out);

int input=0;
while((input=ir.read())!=-1){
ow.write(input);
ow.flush();
}

fis.close();
ir.close();
ow.close();
}

}


자바에서 디렉토리를 생성하는 방법과 전체공간과 가용공간을 알아보는 메소드 활용

안녕하세요

이번 시간에는 제목이 곧 내용입니다.

자바에서 디렉토리를 생성하고, 삭제하는 방법과

생성된 디렉토리의 전체공간과 가용공간이 얼마인지 알아보는 시간을 가지겠습니다.


이번 내용도 예제에 주석을 달면서 설명하겠습니다~


public class test {

public static void main(String[] args) {

//디렉토리를 만들어보자.
File dir = new File("sample"); //디렉토리명 'sample' 지정
boolean bool=dir.exists();
System.out.println(dir.getName()+"의 존재 여부 : " + bool);
if(!bool){ // 디렉토리가 존재하지 않는다면 생성
boolean b = dir.mkdir(); // 단일 디렉토리 생성
System.out.println("디렉토리 생성 여부 : " + b);
}

//디렉토리와 그 안에 세부 디렉토리를 생성하고 싶을 때
File dir2 = new File("example", "day01"); // example 폴더 안에 day01 폴더 생김
if(!dir2.exists()){
boolean c = dir2.mkdirs(); // 여러 디렉토리 생성 (mkdirs)
System.out.println("디렉토리2 생성 여부 : " + c);
}

//디렉토리 이름 변경 : renameTo(File f) : sample=> sample2로 변경
dir.renameTo(new File("sample2"));

//디렉토리 삭제 : delete()
//해당 디렉토리에 파일이 없을 경우만 삭제한다.

boolean d = dir2.delete();
System.out.println("삭제 여부 : " + d); // example은 삭제 안되고 day01 디렉토리 삭제됨
long tspace = dir.getTotalSpace(); // 디렉토리 전체공간
long uspace = dir.getUsableSpace(); // 가용공간
System.out.println("tspace="+tspace+", uspace="+uspace);

//C:/ 디렉토리 아래 파일 목록을 가져오자.
File dir3 = new File("C:/");
// 두 가지 방법이 있다
//1. String[] list()

String[] files = dir3.list();
if(files!=null){
System.out.println("----------"+dir3.getName());
for(String file : files){
System.out.println(file);
}
}

System.out.println("********************************");

//2. File[] listFiles()
File[] files2 = dir3.listFiles();
if(files2!=null){
System.out.println("---------"+dir3.getName());
for(File file : files2){
System.out.println(file);
}
}
}
}


위의 결과는 아래와 같습니다. 직접 소스를 쳐보고 이해하면서 결과를 이해하면 도움이 될 것 같습니다.





이전에 썼던 예제와 오늘을 썼던 예제를 응용하면 아래와 같은 결과도 나옵니다

결과는 길게 나왔지만 소스는 짧습니다.



public class test {

public static void main(String[] args) {

// C 디렉토리의 파일/DIR 목록을 가져오되 아래와 같이 출력되도록 하세요
// File[] listFiles() 메소드 활용
/* -------------------------------------------
* 파일명 DIR/FILE 여부 파일크기 마지막 수정날짜
* */

File dir = new File("C:/");

File[] files2 = dir.listFiles();
if(files2!=null){

System.out.println("--------------------------------------------------------------------------");
System.out.println("파일명\t\tDIR/FILE\t파일크기\t마지막 수정일");
System.out.println("--------------------------------------------------------------------------");

for(File file : files2){
String fname = file.getName();
String type = (file.isDirectory())?"DIR":"File";
long fsize = file.length();
long time = file.lastModified();
Date date = new Date(time);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String lastDate = sdf.format(date);

System.out.println(fname + "\t\t\t\t  " + type + "\t\t  " + fsize + "\t  " + lastDate);
}

System.out.println("--------------------------------------------------------------------------");

}


}

}


자바에서 파일의 정보들을 알 수 있는 메소드 예제

안녕하세요

2일만에 블로그를 하게 되네요.

어제는 컴퓨터를 또 포맷할 일이 있어서 재설치 하느라 블로그를 못하게 됬네요


이번 시간에는 자바에서 File 메소드를 활용하여 파일의 정보를 알 수 있는 간단한 예제를

올려봅니다.

잘 봐주세요~!



<1> 첫번째 예제 - 파일의 파일명, 절대경로, 상대경로, 상위 부모 디렉토리, 파일 크기, 파일 여부, 디렉토리 여부, 파일을 마지막으로 수정한 날짜 등의 정보를 알려주자

public class test {

public static void main(String[] args) {

// 상대경로 <-> 절대경로(C:\..)
String fileStr="src/io/day3/FileReaderWriter.java";
File file = new File(fileStr);
// File 클래스의 메소드 활용
print("파일명 : " + file.getName());
print("파일의 절대경로: " + file.getAbsolutePath());
print("파일의 상대경로 : " + file.getPath());
print("상위 부모 디렉토리 : " + file.getParent());
long fsize=file.length();
print("파일 크기 : " + fsize + " bytes");

print("파일 여부 : "+file.isFile());
print("디렉토리 여부 : "+file.isDirectory());
File dir = file.getParentFile();
print(dir+"의 디렉토리 여부 : "+dir.isDirectory());

//파일을 마지막으로 수정한 날짜
//1970년 1월 1일부터 마지막 수정한 날짜까지의 시간을 밀리세컨드 초 (1/1000) 단위로 반환한다.
long time = file.lastModified();
print(String.valueOf(time));

//long형을 Date 형으로 바꾸면 날짜를 읽기 쉽게 바꿀수 있다

Date date = new Date(time);
print(date.toString());

//날짜 포맷
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//yyyy: 연도 2자리, MM: 월, dd: 일, hh: 시간, mm: 분, ss: 초
String strDate = sdf.format(date);
print(strDate);
}

public static void print(String str){
System.out.println(str);
}

}

위의 예제를 실행하면 아래와 같은 결과 화면이 자바 콘솔창에 출력됩니다.

인터넷 url 이미지를 복사해서 자바 스윙의 화면으로 뿌려주기

안녕하세요

이번 시간에는 좀 재밌는 예제를 올려봅니다.

이번 예제는 먼저 결과 사진을 보면서 설명해드리겠씁니다.


먼저 화면은 위와 같습니다.

원본 이미지 파일 아래에 'pin.png' 라는 원본 파일이 있어야

아래의 목적 이미지 파일이 생성됩니다

사전에 이미지 파일을 하나 챙기세요~




목적 이미지 파일은 텍스트로 수정 가능하니

반드시 target.png 형태로 저장 될 필요는 없습니다.





중간에 Copy 버튼을 누르면 나비 모양의 pic.png 이미지가 하단에 출력이 됨과 동시에

target.png 라는 파일이 생길겁니다. 

패키지 익스플로러 창에서 F5 키 누르면 됩니다




두번째 기능은 인터넷 URL 이미지 복사 기능인데

원격 이미지 파일의 url에 제가 사전에 정의해놓은 경로가 있습니다.

바로 밑에 원격에서 Copy라는 버튼을 누르면..



아래와 같이 인터넷 이미지를 출력하게 됩니다.

자 그럼 이것을 어떻게 구현하냐 하면..

아래와 같이 하시면 됩니다.

소스 코드를 이해하시면서 봐야지 도움이 됩니다~!



public class ImageCopyGui extends JFrame {
JTextField tf1, tf2, tfUrl;
JButton btCopy, btUrlCopy; JProgressBar pb; JLabel lbImage;
FileInputStream fis; FileOutputStream fos;
File file1, file2;
public ImageCopyGui() {
super("::ImageCopyGui::");
Container cp = getContentPane();
cp.setLayout(new GridLayout(2,1));
JPanel p = new JPanel(new GridLayout(0,1));
cp.add(p);
lbImage=new JLabel("*^.^*", JLabel.CENTER);
cp.add(new JScrollPane(lbImage));
lbImage.setBorder(new LineBorder(Color.magenta));
tf1=new JTextField("pic.png"); tf2=new JTextField("target.jpg");
tfUrl=new JTextField("http://imgmovie.naver.com/design/preview01/1610/evnet_african/image//img_02.jpg");
btCopy=new JButton("Copy"); btUrlCopy=new JButton("원격에서 Copy");
pb=new JProgressBar();
p.add(tf1); p.add(tf2); p.add(tfUrl); 
JPanel p2 = new JPanel(); p.add(p2);
p2.add(btCopy); p2.add(btUrlCopy);
p.add(pb);
pb.setStringPainted(true); // 프로그레스바 몇%인지 보여줌
tf1.setBorder(new TitledBorder("원본 이미지 파일"));
tf2.setBorder(new TitledBorder("목적 이미지 파일"));
tfUrl.setBorder(new TitledBorder("원격 이미지 파일의 URL"));
btCopy.setMnemonic('C'); 
p.setBorder(new BevelBorder(BevelBorder.RAISED)); // 패널을 입체적으로 보여줌 
// 이미지를 복사하는 버튼 이벤트 리스너
btCopy.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
String srcStr = tf1.getText(); // tf1의 이미지 pic.png(원본 이미지)
String targetStr=tf2.getText(); // // tf2의 이미지 target.png(복사 될 이미지)
file1=new File(srcStr); file2= new File(targetStr);
Thread tr = new Thread(){
@Override
public void run(){
fileCopy(file1, file2); // 사용자 정의 메소드
}
};
tr.start();
}
});
// 인터넷 이미지 url 주소의 이미지를 복사하는 버튼 이벤트 리스너
btUrlCopy.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
String urlStr = tfUrl.getText();
new Thread(){
public void run(){
urlFileCopy(urlStr); // 사용자 정의 메소드
}
}.start();
}
});
setSize(500, 500);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public synchronized void fileCopy(File srcFile, File tarFile){
// 스트림 연결 => 노드 스트림 => 필터 스트림
String msg="";
long fsize=srcFile.length(); // 원본 파일의 크기를 반환
setTitle("원본 파일 크기 : "+fsize+"bytes");
//pb의 최대값을 원본 파일 크기로 잡는다.
pb.setMaximum(0); pb.setMaximum((int)fsize);
try{
fis = new FileInputStream(srcFile);
fos = new FileOutputStream(tarFile);
//BuffredInputStream으로 처리하면 더 빠르다
// 반복문 돌면서 읽어들이고 내보낸다.
int input=0, count=0;
byte[] data = new byte[1024];
// 원본 이미지 복사
while((input=fis.read(data))!=-1){
fos.write(data, 0, input);
fos.flush();
count+=input;
pb.setValue(count);
Thread.sleep(10);
}
msg=count+"bytes 카피 완료";
// 스트림 닫기
fis.close(); fos.close();
lbImage.setIcon(new ImageIcon(tarFile.getAbsolutePath()));
}catch(FileNotFoundException e){
msg="없는 파일이에요: "+e.getMessage();
}catch(InterruptedException e){
msg="Interrupted 오류"+e.getMessage();
}catch(IOException e){
msg="오류 : "+e.getMessage();
}
JOptionPane.showMessageDialog(this, msg);
}
public void urlFileCopy(String urlStr){
// throws로 하면 다른 쪽에서 예외 처리를 해줘야함
try{
java.net.URL url = new java.net.URL(urlStr);
InputStream is = url.openStream();
java.net.URLConnection con = url.openConnection();
// url에 있는 파일의 크기를 반환한다.
int fsize = con.getContentLength();
setTitle(fsize+"bytes");
// 해당 url과 노드 연결된 입력 스트림을 반환한다.
BufferedInputStream bis = new BufferedInputStream(is);
file2 = new File(tf2.getText());
fos = new FileOutputStream(file2);
BufferedOutputStream bos = new BufferedOutputStream(fos);
int input=0, count=0;
byte[] data = new byte[3000];
while((input=bis.read(data))!=-1){
bos.write(data, 0, input);
bos.flush();
count+=input;
pb.setValue(count);
Thread.sleep(10);
}
bis.close(); bos.close();
is.close(); fos.close();
lbImage.setIcon(new ImageIcon(file2.getAbsolutePath()));
}catch(MalformedURLException e){
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
}

public static void main(String[] args) throws IOException {
new ImageCopyGui();
}

}