孙鑫JAVA教学视频学习笔记(9-10)

上一篇 / 下一篇  2009-03-27 11:39:09 / 个人分类:读书笔记

九. Applet编程
内容:
Applet编程,详细讲解Applet的生命周期,子体的设置,applet从网页中获取信息,applet和浏览器的通信,更新显示的原理,用Applet来制作动画程序,以及动画程序的优化。

1.Applet是什么?
Applet又称为Java小应用程序,是能够嵌入到一个HTML页面中,并且可通过Web浏览器下载和执行的一种Java类 。
Applet不需要main()方法,由Web浏览器中内嵌的Java虚拟机调用执行。-- 测试时可以用appletviewer调用!

2.Applet的安全限制
因为applet是从远端服务器上下载并且在本地执行,所以安全性就显得格外重要。
通过限制applet在沙箱(applet的运行环境)中运行,保证了对本地系统而言applet是安全的。
applet在沙箱中运行时:
⑴不能运行任何本地可执行程序;
⑵除了存放下载的applet的服务器外,applet不能和其它主机进行通信。
⑶不能对本地文件系统进行读写。

编写Applet就是创建Applet类;

java.lang.Object
  java.awt.Component
      java.awt.Container
          java.awt.Panel
              java.applet.Applet
它是由awt的Panel继承而来的,所以也可以添加button等!

init(),destroy(), start(), stop()

3. Applet的生命周期 (init(),destroy(), start(), stop()组成)
init():当浏览器加载applet,进行初始化的时候调用该方法。--初始化工作都写这里面,applet无需构造方法
start():在init()方法之后调用。当用户从其它页面转到包含applet的页面时,该方法也被调用。
stop():在用户离开包含applet的页面时被调用。-- 不可见时即被调用!
destroy():当applet不再被使用,或浏览器退出的时候,该方法被调用。

appletviewer.exe: --- sun提供用来测试java小应用程序的!
e:\java>appletviewer TestApplet.html
或:e:\java>appletviewer TestApplet.java //将applet调用标记写入java源文件即可

import java.applet.*;
public class TestApplet extends Applet //Applet必须是public,否则浏览器无法加载
{
    public void init()
    {
        System.out.println("init");
    }
        public void start()
    {
        System.out.println("start");
    }
        public void stop()
    {
        System.out.println("stop");
    }
        public void destroy()
    {
        System.out.println("destroy");
    }
}
//appletviewer.exe 可以识别以下代码:测试时候用,非常方便! -- 无需调用html
//<applet code="TestApplet.class" width=600 height=400>
//</applet>

4.Paint()方法  -- Component中继承的
Applet本质上是图形方式的,我们应该在图形环境中绘制我们的显示内容。
我们可以通过创建一个paint()方法在Applet的panel上绘图。只要Applet的显示需要刷新,paint()方法就会被浏览器环境调用。例如,当Applet的显示尺寸发生变化的时候,或浏览器窗口被最小化或被要求以图标方式显示时,这种调用就会发生。
我们应该编写自己的paint()方法,以使它在任何时候被调用,都能正常地工作。对它的调用是异步产生的,且由Applet的运行环境而不是程序来驱动 。
paint()方法带有一个参数,它是java.awt.Graphics类的一个实例。这个参数总是建立该Applet的panel的图形上下文,我们可以用这个图形上下文在Applet中绘图或写入文本。

public void paint(Graphics g)
参数 Graphics
public abstract class Graphicsextends ObjectThe Graphics class is the abstract base class for all graphics contexts that allow an application to draw onto components that are realized on various devices, as well as onto off-screen images.

 
在上面的applet类中增加方法paint即可: -- 显示字符,指定字体字号颜色!
    public void paint(Graphics g)  -- 是Applet从Container类中继承来的方法!g是形参,该方法由applet调用!
    {
        Font f = new Font("楷体_2312",Font.BOLD,30);
        g.setFont(f);
        g.setColor(Color.blue);
        g.drawString("维新科学技术培训中心",0,30);
    }

5.applet从网页中获取信息
正如应用程序可以通过命令行参数来获取信息一样,通过使用param标记,applet可以从网页中获取信息。
网页中增加font参数
<applet code="TestApplet.class" width=600 height=400>
<param name="font" value="DialogInput">
</applet>
用Applet的getParameter()方法 获取网页中的参数!
在init方法中增加:
    String strFont;
    public void init()
    {       
        strFont=getParameter("font");
        System.out.println("init");
    }
然后在paint方法中设置字体时直接用从网页中取得的字体:
        Font f = new Font(strFont,Font.BOLD,30);
--- 提供了便利性,修改网页即可!

6.Applet和用户互动 --- 在Applet上画线
鼠标左键按下--获取了一个点;
松开鼠标--获取另一个点;
API -- java.awt.event.MouseAdapter
方法:
void mousePressed(MouseEvent e)
          Invoked when a mouse button has been pressed on a component.
 void mouseReleased(MouseEvent e)
          Invoked when a mouse button has been released on a component.
MouseEvent类有方法getX,getY;
Component类有方法getGraphics;
Graphics有drawLine方法;

Code:
import java.applet.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class TestApplet extends Applet //Applet必须是public,否则浏览器无法加载
{
    String strFont;
    int xStart, yStart;
    public void init()
    {       
        strFont=getParameter("font");
        addMouseListener(new MouseAdapter() //它是个抽象类
        {
            public void mousePressed(MouseEvent e)
            {
                xStart=e.getX();
                yStart=e.getY();
            }
                  public void mouseReleased(MouseEvent e)
              {
                  Graphics g=getGraphics();  //getGraphics Applet的方法!获得图形上下文
                  g.setColor(Color.red);
                  g.drawLine(xStart,yStart,e.getX(),e.getY());
              }
        }); //匿名内部类实现所注册的监听器!
        System.out.println("init");
    }
    public void start()
    {
        System.out.println("start");
    }
    public void stop()
    {
        System.out.println("stop");
    }
    public void destroy()
    {
        System.out.println("destroy");
    }
    public void paint(Graphics g)  //调用applet时候会产生一个Graph类型的对象
    {
        //Font f = new Font("楷体_2312",Font.BOLD,30);
        Font f = new Font(strFont,Font.BOLD,30);
        g.setFont(f);
        g.setColor(Color.blue);
        g.drawString("维新科学技术培训中心",0,30);
    }
}
//appletviewer.exe 可以识别以下代码:测试时候用,非常方便!
//<applet code="TestApplet.class" width=600 height=400>
//</applet>
TestApplet.HTML:
<applet code="TestApplet.class" width=600 height=400>
<param name="font" value="DialogInput">
</applet>

7.Applet和浏览器的通信
在浏览器中显示信息
   调用AppletContext接口中的showStatus()方法 -- 在状态栏显示信息,但可能会被覆盖
showDocument():打开新的网页显示信息!
请求浏览器显示指定的网页
   调用AppletContext接口中的showDocument()方法。
Applet有方法可以得到AppletContext:
AppletContext getAppletContext()
          Determines this applet's context, which allows the applet to query and affect the environment in which it runs.
加载过的Applet会被浏览器保存到缓存中重复使用!可以在java控制台中清除!
例子--- 点击applet按钮打开新链接:
    public void init()
    {       
        Button btn=new Button("链接");
        add(btn);
        btn.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                try
                {
                    getAppletContext().showDocument(       //getAppletCon是Applet的方法;
                        new URL("http://www.163.com"),"_blank");
                }
                catch(Exception ex)
                {
                    ex.printStackTrace();
                }               
            }
        });

8.Applet中显示动画
Graphics中的drawImage方法来绘制一个图像;
abstract  boolean drawImage(Image img, int x, int y, ImageObserver observer)     ----      Draws as much of the specified image as is currently available.
-- Image是个抽象类(如何获得对象? -- Applet中提供了一个getImage方法获取image对象);ImageObserver 接口,图像是否可以改变,Applet对象本身也实现了这个接口;
Code for draw a image:
package imagetest;
import java.applet.Applet;
import java.awt.*;
public class ShowImage extends Applet
{
  private Image img;
  public void init()
  {
    img=getImage(getDocumentBase(),"T1.gif");  //参数1:URL
  }
  public void paint(Graphics g)
  {
    g.drawImage(img,0,0,this);  //传入当前Applet对象作为ImageObserver 接口的实现
  }
}
Execute the html:
<applet code="imagetest.ShowImage.class" width=600 height=400>
</applet>

b.动画效果-- 多幅图片

repaint,update方法;

双缓冲技术,提前缓冲下一幅图像;
public Image createImage(int width,
                         int height)Creates an off-screen drawable image to be used for double buffering.

Image.getGraphics()

package imagetest;

import java.applet.Applet;
import java.awt.HeadlessException;
import java.awt.*;
public class ShowImage extends Applet
{
  private Image[] imgs;
  private int totalImages=10;
  private int currentImage;
  public void init()
  {
    imgs=new Image[totalImages];  //创建10个引用
    for(int i=0;i<totalImages;i++)
    {
      imgs[i]=getImage(getDocumentBase(),"T"+(i+1)+".gif");
    }
    //img=getImage(getDocumentBase(),"T1.gif");  //参数1:URL
  }
  public void start()
  {
    currentImage=0;
  }
  public void paint(Graphics g)
  {
    //g.drawImage(img,0,0,this);  //传入当前Applet对象
    g.drawImage(imgs[currentImage],0,0,this);
    currentImage=++currentImage%10;
    try {
      Thread.sleep(500);
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
    repaint();
  }
}

MediaTracker类用来追踪image的载入情况,方法waitForID();

AWT绘图
更新显示由一种被称为AWT线程的独立的线程来完成。这个线程可用来处理与显示更新相关的两种情况。
            第一种情况是显露(exposure),它在首次显示时,或在部分显示已被破坏而必须刷新时出现。显示的破坏可能发生在任何时刻,因此,我们的程序必须能在任意时刻更新显示。
           第二种情况是在程序重画带有新内容的画面时。这种重画可能会要求首先擦除原来的图像。
paint(Graphics g)方法
     当组件第一次显示,或受损的部分需要修复时被调用。除非必要,更新不会完全覆盖整个图形区域,而是严格限制在被破坏的范围内。
repaint()方法
     对repaint()的调用可通知系统:你想改变显示,于是系统将调用paint()。
update(Graphics g)方法
     repaint()实际上产生了一个调用另一方法update()的AWT线程。update方法通常清除当前的显示并调用paint()。update()方法可以被修改,例如:为了减少闪烁可不清除显示而直接调用paint()。

repaint()、 update()和paint() 的关系
 

9.Applet的发布:
将类文件目录连同图片资源文件打成Jar包发布,将html文件和jar文件放到同一目录即可;
html中必须加入标识:
<applet code="imagetest.ShowImage.class" width=600 height=400 archive="imagetest.jar">
</applet>

10.Applet的HTML标记和属性
用于定位的applet属性
⑴width和height:必要的属性,以象素为单位,设定applet的宽度和高度。
⑵align:可选的属性,指定applet对齐的方式。
left:       把applet放在网页左边,后面的文本会移至applet的右边。
right:      把applet放在网页右边,后面的文本会移至applet的左边。
bottom:     把applet的底部与当前行文本底部对齐。
top:        把applet的顶部与当前行顶部对齐。
texttop:    把applet的顶部与当前行文本顶部对齐。
middle:     把applet的中部与当前行基线对齐。
absmiddle:  把applet的中部与当前行中部对齐。
baseline:   把applet的底部与当前行基线对齐。
absbottom:  把applet的底部与当前行底部对齐。
⑶vspace和hspace:可选的属性,指定在applet上/下的象素数目(vspace)和applet两边的象素数目(hspace)。

用于编码的applet属性
⑴code:指定applet类文件的名字。该名字要么是相对于codebase,那么是相对于当前页面。
⑵codebase:可选的属性,告诉浏览器到哪个目录下去寻找类文件。
⑶archive:可选的属性,列出Java存档文件、包含类文件的文件或者applet需要的其它资源。
⑷object:用来指定applet类文件的另外一个方法。
⑸name:可选的属性,页面脚本编写人员希望赋予applet名字属性,这样,在编写脚本的时候,就可以用为该属性指定的名字来代表这个applet。

播放音乐applet:
package imagetest;

import java.applet.*;
import java.awt.HeadlessException;

public class AudioTest extends Applet
{
  private AudioClip ac; //该类有循环播放功能,java.awt.
  public void init()
  {
    ac=getAudioClip(getDocumentBase(),"1.au");
  }
  public void start()
  {
//    play(getDocumentBase(),"1.au");  //非循环播放!
    ac.loop();
  }
  public void stop()
  {
    ac.stop();
  }
}






十. JAVA网络编程

1.网络,协议,IP地址,端口号
-- IP地址相当于公司总机,端口号相当于分机号!


网络体系结构

网络体系结构就是使这些用不同媒介连接起来的不同设备和网络系统在不同的应用环境下实现互操作性,并满足各种业务需求的一种粘合剂,它营造了一种“生存空间” -- 任何厂商的任何产品、以及任何技术只要遵守这个空间的行为规则,就能够在其中生存并发展。
网络体系结构解决异质性问题采用的是分层方法 -- 把复杂的网络互联问题划分为若干个较小的、单一的问题,在不同层上予以解决。
    就像我们在编程时把问题分解为很多小的模块来解决一样。

2.OSI七层协议
对应层不能直接通信!
 
通信实体的对等层之间不允许直接通信。 -- 虚拟通信
各层之间是严格单向依赖。
 上层使用下层提供的服务 - Service user ;
 下层向上层提供服务 - Service provider 。

3.OSI各层所使用的协议
应用层:远程登录协议Telnet、文件传输协议FTP、 超文本传输协议HTTP、域名服务DNS、简单邮件传输协议SMTP、邮局协议POP3等。
传输层:传输控制协议TCP、用户数据报协议UDP。
    TCP:面向连接的可靠的传输协议。-- 数据确认,数据重传机制;
    UDP:是无连接的,不可靠的传输协议。-- 直接向IP地址传送数据;无须确认,实时性比较高!
网络层:网际协议IP、Internet互联网控制报文协议ICMP、Internet组管理协议IGMP。

4.数据封装
一台计算机要发送数据到另一台计算机,数据首先必须打包,打包的过程称为封装。
封装就是在数据前面加上特定的协议头部。

OSI参考模型中,对等层协议之间交换的信息单元统称为协议数据单元(PDU,Protocol Data Unit)。
OSI参考模型中每一层都要依靠下一层提供的服务。
为了提供服务,下层把上层的PDU作为本层的数据封装,然后加入本层的头部(和尾部)。头部中含有完成数据传输所需的控制信息。
这样,数据自上而下递交的过程实际上就是不断封装的过程。到达目的地后自下而上递交的过程就是不断拆封的过程。由此可知,在物理线路上传输的数据,其外面实际上被包封了多层“信封”。
但是,某一层只能识别由对等层封装的“信封”,而对于被封装在“信封”内部的数据仅仅是拆封后将其提交给上层,本层不作任何处理。

5. TCP/IP模型
TCP/IP起源于美国国防部高级研究规划署(DARPA)的一项研究计划--实现若干台主机的相互通信。
现在TCP/IP已成为Internet上通信的工业标准。
TCP/IP模型包括4个层次:(对应OSI层)
应用层    -- 5,6,7
传输层    -- 4
网络层    -- 3
网络接口  -- 1,2层

6.端口
端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区)。应用程序通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应的进程所接收,相应进程发给传输层的数据都通过该端口输出。
端口用一个整数型标识符来表示,即端口号。端口号跟协议相关,TCP/IP传输层的两个协议TCP和UDP是完全独立的两个软件模块,因此各自的端口号也相互独立,端口通常称为协议端口(protocol port) ,简称端口。
端口使用一个16位的数字来表示,它的范围是0~65535,1024以下的端口号保留给预定义的服务。例如:http使用80端口。

7.套接字(socket)的引入
为了能够方便的开发网络应用软件,由美国伯克利大学在Unix上推出了一种应用程序访问通信协议的操作系统调用socket(套接字)。socket的出现,使程序员可以很方便地访问TCP/IP,从而开发各种网络应用的程序。
随着Unix的应用推广,套接字在编写网络软件中得到了极大的普及。后来,套接字又被引进了Windows等操作系统中。Java语言也引入了套接字编程模型。

8.基于TCP的socket编程 -- 双方必须就需,等待通信

 
服务器程序编写:
①调用ServerSocket(int port)创建一个服务器端套接字,并绑定到指定端口上;②调用accept(),监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字。③调用Socket类的getOutputStream()和getInputStream获取输出流和输入流,开始网络数据的发送和接收。④最后关闭通信套接字。
客户端程序编写:
①调用Socket()创建一个流套接字,并连接到服务器端; ②调用Socket类的getOutputStream()和getInputStream获取输出流和输入流,开始网络数据的发送和接收。 ③最后关闭通信套接字。
套接字是作为通信链路的端点,看做电话机!

网络编程:java.net
服务器端和客户端:
ServerSocket
Socket
静态类InetAddress有方法:
getByName()
getLocalHost()
-- 获取IP地址

package lesson10;

import java.net.*;
import java.io.*;
public class Lesson10 {

    public static void main(String[] args) {

        if (args.length>0)
        {
            server();
        }
        else
        {
            client();
        }
    }
    public static void server()
    {
        try{
            ServerSocket ss = new ServerSocket(6000);
            Socket s = ss.accept();
            OutputStream s = s.getOutputStream();
            InputStream is = s.getInputStream();
            os.write("Hello, welcome you!".getBytes());
            byte[] buf = new byte[100];
            int len = is.read(buf);
            System.out.println(new String(buf,0,len));
            os.close();
            is.close();
            ss.close();
            s.close();
        }
        catch (Exception ex){
            ex.printStackTrace();
        }
    }

    public static void client()
    {
        try{
            Socket s = new Socket(InetAddress.getByName(null),6000);  //or "127.0.0.1" or null 都返回本地IP地址;
            OutputStream s = s.getOutputStream();
            InputStream is = s.getInputStream();
            byte[] buf = new byte[100];
            int len = is.read(buf);
            System.out.println(new String(buf,0,len));
            os.write("Hello, this is zhangsan!".getBytes());
            os.close();
            is.close();
            s.close();

        }
        catch (Exception ex){
            ex.printStackTrace();
        }       
    }
}
//虽然写到一个程序中了,但是C/S通信的是进程,只要两边同时运行就可以了!

b. 用多线程方法实现;Server一个,client多线程;

9.基于UDP的socket编程
-- 无须建立连接,有一方必须先启动,否则发送的数据会丢失
-- 接收者:server 先启动; 发送者:client

由DatagramSocket实现UDP -- 数据报套接字
receive(DatagramPacket p) 需构造数据包
send(DatagramPacket p)
构造接收端数据包:
DatagramPacket(byte[] buf, int length)
          Constructs a DatagramPacket for receiving packets of length length.
构造发送端数据包:
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
          Constructs a datagram packet for sending packets of length length to the specified port number on the specified host.
 
接收端程序编写:
①调用DatagramSocket(int port)创建一个数据报套接字,并绑定到指定端口上;②调用DatagramPacket(byte[] buf, int length),建立一个字节数组以接收UDP包 。③调用DatagramSocket类的receive(),接收UDP包。④最后关闭数据报套接字。
发送端程序编写:
①调用DatagramSocket()创建一个数据报套接字; ②调用DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port),建立要发送的UDP包。 ③调用DatagramSocket类的send(),发送UDP包。④最后关闭数据报套接字。

简单的receive和send方法编写:
  public static void recv()
  {
    try {
      DatagramSocket ds=new DatagramSocket(6000);
      byte[] buf=new byte[100];
      DatagramPacket dp=new DatagramPacket(buf,100);
      ds.receive(dp);
      System.out.println(new String(buf,0,dp.getLength()));
      ds.close();
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
  }
    public static void send()
  {
    try {
      DatagramSocket ds=new DatagramSocket();
      String str="Hello,this is zhangsan";
      DatagramPacket dp=new DatagramPacket(str.getBytes(),str.length(),
                                           InetAddress.getByName("localhost"),
                                           6000);
      ds.send(dp);
      ds.close();
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
  }

接收端给发送端回复一个信息: -- 也需要知道发送端的地址和端口
  public static void recv()
  {
    try {
      DatagramSocket ds=new DatagramSocket(6000);
      byte[] buf=new byte[100];
      DatagramPacket dp=new DatagramPacket(buf,100);
      ds.receive(dp);
      System.out.println(new String(buf,0,dp.getLength()));
      String str="Welcome you!";  //回复信息
//receive dp后通过getAddress(),getPort()就能得到发送端的地址和端口 -- 端口是OS任意分配的一个!
      DatagramPacket dpSend=new DatagramPacket(str.getBytes(),str.length(),
                                           dp.getAddress(),dp.getPort());
      ds.send(dpSend); //发送数据包
      ds.close();
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
  }
  public static void send()
  {
    try {
      DatagramSocket ds=new DatagramSocket();
      String str="Hello,this is zhangsan";
      DatagramPacket dp=new DatagramPacket(str.getBytes(),str.length(),
                                           InetAddress.getByName("localhost"),
                                           6000);
      ds.send(dp);
      byte[] buf=new byte[100]; //用来接收数据包: 以下三行
      DatagramPacket dpRecv=new DatagramPacket(buf,100);
      ds.receive(dpRecv);
      System.out.println(new String(buf,0,dpRecv.getLength()));
      ds.close();
    } //第一次发送成功后相当于建立了一个虚连接,可以发送和接收数据;
    catch (Exception ex) {
      ex.printStackTrace();
    }
  }

URL与URI
URL(Uniform. Resource Locator ),通用资源定位符。<http://www.mybole.com.cn/index.asp>就是一个URL。
URI(Uniform. Resource Identifier),通用资源标识符。
URI纯粹是个符号结构,用于指定构成Web资源的字符串的各个不同部分。URL是一种特殊类型的URI,它包含了用于查找某个资源的足够信息。其它的URI,例如:mailto:myoble@mybole.com.cn则不属于定位符,因为它里面不存在根据该标识符来查找的任何数据。这种URI称为URN(通用资源名)。
在Java库中,URI类不包含用于访问通用资源标识符设定的任何方法,它的唯一作用是进行分析。相反,URL类则可以打开到达资源的一个字符串。

Class URLConnection
The abstract class URLConnection is the superclass of all classes that represent a communications link between the application and a URL.

Download程序:

package lesson10;

import java.net.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
public class Download
{
  public static void main(String[] args)
  {
    JFrame. jf=new JFrame("维新下载程序");
    jf.setSize(600,400);
    jf.setLocation(100,100);
    JPanel p=new JPanel();
    JLabel l=new JLabel("Please input URL:");
    final JTextField tf=new JTextField(30);
    p.add(l);
    p.add(tf);
    jf.getContentPane().add(p,"North");
    final JTextArea ta=new JTextArea();
    jf.getContentPane().add(ta,"Center");
    JButton btn=new JButton("Download");
    jf.getContentPane().add(btn,"South");//以上制作界面
    btn.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            String str=tf.getText(); //取得文本框中输入的内容来创建URL对象;
            try {
              URL url=new URL(str);
              URLConnection urlConn=url.openConnection(); //该URL方法返回一个URLConnection的对象!
              String line=System.getProperty("line.separator");  //系统无关的换行符!!!
              ta.append("Host: "+url.getHost());          //将URL信息显示到文本区
              ta.append(line);    //行分隔符!
              ta.append("Port: "+url.getDefaultPort());
              ta.append(line);
              ta.append("ContentType: "+urlConn.getContentType()); //目标类型
              ta.append(line);
              ta.append("ContentLength: "+urlConn.getContentLength());
              InputStream is=urlConn.getInputStream();  //Returns an input stream that reads from this open connection.
              //InputStreamReader isr=new InputStreamReader(is); //由于读取的是文本文件,定义个字符流!
              //BufferedReader br=new BufferedReader(isr);       //提高效率
              FileOutputStream fos=new FileOutputStream("1.html");  //保存到本地硬盘
              //String strLine;
              //while((strLine=br.readLine())!=null)    //按行写入本地文件;不会读取行分隔符
              int data;
              while((data=is.read())!=-1)   //读取数据文件(如图片)时,用字节流;
              {
//                fos.write(strLine.getBytes());
  //              fos.write(line.getBytes());  //补上行分隔符!
                fos.write(data);   //写入字节,一个字节一个字节地读、写!
              }
              //br.close();
              is.close();
              fos.close();
            }
            catch (Exception ex) {
              ex.printStackTrace();
            }

          }
        });
    jf.addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent e) {
           System.exit(0);
         }
       });
    jf.show();
  }
}















TAG: java 孙鑫

 

评分:0

我来说两句

日历

« 2024-03-10  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 6136
  • 日志数: 8
  • 建立时间: 2007-11-18
  • 更新时间: 2009-03-27

RSS订阅

Open Toolbar