관리 메뉴

프로그래밍 삽질 중

[서버 문제] 웹페이지를 불러오고 html 파일로 저장하기 본문

과거 프로그래밍 자료들/자바(Java)

[서버 문제] 웹페이지를 불러오고 html 파일로 저장하기

평부 2021. 3. 15. 18:11

 

※ 문제를 순서대로 정리한다라기보단 개인적으로 어렵다고 느낀 부분을 복습하다가 다시 정리하는 글

※ 배우는 단계라 설명이 이상하거나 미흡한 부분들이 존재, 참고한 사이트들을 링크로 남기니 그 곳 참조바람

 

 

[문제]

웹페이지 '깃허브'를 읽어온 내용을 확장자가 'html'인 파일로 저장하는 프로그램 작성하기

 

 

 

[생각할 부분]

1) 웹페이지를 이클립스로 가져온다(읽어오기)

2) 읽어온 부분을 콘솔창에 출력한다

3) 출력한 내용을 html 파일에 저장한다(저장경로 및 이름 : c:/temp/naver.html)

 

 

 

[문제 답]

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
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;
 
public class ReadGithub {
 
    public static void main(String[] args) {
        String urlStr = "https://github.com/";
        try {
            URL url = new URL(urlStr);
            
            InputStream is =url.openStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            PrintWriter pw = new PrintWriter(System.outtrue);
            PrintWriter fw = new PrintWriter(new FileOutputStream("c:/temp/github.html"));
            
            String line = "";
            while ((line = br.readLine()) != null) {
                pw.println(line);
                fw.println(line);
                fw.flush();
            }
            br.close();
            is.close();
            pw.close();
            fw.close();
        } catch(MalformedURLException e) {
            e.printStackTrace();
        } catch(IOException e) {
            e.printStackTrace();
        }
 
    }
 
}
 
cs

 

 

 

[답 설명 추가] - //표시부분이 설명 부분

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;
 
public class ReadGithub {
 
    public static void main(String[] args) {
        String urlStr = "https://github.com/"//읽어올 웹 페이지 지정하기
        try { //try(실행코드) - catch(예외사항)문으로 진행됨
 
            URL url = new URL(urlStr); //URL 클래스 이용
            
           //문자 기반 스트림 
           //Reaer(BufferedReader, FileReader, InputStreamReader)
           //Writer(BufferedWriter, FileWriter, OutputStreamWriter, PrintWriter)
 
 
            InputStream is =url.openStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8")); 
           //여러 인코딩 방식 중 UTF-8이용
           //BufferedReader : 데이터 효율적으로 전송하기 위함
            
            PrintWriter pw = new PrintWriter(System.outtrue);
            PrintWriter fw = new PrintWriter(new FileOutputStream("c:/temp/github.html"));
 
            //FileWriter 대신 PrintWriter 사용하는 이유
            //FileWriter는 byte 배열 대신 문자열 직접 사용 가능 But \r\n을 문자열 뒤에 붙여야 함
            //PrintWritersms \r]n문자열을 덧붙이는 대신 println이라는 매서드 사용 가능
            //설명 참고한 사이트 : wikidocs.net/227
            
            String line = ""//읽어올 값이 문자이기 때문에 문자열인 line 변수를 만듦
            
            //if) 숫자형일 경우(이 경우는 파일을 스트림(byte) 단위로 읽을 때 더 적합함)
            //int count;
            //while ((count = br.read()) != -1) { } 
            //더 이상 입력스트림으로부터 바이트를 읽게 될 수 없게 되면 -1 리턴 = 파일의 끝 도달
 
 
            while ((line = br.readLine()) != null) { //파일의 끝에 도달
                pw.println(line); //writer를 통해 쓴 값들을 String line으로 표시
                fw.println(line);
                fw.flush(); 
 
            //flush : 출력을 쓸어내림, out이 가진 단점
            //(한 번에 출력하므로 명령 입력 시점과 출력 시점이 달라 시간차 발생) 보완, 버퍼를 청소
            
}
            is.close(); //입력 스트림 닫기
            br.close(); //출력스트림 닫기
            pw.close();
            fw.close();
 
            //oo.close(); : 사용한 파일 객체를 닫아주는 것(생략 가능하나 사용했던 파일을 다시 사용할 경우 오류 발생)
           //스트림 사용 후 닫아놓는 습관을 들이기(오류 가능성 낮아짐)
 
           // e값 : 변수 값(보통 e를 사용)
        } catch(MalformedURLException e) { //URL 관련 예외사항
            e.printStackTrace();
        } catch(IOException e) { //Exception(예외의 한 종류), IOExceptio만 따로 처리하기 위해서는 catch 순서 변경 필요
            e.printStackTrace();
 
         //printStackTrace() : 리턴값 존재x, 메소드가 내부적으로 예외결과를 화면에 출력
         //가장 자세한 예외 정보를 제공(예외의 값으로 가장 많이 사용)
         //설명 참고한 사이트 : opentutorials.org/course/2517/14145
        }
 
    }
 
}
 
cs

 

[결과값] - 이클립스 화면

 

[결과값 - C드라이브 temp파일에 저장함 - 노란색 표시]

[결과 - 웹사이트 화면 출력]