【java學習記錄】13.實現簡單的瀏覽器功能:獲取原始碼、儲存原始碼、獲取圖片
阿新 • • 發佈:2019-01-23
仿照IE瀏覽器,設計一簡單的網站訪問程式,實現如下功能:
(1)具有類似IE的簡單介面,使用者能輸入URL地址,獲得輸入URL的HTML原始碼;
(2)將獲得的HTML原始碼儲存到指定檔案中。D:\index.html
(3)從獲得的HTML原始碼中,選擇一個圖片(.jpg,.gif,.png)連結,從WWW伺服器獲取該檔案並下載儲存。D:\pic8.jpg
Browser
public class Browser extends JFrame implements ActionListener{
JButton btnGetSource;//獲取原始碼
JButton btnSaveSource;//儲存原始碼
JButton btnGetImage;//獲取圖片
JTextField urlText;//網址文字框
JTextArea sourceText;//原始碼文字域
Browser(){
//框架
this.setTitle("瀏覽器");
this.setSize(800, 500);
this.setLocationRelativeTo(null);//居中
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//結束程式
this.setLayout(new BorderLayout());//使用邊框佈局
//面板
JPanel northPanel=new JPanel();//北區面板
JPanel centerPanel=new JPanel();//中區面板
JPanel btnPanel=new JPanel();//存放按鈕的面板
northPanel.setBackground(Color.white);//設定背景顏色
centerPanel.setBackground(Color.cyan);
btnPanel.setBackground(Color.white);
northPanel.setPreferredSize(new Dimension(0, 38));//設定北區面板的高度為45,寬度隨視窗變化
northPanel.setLayout(new BorderLayout());//使用邊框佈局
centerPanel.setLayout(new BorderLayout());//使用邊框佈局
this.add(northPanel,BorderLayout.NORTH);//新增到框架的北區
this.add(centerPanel,BorderLayout.CENTER);//新增到框架的中區
northPanel.add(btnPanel,BorderLayout.EAST);//將btnPanel面板新增到northPanel面板的東區
//URL標籤
JLabel urlLabel=new JLabel("URL:");
urlLabel.setBorder(new EmptyBorder(0, 5, 0, 0));
urlLabel.setPreferredSize(new Dimension(40,0));
northPanel.add(urlLabel,BorderLayout.WEST);
//網址文字框
urlText=new JTextField("http://www.swust.edu.cn");
urlText.setBorder(new CompoundBorder(new EmptyBorder(5,0,5,0), new LineBorder(Color.gray)));//設定文字框的位置和顯示文字框的邊框
northPanel.add(urlText,BorderLayout.CENTER);
//按鈕
btnGetSource=new JButton("獲取原始碼");
btnSaveSource=new JButton("儲存原始碼");
btnGetImage=new JButton("獲取圖片");
btnPanel.add(btnGetSource);//將按鈕新增到btnPanel面板上
btnPanel.add(btnSaveSource);
btnPanel.add(btnGetImage);
//新增監聽器
btnGetSource.addActionListener(this);
btnSaveSource.addActionListener(this);
btnGetImage.addActionListener(this);
//原始碼文字域
sourceText=new JTextArea();
JScrollPane scrollPane=new JScrollPane(sourceText);//給文字域新增滾動條
scrollPane.setBorder(new CompoundBorder(new EmptyBorder(0,5,15,5), new LineBorder(Color.gray)));//設定文字框的位置和顯示文字域的邊框
centerPanel.add(scrollPane);
//顯示框架
this.setVisible(true);
}
//點選事件
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource()==btnGetSource){
getSource();//獲取原始碼
}else if(e.getSource()==btnSaveSource){
saveSource();//儲存原始碼
}else{
getImage();//獲取圖片
}
}
//獲取原始碼
public void getSource(){
// System.out.println("111");
sourceText.setText("");//清空原始碼文字域內容
try {
URL url=new URL(urlText.getText());//獲取網址
InputStream is=url.openStream();//開啟網址
InputStreamReader isr=new InputStreamReader(is,"utf-8");//讀取網址內容,UTF-8:編碼方式
BufferedReader br=new BufferedReader(isr);//設定緩衝
String read;//儲存讀取的內容
while((read=br.readLine())!=null){//一行一行的讀取內容
sourceText.append(read+"\n");//新增到原始碼文字域中
}
//關閉流
br.close();
isr.close();
is.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//儲存原始碼
public void saveSource(){
// System.out.println("222");
File source=new File("D:\\index.html");//建立txt文字
try {
FileWriter fw=new FileWriter(source);//字元輸出流
String read=sourceText.getText();//獲取原始碼文字域內容
fw.write(read);
//彈出提示框
JOptionPane.showMessageDialog(this, "原始碼儲存成功!");
fw.close();//關閉流
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//獲取圖片
public void getImage(){
// System.out.println("333");
try {
URL url=new URL("http://www.swust.edu.cn/page/main851/images/flash1.jpg");//圖片地址
InputStream is=url.openStream();//開啟網址
File image=new File("D:\\pic8.jpg");//建立檔案
FileOutputStream fos=new FileOutputStream(image);//輸出流
byte[] b=new byte[2048];//需為2的倍數
int n=is.read(b);//讀取位元組的個數,每次讀2048個位元組
while(n!=-1){//-1表示讀完
// fos.write(b1);//寫入所有位元組流
fos.write(b,0,n);//第0個位元組開始,寫入n個位元組
n=is.read(b);
}
//彈出提示框
JOptionPane.showMessageDialog(this, "圖片獲取成功!");
//關閉流
is.close();
fos.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
new Browser();
}
}