Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 276|回复: 0

[Swing学习]一个网页源文件查看器

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-2 23:55:46 | 显示全部楼层 |阅读模式
    有些网页是屏蔽了鼠标右键的,不让我们查看它的源代码或者不让我们点击鼠标右键,在此我们可以写一个程序,让它获得这个网页的流,然后我们不就什么都能看到了吗?

        此程序就是这样写的,先获得网页的输入流,然后得到这个输入流的一些参数,比如这个流的长度,这个流所使用的编码.然后根据这些参数来进行获取,并根据不同的情况提供不同的进度条,比如有些网页它的长度返回的是-1,这个时候就用一个无状态的进度条来表示,如果长度大于0的话,那就用可以实时显示目前读取网页的进度.正好借这个机会又把swing复习了一下.呵呵.

    运行时的图片如下:



    下面是代码:
    1. /*
    2. * Test4.java
    3. *
    4. * Created on 2007年9月27日, 下午3:05
    5. */
    6. package test2;
    7. import java.io.BufferedReader;
    8. import java.io.BufferedWriter;
    9. import java.io.ByteArrayOutputStream;
    10. import java.io.File;
    11. import java.io.FileWriter;
    12. import java.io.IOException;
    13. import java.io.InputStream;
    14. import java.io.InputStreamReader;
    15. import java.net.HttpURLConnection;
    16. import java.net.MalformedURLException;
    17. import java.net.URL;
    18. import java.util.logging.Level;
    19. import java.util.logging.Logger;
    20. import javax.swing.JFileChooser;
    21. import javax.swing.JOptionPane;
    22. import javax.swing.UIManager;
    23. import javax.swing.filechooser.FileFilter;
    24. import javax.swing.filechooser.FileNameExtensionFilter;
    25. /**
    26. *
    27. * @author  hadeslee
    28. */
    29. public class Test4 extends javax.swing.JFrame {
    30.     private Task task; //只存在的一个方法
    31.     /** Creates new form Test4 */
    32.     public Test4() {
    33.         try {
    34.             UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    35.         } catch (Exception exe) {
    36.             exe.printStackTrace();
    37.         }
    38.         initComponents();
    39.         jpb.setStringPainted(true);
    40.         jpb.setVisible(false);
    41.         this.setLocationRelativeTo(null);
    42.     }
    43.     /** This method is called from within the constructor to
    44.      * initialize the form.
    45.      * WARNING: Do NOT modify this code. The content of this method is
    46.      * always regenerated by the Form Editor.
    47.      */
    48.     //
    49.    
    50.      
    51.     private void initComponents() {
    52.         jLabel1 = new javax.swing.JLabel();
    53.         input = new javax.swing.JTextField();
    54.         jButton1 = new javax.swing.JButton();
    55.         jScrollPane1 = new javax.swing.JScrollPane();
    56.         output = new javax.swing.JTextArea();
    57.         jButton2 = new javax.swing.JButton();
    58.         jButton3 = new javax.swing.JButton();
    59.         jpb = new javax.swing.JProgressBar();
    60.         setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    61.         setTitle("查看网页源文件");
    62.         setResizable(false);
    63.         jLabel1.setForeground(new java.awt.Color(51, 51, 255));
    64.         jLabel1.setText("地址");
    65.         input.setForeground(new java.awt.Color(51, 51, 255));
    66.         input.addActionListener(new java.awt.event.ActionListener() {
    67.             public void actionPerformed(java.awt.event.ActionEvent evt) {
    68.                 inputActionPerformed(evt);
    69.             }
    70.         });
    71.         jButton1.setForeground(new java.awt.Color(51, 51, 255));
    72.         jButton1.setText("查看");
    73.         jButton1.addActionListener(new java.awt.event.ActionListener() {
    74.             public void actionPerformed(java.awt.event.ActionEvent evt) {
    75.                 jButton1ActionPerformed(evt);
    76.             }
    77.         });
    78.         jScrollPane1.setBorder(javax.swing.BorderFactory.createTitledBorder("源文件"));
    79.         output.setColumns(20);
    80.         output.setEditable(false);
    81.         output.setLineWrap(true);
    82.         output.setRows(5);
    83.         output.setWrapStyleWord(true);
    84.         jScrollPane1.setViewportView(output);
    85.         jButton2.setText("保存");
    86.         jButton2.addActionListener(new java.awt.event.ActionListener() {
    87.             public void actionPerformed(java.awt.event.ActionEvent evt) {
    88.                 jButton2ActionPerformed(evt);
    89.             }
    90.         });
    91.         jButton3.setText("退出");
    92.         jButton3.addActionListener(new java.awt.event.ActionListener() {
    93.             public void actionPerformed(java.awt.event.ActionEvent evt) {
    94.                 jButton3ActionPerformed(evt);
    95.             }
    96.         });
    97.         javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    98.         getContentPane().setLayout(layout);
    99.         layout.setHorizontalGroup(
    100.             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    101.             .addGroup(layout.createSequentialGroup()
    102.                 .addContainerGap()
    103.                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    104.                     .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 450, Short.MAX_VALUE)
    105.                     .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
    106.                         .addComponent(jLabel1)
    107.                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
    108.                         .addComponent(input, javax.swing.GroupLayout.DEFAULT_SIZE, 359, Short.MAX_VALUE)
    109.                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
    110.                         .addComponent(jButton1))
    111.                     .addGroup(layout.createSequentialGroup()
    112.                         .addGap(10, 10, 10)
    113.                         .addComponent(jButton2)
    114.                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
    115.                         .addComponent(jButton3)
    116.                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
    117.                         .addComponent(jpb, javax.swing.GroupLayout.DEFAULT_SIZE, 314, Short.MAX_VALUE)))
    118.                 .addContainerGap())
    119.         );
    120.         layout.setVerticalGroup(
    121.             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    122.             .addGroup(layout.createSequentialGroup()
    123.                 .addContainerGap()
    124.                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
    125.                     .addComponent(jLabel1)
    126.                     .addComponent(jButton1)
    127.                     .addComponent(input, javax.swing.GroupLayout.PREFERRED_SIZE,
    128.      
    129.                      javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
    130.                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
    131.                 .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 223,
    132.      
    133.                     javax.swing.GroupLayout.PREFERRED_SIZE)
    134.                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
    135.                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    136.                     .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
    137.                         .addComponent(jButton2)
    138.                         .addComponent(jButton3))
    139.                     .addComponent(jpb, javax.swing.GroupLayout.PREFERRED_SIZE,
    140.      
    141.                         javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
    142.                 .addContainerGap())
    143.         );
    144.         pack();
    145.     }//
    146.    
    147.     private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    148.         // TODO add your handling code here:
    149.         if (task != null) {
    150.             task.cancel();
    151.         }
    152.         task = new Task(input.getText());
    153.         new Thread(task).start();
    154.     }
    155.     private void inputActionPerformed(java.awt.event.ActionEvent evt) {
    156.         // TODO add your handling code here:
    157.         if (task != null) {
    158.             task.cancel();
    159.         }
    160.         task = new Task(input.getText());
    161.         new Thread(task).start();
    162.     }
    163.     private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
    164.         // TODO add your handling code here:
    165.         System.exit(0);
    166.     }
    167.     private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
    168.         // TODO add your handling code here:
    169.         doSave();
    170.     }
    171. //用于保存的方法
    172.     private void doSave() {
    173.         String s = output.getText();
    174.         if (s == null || s.equals("")) {
    175.             JOptionPane.showMessageDialog(this, "当前没有东西可保存!!");
    176.             return;
    177.         }
    178.         JFileChooser jfc = new JFileChooser(".");
    179.         FileNameExtensionFilter txt = new FileNameExtensionFilter("文本文档(*.txt)", "txt");
    180.         FileNameExtensionFilter html = new FileNameExtensionFilter("网页文档(*.html)", "html", "htm");
    181.         jfc.addChoosableFileFilter(html);
    182.         jfc.addChoosableFileFilter(txt);
    183.         int i = jfc.showSaveDialog(this);
    184.         if (JFileChooser.APPROVE_OPTION == i) {
    185.             BufferedWriter bw = null;
    186.             try {
    187.                 File f = jfc.getSelectedFile();
    188.                 FileFilter filter = jfc.getFileFilter();
    189.                 FileNameExtensionFilter ff = null;
    190.                 //如果是可以匹配的,则匹配,否则的话,只能用户输入什么
    191.                 //就是什么了,即使他不输入后缀名那也没办法了
    192.                 if (filter instanceof FileNameExtensionFilter) {
    193.                     ff = (FileNameExtensionFilter) filter;
    194.                     String[] exts = ff.getExtensions();
    195.                     boolean match = false;
    196.                     for (String ext : exts) {
    197.                         if (f.toString().toLowerCase().endsWith(ext.toLowerCase())) {
    198.                             match = true;
    199.                             break;
    200.                         }
    201.                     }
    202.                     //如果没有匹配,则说明输入的时候,没有输入后缀名,我们要人工加上去
    203.                     if (!match) {
    204.                         f = new File(f.toString() + "." + exts[0]);
    205.                     }
    206.                 }
    207.                 bw = new BufferedWriter(new FileWriter(f));
    208.                 bw.write(s);
    209.                 JOptionPane.showMessageDialog(this, "保存成功!!");
    210.             } catch (IOException ex) {
    211.                 Logger.getLogger(Test4.class.getName()).log(Level.SEVERE, null, ex);
    212.             } finally {
    213.                 try {
    214.                     if (bw != null) {
    215.                         bw.close();
    216.                     }
    217.                 } catch (IOException ex) {
    218.                     Logger.getLogger(Test4.class.getName()).log(Level.SEVERE, null, ex);
    219.                 }
    220.             }
    221.         }
    222.     }
    223. //用于取源码的线程
    224.     private class Task implements Runnable {
    225.         //此任务是否已经取消了
    226.         private volatile boolean isCanceled;
    227.         private String s;
    228.         private int done; //已经完成的字节
    229.         private InputStream is; //连上的输入流,如果长时间没有动作,则流也要被强制关闭
    230.         private long time; //最新一次读流的时间
    231.         public Task(String s) {
    232.             this.s = s;
    233.             time = System.currentTimeMillis(); //初始化第一次的时间
    234.             new Thread() {
    235.                 public void run() {
    236.                     while (!isCanceled) {
    237.                         try {
    238.                             Thread.sleep(1000);
    239.                             long now = System.currentTimeMillis();
    240.                             //如果最后一次读成功字节到现在已经过了30秒钟了,则强行断之
    241.                             if (now - time > 30000) {
    242.                                 isCanceled = true;
    243.                                 jpb.setIndeterminate(false);
    244.                                 jpb.setVisible(false);
    245.                                 is.close();
    246.                             }
    247.                         } catch (Exception ex) {
    248.                             Logger.getLogger(Test4.class.getName()).log(Level.SEVERE, null, ex);
    249.                         }
    250.                     }
    251.                 }
    252.             }.start();
    253.         }
    254.         public void run() {
    255.             validate(s);
    256.         }
    257.         //验证传入的字符串是否合法
    258.         private void validate(String s) {
    259.             try {
    260.                 if (s == null || s.equals("")) {
    261.                     JOptionPane.showMessageDialog(Test4.this, "网址不能为空!!");
    262.                     input.requestFocus();
    263.                     return;
    264.                 } else if (s.startsWith("http://")) {
    265.                     //什么都不要做
    266.                 } else {
    267.                     //如果没有加上http的前缀的话,我们帮他加上
    268.                     s = "http://" + s;
    269.                 }
    270.                 if (isCanceled) {
    271.                     return;
    272.                 }
    273.                 URL url = new URL(s);
    274.                 viewSource(url);
    275.             } catch (MalformedURLException ex) {
    276.                 Logger.getLogger(Test4.class.getName()).log(Level.SEVERE, null, ex);
    277.                 JOptionPane.showMessageDialog(Test4.this, "域名解析出错!!");
    278.             }
    279.         }
    280.         //执行查看网页源文件的动作
    281.         private void viewSource(URL url) {
    282.             try {
    283.                 jpb.setVisible(true);
    284.                 jpb.setValue(0);
    285.                 jpb.setString("");
    286.                 HttpURLConnection http = (HttpURLConnection) url.openConnection();
    287.                 //得到网页的内容长度,可能为-1
    288.                 int length = http.getContentLength();
    289.                 if (length != -1) {
    290.                     jpb.setIndeterminate(false);
    291.                     jpb.setMaximum(length);
    292.                     jpb.setValue(0);
    293.                 } else {
    294.                     jpb.setString("");
    295.                     jpb.setIndeterminate(true);
    296.                 }
    297.                 //中间再检查一下是否取消了本次任务,以免做无谓的功
    298.                 if (isCanceled) {
    299.                     return;
    300.                 }
    301.                 //得到网页的编码,可能没有指定,如果没有指定,就用默认的系统编码了
    302.                 String contentType = http.getContentType();
    303.                 String encoding = null; //将要使用的编码,它将从contentType里面去取
    304.                 if (contentType != null) {
    305.                     int index = contentType.indexOf("charset=");
    306.                     if (index != -1) {
    307.                         encoding = contentType.substring(index + 8).trim();
    308.                     }
    309.                 }
    310.                 is = http.getInputStream();
    311.                 //如果得到的长度是-1,则不知道什么时候会读完
    312.                 //这个时候就可以边读边显示出来
    313.                 if (length == -1) {
    314.                     BufferedReader br = new BufferedReader(new InputStreamReader(is));
    315.                     String temp = null;
    316.                     output.setText(null);
    317.                     while (br.ready()) {
    318.                         time = System.currentTimeMillis();
    319.                         temp = br.readLine();
    320.                         if (isCanceled) {
    321.                             return;
    322.                         }
    323.                         output.append(temp + "
    324. ");
    325.                     }
    326.                     System.out.println("读到底了");
    327.                     isCanceled = true;
    328.                     jpb.setIndeterminate(false);
    329.                     jpb.setVisible(false);
    330.                 } else {
    331.                     //如果知道长度多长,就可以显示一个进度条,等所有的字节都读完再显示
    332.                     ByteArrayOutputStream bout = new ByteArrayOutputStream();
    333.                     int data = -1;
    334.                     while ((data = is.read()) != -1) {
    335.                         if (isCanceled) {
    336.                             return;
    337.                         }
    338.                         time = System.currentTimeMillis();
    339.                         if (length > 0) {
    340.                             done++;
    341.                             jpb.setValue(done);
    342.                             int rate = done * 100 / length;
    343.                             jpb.setString("" + rate + "%");
    344.                         }
    345.                         bout.write(data);
    346.                         //如果长度不为-1,并且已经读了这么多长度以后,就要断线了
    347.                         if (done == length) {
    348.                             String text = null;
    349.                             byte[] b = bout.toByteArray();
    350.                             if (encoding == null) {
    351.                                 text = new String(b);
    352.                             } else {
    353.                                 text = new String(b, encoding);
    354.                             }
    355.                             if (!isCanceled) {
    356.                                 output.setText(text);
    357.                             }
    358.                             isCanceled = true;
    359.                             jpb.setVisible(false);
    360.                             return;
    361.                         }
    362.                     }
    363.                 }
    364.             } catch (IOException ex) {
    365.                 Logger.getLogger(Test4.class.getName()).log(Level.SEVERE, null, ex);
    366.                 if (isCanceled) {
    367.                     return;
    368.                 } else {
    369.                     JOptionPane.showMessageDialog(Test4.this, "打开网页失败!!");
    370.                 }
    371.             } catch (Exception exe) {
    372.                 if (isCanceled) {
    373.                     return;
    374.                 } else {
    375.                     JOptionPane.showMessageDialog(Test4.this, "打开网页失败!!");
    376.                 }
    377.             } finally {
    378.                 try {
    379.                     if (is != null) {
    380.                         is.close();
    381.                     }
    382.                     jpb.setVisible(false);
    383.                 } catch (IOException ex) {
    384.                     Logger.getLogger(Test4.class.getName()).log(Level.SEVERE, null, ex);
    385.                 }
    386.             }
    387.         }
    388.         public void cancel() {
    389.             isCanceled = true;
    390.         }
    391.     }
    392.     /**
    393.      * @param args the command line arguments
    394.      */
    395.     public static void main(String[] args) {
    396.         java.awt.EventQueue.invokeLater(new Runnable() {
    397.             public void run() {
    398.                 new Test4().setVisible(true);
    399.             }
    400.         });
    401.     }
    402.     // Variables declaration - do not modify
    403.     private javax.swing.JTextField input;
    404.     private javax.swing.JButton jButton1;
    405.     private javax.swing.JButton jButton2;
    406.     private javax.swing.JButton jButton3;
    407.     private javax.swing.JLabel jLabel1;
    408.     private javax.swing.JScrollPane jScrollPane1;
    409.     private javax.swing.JProgressBar jpb;
    410.     private javax.swing.JTextArea output;
    411.     // End of variables declaration
    412. }
    复制代码
        我是用NetBeans写的,程序部份都有注释,界面部份是拖出来的,以前我很不喜欢拖控件的,所有的界面都是自己手写代码,后来发现NetBeans的拖控件功能确实很强,应该说是java IDE里面最强的了.所以忍不住就用了一下,感觉不错,所以向大家推荐一下。


       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/11/2/235546265.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 16:33 , Processed in 0.313519 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表