工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 1439|回复: 4

[求助]JAVA文件操作的一个问题

[复制链接]
发表于 2005-5-21 20:38 | 显示全部楼层 |阅读模式
//源码是这样的:
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import javax.swing.*;
import java.io.*;
import java.lang.*;
public class URLRead extends JFrame
{
        public static void main(String []args){        new URLRead();}       

        JPanel jp;
        Label lb=new Label();
        TextField tf=new TextField();
        Button btn=new Button();
        TextArea ta=new TextArea();
           public URLRead()
        {
        jp=(JPanel)this.getContentPane();
        jp.setLayout(null);
        this.setSize(new Dimension(800,600));
        this.setResizable(false);
        this.setTitle("读取网络资源");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        lb.setText("URL name:");
        lb.setBounds(new Rectangle(40,6,65,22));
        tf.setText("http://www.haokan123.com");
        tf.setBounds(new Rectangle(140,3,246,24));
        btn.setLabel("Read");
        btn.setBounds(new Rectangle(323,4,65,24));
        btn.addMouseListener(new myMouseAdapter());
        ta.setText("输入网址,读取网上的源文件");
        ta.setBounds(new Rectangle(30,42,750,500));
        jp.add(btn,null);
        jp.add(lb,null);
        jp.add(tf,null);
        jp.add(ta,null);
        this.setVisible(true);
        }
        class myMouseAdapter extends MouseAdapter
        {
                public void mouseClicked(MouseEvent e)
                {
                String str1="";ta.setText("正在读取网络数据...");
                try
                        {
                        byte[]buf=new byte[1024];
                        URL url=new URL(tf.getText());
                        File tmp=File.createTempFile("url",".tmp");
                        tmp.deleteOnExit();
                        BufferedInputStream urlReader=new BufferedInputStream(url.openStream());
                        BufferedOutputStream urlWriter=new BufferedOutputStream(new FileOutputStream(tmp));
                        while((urlReader.read(buf))!=-1){urlWriter.write(buf);}
                        urlWriter.flush();
                        urlReader.close();
                        urlWriter.close();
                        ta.setText("");
                        BufferedReader temp=new BufferedReader(new FileReader(tmp));
                        while((str1=temp.readLine())!=null){str1+="\n ";ta.append(str1);}
                        }catch(Exception ex){JOptionPane.showMessageDialog(null,"Something wrong!");}
               
                }
        }
}
//问题是:读取网页源码的结果,会有多余的文字,如读"http://www.haokan123.com",结果是......</html>"javascript" SRC="http://is.qq.com/js/addportal.js"></SCRIPT>
<SCRIPT>AddPortal......
我知道问题出在"BufferedInputStream urlReader=new BufferedInputStream(url.openStream());
                        BufferedOutputStream urlWriter=new BufferedOutputStream(new FileOutputStream(tmp));
                        while((urlReader.read(buf))!=-1){urlWriter.write(buf);}"
我试过用BufferedReader,结果完全正确.
但我不明白这个程序为什么会这样?
请高手解答
发表于 2005-5-21 21:13 | 显示全部楼层

while((urlReader.read(buf))!=-1){urlWriter.write(buf);}  


基本上这里是程序的中心了 :  把url的那个页面内容 用 buf 全部读入 tmp 文件, 后面那步
“  while((str1=temp.readLine())!=null){str1+=\"\\n \";ta.append(str1);}”  

也只是把整个tmp文件的String搬到 ta 里面显示。

似乎程序没有其他的对读入网页源码的操作了, 而且
“......</html>\"javascript\" SRC=\"http://is.qq.com/js/addportal.js\"></SCRIPT>
<SCRIPT>AddPortal......

应是属于源码的一部分, 可以用IE的打开源码来看到的..


\"BufferedInputStream urlReader=new BufferedInputStream(url.openStream());
                        BufferedOutputStream urlWriter=new BufferedOutputStream(new FileOutputStream(tmp));
\"
这一段只是将url的数据流与urlReader 接上,  将临时文件tmp与urlWriter 接上而已。

程序输出是正确的  :)
回复

使用道具 举报

 楼主| 发表于 2005-5-21 21:26 | 显示全部楼层
不要看得懂程序就回复.
代码是我写的,我知道它的过程,我不明的是它为什么
\"//问题是:读取网页源码的结果,会有多余的文字,如读\"http://www.haokan123.com\",结果是......</html>\"javascript\" SRC=\"http://is.qq.com/js/addportal.js\"></SCRIPT>
<SCRIPT>AddPortal......
\"?
正确的结果是\"......</html>\"
后面多余的代码是如何产生的??
用另外方法我也可以正确读取数据,我只想知道

为什么会这样?
回复

使用道具 举报

发表于 2005-5-21 22:04 | 显示全部楼层
quite sorry..........没仔细看问题....呵呵。。。

...恩...应该是读到 </html> 就结束了.......

\"
while((urlReader.read(buf))!=-1){urlWriter.write(buf)
\"
这一段我想没问题......</html>后面还有字串,感觉是在最后用urlWriter.flush()往tmp里写之前, tmp里已经被写入了东西.....

想问下
BufferedOutputStream urlWriter=new BufferedOutputStream(new FileOutputStream(tmp));“
这段定义, 为何 内层 会用 \"FileOutputStream\"....

=====
我想可以在 while((urlReader.read(buf))!=-1){urlWriter.write(buf);} 处加个Debug, 看看urlReader读入的总的数据是否正确(略去urlWriter不用,用个简单String记录)。。。。。
====
那个Flush()函数不是太确定, BufferedStream 是否可能在使用Flush之前就已往tmp里写入了数据( 读入的data 超过buffer 了 ?? ), 导致使用Flush后重复写入... ?
回复

使用道具 举报

 楼主| 发表于 2005-5-22 10:16 | 显示全部楼层
想问下
BufferedOutputStream urlWriter=new BufferedOutputStream(new FileOutputStream(tmp));“
这段定义, 为何 内层 会用 \"FileOutputStream\"....

我试过用其它去构造都不行.我想应该是因为BufferedOutputStream这个构造方法要求一个OutputStream的对象,所以只能给它一个OutputStream对象.
至于flush()的问题,我也试过,去掉这个,结果不变.

尝试有String去做,但Byte转为String,结果可想而知.
我怀疑是
while((urlReader.read(buf))!=-1){urlWriter.write(buf);}
出了问题,但我查JDK,又找不出什么来,

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2024-6-9 23:03

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

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