﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-javaboys-文章分类-j2se</title><link>http://www.blogjava.net/javaboys/category/21161.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 01 Apr 2007 17:05:13 GMT</lastBuildDate><pubDate>Sun, 01 Apr 2007 17:05:13 GMT</pubDate><ttl>60</ttl><item><title>[转] 技术交流:QuickTime流媒体和Java(图) </title><link>http://www.blogjava.net/javaboys/articles/107799.html</link><dc:creator>javaboys</dc:creator><author>javaboys</author><pubDate>Sun, 01 Apr 2007 10:22:00 GMT</pubDate><guid>http://www.blogjava.net/javaboys/articles/107799.html</guid><wfw:comment>http://www.blogjava.net/javaboys/comments/107799.html</wfw:comment><comments>http://www.blogjava.net/javaboys/articles/107799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javaboys/comments/commentRss/107799.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaboys/services/trackbacks/107799.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<a href="http://blog.csdn.net/renco/archive/2005/11/16/530469.aspx">
						<img height="13" src="http://blog.csdn.net/images/authorship.gif" width="15" border="0" /> 技术交流:QuickTime流媒体和Java(图)</a>
		</div>
		<div class="postText">这并不是即将问世的QuickTime for Java book一书的摘录，虽然我希望是的。<br />　　<br />　　你看，问题是，在QTJ世界中大多数的我们都一直假定QTJ中的流媒体API已经损坏，我并不是想为此事而掩盖什么。好的，我继续来通过各种各样的人通过不同的技术进行工作的掩盖获取去这样做，但是我不想再来一次。此外，流媒体冲突的情况似乎特别的糟糕。没有人能得到它的演示代码工作方式――this post to the quicktime-java list 是令许多用户对获取苹果公司的AudioBroadcaster 和DrawableBroadcaster 演示工作方式绝望的典型。让事情更糟糕，演示之一依靠一个在QTJ 6.1版本中作为退回到原始的GUI提供的已经被取消的GUI预览组件类，提供组件只对Movies ，MovieControllers 和GraphicsImporters ，而不是流式的Presentations ，视频捕捉，或者某些图形美好得像来自多种资源“合成”制作。所以，官方给出的演示它首先看起来是不会工作，和现在的关键类有冲突（如果在Java 1.4中运行会抛出RuntimeExceptions异常）。预测实际的流式内容和QTJ 6.1看上去会非常糟糕。<br />　　<br />　　令我欣喜，甚至是有点吃惊的是，有报道称流媒体能够在QTJ 6.1中工作。在本文章中，我将介绍通过QTJ实现简单的网络广播的基础<br />　　<br />　　<b>需求</b><br />　　<br />　　QuickTime的流媒体API，在Java中由只可在Mac OS（Classic和OS X）中运行的包quicktime.streaming声明。在QTJ中存在Windows版本的类，但是它们却不能工作。但是，你可以使用Windows版本的QuickTime作为流媒体的客户端，如果在Java中运行并不是关键的，你可获取Darwin Streaming Server，一个开源项目可在Windows 2000 Server 和2003 Server上运行如同在Solaris 9 和 Red Hat Linux 9上一样。<br />　　<br />　　使用QuickTime流媒体最简单的事情就是我在此说明的生动内容。你需要至少一个音频输入设备，如一个内置的麦克风或者一个耳机。当然，拥有一个QuickTime支持的摄像机，如一个iSight，将会更让人印象深刻。<br />　　<br />　　<b>Streaming 是什么，不是什么</b><br />　　<br />　　给出了术语“流”的含义并不容易明确术语“Streaming ”的正确含义。例如，QuickTime长期支持一种“快速启动”的特征――如果QuickTime明确拥有足够的开始播放的资源并且不会用完目前下载速率下的资源一段录像能开始播放――那是一些用户将Streaming 的一种形式弄错了。自然的，这有它自己的优势：容易创建并且确保了所有的包都到达了客户端。但是真正的 Streaming ，换句话说，Streaming 符合Internet工程工作小组（IETF）的标准，这是一个完全不同的问题，直到QuickTime 5才被支持，并且直到QTJ 6才支持Java。<br />　　<br />　　Streaming 的形式允许服务器控制传输，但很难在实时中保证最优化运行。客户端未下载潜在的大文件，这样的方法是独特的便利的直接广播。事实上，QuickTime的流媒体使用两种“实时”的流媒体传输协议：实时传输协议(RTP)来传输媒体数据包，实时流协议(RTSP)用于控制信息。RTP使用潜在的有损UDP连接，所以所有的人都有意的忍耐再传输期间的包的丢失。这就意味着客户端需要友好的操作未获取所有数据的视频帧或者音频例子。更好的方法是通过基于TCP/IP的连接，它可以使用不确定的重试（也会因此需要一个不确定的时间）来获取丢失的包。<br />　　<br />　　<b>Presentation和SDP文件</b><br />　　<br />　　在QuickTime中，流媒体传输等同一个电影――一个电影可以有音轨和视轨，一个元数据的聚集将它们全都联系在一起，此表示会将一些多种的音频和视频流的元数据联系起来。音频和视频你非常喜欢的流媒体种类也是值得关注的，自从某些其他的媒体类型（sprites，Flash内容）被QuickTime支持后并没有操作好失去的包，并不适合作为流媒体传播。<br />　　<br />　　你可能被建议去建立一个流媒体，你会需要创建一个Presentation 并开始它。但是现在呢？最普遍的这样做的方法是创建一个会话描述协议（SDP）文件，将其放入静态工厂方法Presentation.fromFile()。SDP文件以一种适当的简单的文本格式，由RFC 2327和several updates所定义。我发现这些都是早期的理论而不是实际操作，但是稍后让我们担心的是执行详细信息。这是一个被一些Apple的流媒体使用的例子，在Tim Monroe的QuickTime Toolkit Volume Two中：<br />　　<br />　　v=0<br />　　c=IN IP4 224.2.1.2/20/1<br />　　m=audio 1000 RTP/AVP 12<br />　　m=video 2000 RTP/AVP 101<br />　　a=rtpmap:101 H263-1998<br />　　<br />　　以下是每一行的解释：<br />　　<br />　　·v=0：这是SDP的版本号。在这里版本号是0表示在SDP中没有次要的号码。<br />　　·c=IN IP4 224.2.1.2/20/1：这是提供在描述中使用的连接的信息。IN IP4 表示是一个IPv4的网络地址。224.2.1.2是地址（注意这是一个多点传输地址，所有许多的客户端能连接到广播），20是存在时间，1是临近使用的多点传输地址的数量。<br />　　·m=audio 1000 RTP/AVP 12：m=这一行定义了用于广播的流媒体。在这里明显的是audio，发送经由到RTP到端口1000。12在简单的QCELP音频中定义了有效负载类型。这些在RFC 3551中定义了。<br />　　·m=video 2000 RTP/AVP 101：这一媒体行定义了一个video媒体流，由RTP传输到端口2000。有效负载类型为95，所以使用101表示在原始的RFC中视频格式没有给出负载类型，在SDP中替换它会被映射到一个众所周知的常量中。<br />　　·a=rtpmap:101 H263-1998：这个完成键入在前一行指出的动态负载。使用此类型，你会使用一个在96和127之间的值（本例中是101），然后用一个字符串命名此负载类型（H263-1998）。<br />　　<br />　　这当然好，但是当在我的例程序中使用它的时候，我只获得了一个视频流却没有声音。所以，我使用了一个很不同的SDP，最初在QTJ的DrawableBroadcaster演示中出现。是的，他们不赞同这么做：<br />　　<br />　　m=audio 2656 RTP/AVP 96<br />　　c=IN IP4 239.60.60.60<br />　　a=rtpmap:96 x-qt<br />　　m=video 2700 RTP/AVP 96<br />　　a=rtpmap:96 x-qt<br />　　<br />　　这里最大的不同就是音频和视频都使用了相同的动态负载映射，这并不是针对一个真正的编码器，而是一般的x-qt。在这里胜利的是你能在运行时间上挑选任一QuickTime的音频和视频编码器，而不是在SDP文件中强迫导致。底侧是这些可以不是由非QuickTime客户端可分析的，反之使用十分标准的和/或者旧的编码器并且在SDP中指定他们使它更像其他的客户端（Real, JMF等）能够操作你的系统。<br />　　<br />　　这就是你的SDP文件。现在不要加入一个Presentation。<br />　　<br />　　<b>创建Presentation</b><br />　　<br />　　我们的流媒体服务器程序调用LittleBroadcast，这并没有多少代码，只有不过140行。在本文中，我将一步一步的进行，解释一般的部分，但提供其全部的清单。在后面的Resources章节中有可用到一个.tar.gz文件，连同SDP文件和一个Ant构建文件。<br />　　<br />　　package com.mac.invalidname.qtjstreaming;import quicktime.*;<br />　　import quicktime.std.*;<br />　　import quicktime.util.*;<br />　　import quicktime.qd.*;<br />　　import quicktime.io.*;<br />　　import quicktime.streaming.*;<br />　　import quicktime.app.time.*;<br />　　import java.io.*;import java.awt.*;<br />　　import java.awt.event.*;<br />　　public class LittleBroadcast extends Tasking implements ActionListener {<br />　　<br />　　这是一长串典型的引入QuickTime，包括了使用其QDGraphics来提供一个摄像机画面以外的图形界面的qd，读取SDP文件的io，用于流媒体API的streaming，以及获得给予Presentation运行时间的有效任务的time。最后一点，注意该类扩展直Tasking――提供周期性调用的task()。本应用程序中，它用于不断的调用Presentation的idle()方法，并使其循环工作。你在本书中学习到也就是Movies所需要的，但是此任务几乎一直都自动的为你所操作。使用Presentation并不好运。（或者为此事而捕获，但有些离开本主题了。）<br />　　<br />　　boolean broadcasting = false;　　public static final int BROADCAST_WIDTH = 176;　　public static final int BROADCAST_HEIGHT = 144;　　Button startStopButton;　　Button configButton;　　Presentation pres;　　int presenterTimeScale = 600;<br />　　<br />　　这些是服务器的实例变量。是一个用于指定当开始/停止按钮按下的时候做什么的标记。下面是一对广播视频大小的常量，紧跟着是服务器GUI的按钮。最后是一个Presentation对象，以及它的时间尺度。（媒体的保持时间系统，一个600的时间尺度表示一秒种里有600个单位；600也是QuickTime中默认的。）<br />　　<br />　　public static void main (String[] args) {<br />　　System.out.println ("main");<br />　　try {<br />　　QTSession.open();<br />　　new LittleBroadcast();<br />　　} catch (QTException qte) {<br />　　qte.printStackTrace();<br />　　}<br />　　}<br />　　<br />　　在这个main中并没有什么独特的地方。我投入了所有的精力在构造函数上以防止为那些我需要的实例创建一个内部类。如果你扩展本代码，你可能会发现这很有用。<br />　　<br />　　public LittleBroadcast() throws QTException {<br />　　System.out.println ("LittleBroadcast constructor");<br />　　QTFile file = new QTFile (new File ("little.sdp"));<br />　　try {<br />　　MediaParams mediaParams = new MediaParams();<br />　　mediaParams.setWidth (BROADCAST_WIDTH);<br />　　mediaParams.setHeight (BROADCAST_HEIGHT);<br />　　QDGraphics myGWorld =<br />　　new QDGraphics (new QDRect (<br />　　BROADCAST_WIDTH, BROADCAST_HEIGHT));<br />　　mediaParams.setGWorld (myGWorld);<br />　　PresParams presParams =<br />　　new PresParams( presenterTimeScale,<br />　　QTSConstants.kQTSSendMediaFlag |<br />　　QTSConstants.kQTSAutoModeFlag |<br />　　QTSConstants.kQTSDontShowStatusFlag,<br />　　mediaParams );<br />　　pres = Presentation.fromFile(file, presParams );<br />　　<br />　　构造函数的第一事是装载名为little.sdp的SDP文件。 但这并不是所有的都需要创建Presentation ――在调用Presentation.fromFile()的时候需要服务器应用程序设置一些必要的参数。首先,你要创建一个MediaParams对象,这样你能设置视频的高度和宽度。您必须做的其它重要事是提供照相机一个图形界面,由QDGraphics创建MediaParams设置。是的, 名字是古怪的, 因为QTJ 设计员想注重与AWT Graphics对象的相似性, 但得到或设置这样的对象的用途的所有方法是使用其本地API名字, GWorld。 最后, 你为所有的Presentation创建一个PresParams来设置参数。 这采取一个有些任意的时标, 一些算术上的行为标记彼此OR'ed, 以及MediaParams。 可能的行为标记, 都被定义在QTSConstants, 包括:<br />　　<br />　　·KQTSAutoModeFlag: 都使用默认值。 最重要地, 这些使用默认值Sourcer, Presentation的来源,是从各种各样的输入装置执行获取的SequenceGrabber。 它还可能播放一个在磁盘上或是任意目录下的的QuickTime 文件; 稍后我将探讨这些问题。<br />　　<br />　　·KQTDontShowStatusFlag: 不要创建一个会导致连接数和状态信息总被显示在客户端的流媒体状态处理程序。<br />　　<br />　　·KQTSSendMediaFlag:发送，不接收数据。<br />　　<br />　　·KQTSReceiveMediaFlag：接收，不发送数据。<br />　　<br />　　在SDP文件说明, 参数, 以及GWorld 设置下, 创建Presentation和Presentation.fromFile()。<br />　　<br />　　// find audio stream　　　　　　Stream audioStream = null;<br />　　for (int i=1; i&lt;=pres.getNumStreams(); i++) {<br />　　System.out.println ("stream: " + i + ": " +<br />　　pres.getIndStream(i));<br />　　Stream aStream = pres.getIndStream (i);<br />　　if (pres.hasCharacteristic(aStream,<br />　　StdQTConstants.audioMediaCharacteristic)) {<br />　　audioStream = aStream;<br />　　break;<br />　　}<br />　　}<br />　　System.out.println ("audioStream = " + audioStream);<br />　　pres.setVolumes (audioStream, 100, 100);<br />　　System.out.println ("created presentation, gworld == " +<br />　　pres.getGWorld() + ", size == "+<br />　　mediaParams.getWidth() + "x" +<br />　　mediaParams.getHeight() + ", streams == " +<br />　　pres.getNumStreams());<br />　　<br />　　//*******这不是真正地必要的, 但它将告诉你怎么通过Presentation游览来挑选各自的流媒体。 Presentation.getIndStream 会由索引返回一个Stream(附注QuickTime 索引都是基于1)。它重复这些audioMediaCharacteristic 请求查找音频流 (对于录影, 您就要请求visualMediaCharacteristic) 。 这个实例在audioStream上为左右声道设置音量最大值为100。<br />　　<br />　　最后, println从Presentation和MediaParams转存一些有意义的元数据。<br />　　<br />　　<b>配置Presentation</b><br />　　<br />　　SettingsDialog sd = new SettingsDialog (pres);<br />　　System.out.println ("Did settings");<br />　　pres.preroll();<br />　　broadcasting = false;<br />　　<br />　　这是设置presentation最后的步骤。 SettingsDialog存在用户以输入装置选择的音频和视频 (二个流媒体SDP 文件被指定在Presentation中) 。每个流媒体都可由一个压缩格式来定制 (MPEG-4, Sorenson Video 3, H.263, 等) 以及一个分包器(有时由压缩格式定义; 可观察它是否随着压缩格式的改变而自动改变) 。 这个GUI实例显示在图1 。<br />　　 
<center>　<img style="WIDTH: 351px; HEIGHT: 224px" height="104" src="http://www.chinaitlab.com/www/imgfiles/2005.11.14.13.58.46.7.1.jpg" width="152" /><br />　　图像1. 为一个Presentation SettingsDialog</center><br />　　<br />　　在此图中, 音频默认为计算机连线输入。更改它为iSight, 您需要点击Source按钮,提出的可选设备列表显示在图2上 。<br />　　 
<center>　<img alt="" src="http://www.chinaitlab.com/www/imgfiles/2005.11.14.13.58.56.7.2.jpg" /><br />　　图2. 来源选择对话框</center><br />　　<br />　　最后就是调用Presentation.preroll(), 如同Movie.preroll(), 提供Presentation一个机会预先分配资源以及准备好开始流媒体Presentation。<br />　　<br />　　<b>提供一个控制GUI</b><br />　　<br />　　// Make monitor window<br />　　startStopButton = new Button ("Start");<br />　　configButton = new Button ("Configure");<br />　　startStopButton.addActionListener (this);<br />　　configButton.addActionListener (this);<br />　　Frame monitorFrame = new Frame ("QTJ Streaming");<br />　　monitorFrame.setLayout (new BorderLayout());<br />　　Panel buttonPanel = new Panel();<br />　　buttonPanel.add (startStopButton);<br />　　buttonPanel.add (configButton);<br />　　monitorFrame.add (buttonPanel, BorderLayout.SOUTH);<br />　　monitorFrame.pack();<br />　　monitorFrame.setVisible(true);<br />　　<br />　　这个为控制和配置Presentation设置了很小的GUI,提供基本的一个起始/停止键和一个配置按钮。 按钮作为一个ActionListener提交给this, 意味着这个类将需要提供一个actionPerformed方法来处理按钮点击。 控制GUI 的屏幕截图显示在图3 。<br />　　 
<center>　<img alt="" src="http://www.chinaitlab.com/www/imgfiles/2005.11.14.13.59.4.7.3.jpg" /><br />　　图3. 监控/控制窗体</center><br />　　<br />　　在这点上你也许会问一个有趣的问题: "从什么时候我们开始关心使用GUI提供server?"据推测, 这是从Classic Mac OS开始的一个传统, 它没有一个用命令行启动和传递参数的程序。但此外, 你通常会希望提供一个流媒体数据的预览, 并且如果您有一个预览视窗, 为什么会也没有一个配置的GUI?<br />　　<br />　　无论如何, 这是大概的讨论, 因为QTJ 6.1 不提供您能使用来预览的一个AWT Component。在有些方面有希望的是, QTFactory将得到一个新的超负荷为采用一个Presentation并且返回一个显示流媒体视频的Component的makeQTComponent。 它大概可能使用一些QuickDraw voodoo而完全放弃Java的东西。 如果,在各task()中回调(参见下面) 您采取GWorld被及早创建, 转换它成Pict, 并且作为一份唯一命名的文件, 您会看见每一个都是不同的, 意味GWorld每次都得到新数据。 所以如果您替换掉GWorld, 改为能给AWT Component在各通道上定义象素, 您会有银幕上的预览。何人有胆量如此做? 在quicktime-java list上查看。<br />　　<br />　　<b>详细资料</b><br />　　<br />　　// add shutdown handler to make sure presentation<br />　　// gets stopped<br />　　Thread presentationStopper = new Thread() {<br />　　public void run() {<br />　　try {<br />　　pres.stop();<br />　　} catch (QTException qte) {}<br />　　}<br />　　};<br />　　Runtime.getRuntime().addShutdownHook (presentationStopper);<br />　　<br />　　这个关闭异常分支确定Presentation在程序退出之前被终止。 这是重要的原因, 象SequenceGrabber, Presentation愉快继续运行在您的应用程序退出之后,绑定一个端口,严重的循环, 使用您的获取设备保留其它应用程序, 等。<br />　　} catch ( QTException e ) {<br />　　e.printStackTrace();<br />　　System.exit (-1);<br />　　}<br />　　}<br />　　<br />　　最后, 构造函数捕捉并抛出所有的QTExceptions。<br />　　public void actionPerformed (ActionEvent ae) {<br />　　System.out.println ("actionPerformed");<br />　　try {<br />　　if (ae.getSource() == startStopButton) {<br />　　if (broadcasting) {<br />　　pres.stop();<br />　　stopTasking();<br />　　broadcasting = false;<br />　　startStopButton.setLabel ("Start");<br />　　System.out.println ("Stopped");<br />　　} else {<br />　　pres.start();<br />　　startTasking();<br />　　broadcasting = true;<br />　　startStopButton.setLabel ("Stop");<br />　　System.out.println ("Started");<br />　　}<br />　　} else if (ae.getSource() == configButton) {<br />　　new SettingsDialog (pres);<br />　　}<br />　　} catch (QTException qte) {<br />　　qte.printStackTrace();<br />　　}<br />　　}<br />　　<br />　　这是非常直接的处理起始/终止和设置按钮。如果点击的按钮是起始/终止, 设置GUI 就会调用在Presentation上的 start() 或stop(), 开始或停止正在执行的任务 (定期回调这个类的task()方法), 为下按钮点击目的设置broadcasting标志, 并且更改按钮标签。如果用户点击了配置, 它生成为Presentation新的SettingsDialog。<br />　　<br />　　public synchronized final void task() throws QTException {<br />　　pres.idle(null);<br />　　}}<br />　　<br />　　最后的这个方法实现了继承自Tasking的task()方法并且被在操作开始按钮调用startTasking()后定时的调用。使用简单的调用Presentation.idle(), 它提供了表达时间来从获取设备取得当前数据，对其编码并传输流出去。<br />　　<br />　　运行流媒体客户端<br />　　<br />　　最简单的使客户机看广播的方法是使用QuickTime 播放器打开服务器使用并创建Presentation的同样SDP 文件。这将调用SDP 输入程序连接到流媒体并且开始分析这些内容。注意客户机和服务器不能在同一台机器上, 明显地因为服务器为使用表示而占用端口, 拒绝客户机对这些端口的使用。 图4 显示在我的计算机上的流媒体的外观(那是正在播放我的Macross和Escaflowne玩具) 。<br />　　 
<center>　<img alt="" src="http://www.chinaitlab.com/www/imgfiles/2005.11.14.13.59.13.7.4.jpg" /><br />　　图4. QuickTime流媒体客户端</center><br />　　<br />　　如果您使用QuickTime 播放器, 您能使用其得到信息指令显示两种流媒体以及他们的格式。 在表5, 您能看有二种媒体: 一条未压缩的44.1kHz 音频流, 和一条H.263 的视频流。<br />　　 
<center>　<img alt="" src="http://www.chinaitlab.com/www/imgfiles/2005.11.14.13.59.24.7.5.jpg" /><br />　　图5. 客户端信息窗体</center><br />　　<br />　　<b>结语</b><br />　　<br />　　对我来说,播放基于Java的QuickTime流媒体比想象的容易多了。 最简单的例子, 从获取设备播放, 只需要少于150 个代码行。 显然, 最困难的部份是了解SDP文件, 它被证明是非常的过分讲究并且它的说明文件包含大量应用程序级别程序员不会有的知识。同样不幸的是，QTJ不再提供预览组件, 但也许在将来会提供, 以及一小段的GWorld/QuickDraw 堆砌也许会在将来制造出这样的组件。<br />　　<br />　　本文只包括怎么为实时获取数据设置广播。其它可利用的Sourcers, 譬如来自磁盘或任意目录种的那些广播QuickTime 文件, 将会在以后的部分中讨论。<br /><br /><p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=530469</p><br /></div>
<img src ="http://www.blogjava.net/javaboys/aggbug/107799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaboys/" target="_blank">javaboys</a> 2007-04-01 18:22 <a href="http://www.blogjava.net/javaboys/articles/107799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 网络文件传输</title><link>http://www.blogjava.net/javaboys/articles/107798.html</link><dc:creator>javaboys</dc:creator><author>javaboys</author><pubDate>Sun, 01 Apr 2007 10:19:00 GMT</pubDate><guid>http://www.blogjava.net/javaboys/articles/107798.html</guid><wfw:comment>http://www.blogjava.net/javaboys/comments/107798.html</wfw:comment><comments>http://www.blogjava.net/javaboys/articles/107798.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javaboys/comments/commentRss/107798.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaboys/services/trackbacks/107798.html</trackback:ping><description><![CDATA[
		<script><![CDATA[unction StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}]]&gt;</script>
 
<div class="post"><div class="postTitle"><a href="http://blog.csdn.net/hxcfindjob/archive/2005/02/06/283322.aspx"><img height="13" src="http://blog.csdn.net/images/authorship.gif" width="15" border="0" /><font color="#551188" size="2"> Java 网络文件传输</font></a></div><div class="postText"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">Java </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">网络文件传输</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">读者范围</span><span lang="EN-US">:</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本文是一篇简短入门文章</span><span lang="EN-US">.</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本文假设读者对</span><span lang="EN-US">Java</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang="EN-US">IO</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">系统和</span><span lang="EN-US">Java</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的网络系统有所了解</span><span lang="EN-US">.</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">正文</span><span lang="EN-US">:</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关于文件传输的问题</span><span lang="EN-US">,</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实际也是一种</span><span lang="EN-US">IO</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">读写的基本问题</span><span lang="EN-US">.</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对于网络而言也是一种</span><span lang="EN-US">IO</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">读写问题</span><span lang="EN-US">.</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">因此所谓网络的文件传输实际是两种</span><span lang="EN-US">IO</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">问题的综合讨论</span><span lang="EN-US">.</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这里我们首先分析一个图示</span><span lang="EN-US">.</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">然后围绕这个图示来讨论</span><span lang="EN-US">:</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">图</span><span lang="EN-US">1:</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">分析图</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们基本可以知道从服务器文件系统中通过流把文件中的数据写入到服务器的进程中</span><span lang="EN-US">,</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">然后把进程中的数据通过网络</span><span lang="EN-US">IO</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">系统传递到客户机</span><span lang="EN-US">,</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个阶段</span><span lang="EN-US">,</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">网络中的数据以字节流的形式保存</span><span lang="EN-US">.</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当该字节流被客户进程接受后</span><span lang="EN-US">,</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">客户进程通过客户本地文件流写入客户本地的文件系统中</span><span lang="EN-US">.</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">根据以上分析</span><span lang="EN-US">,</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们基本可以确定我所需要处理的问题了</span><span lang="EN-US">.</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先我们需要可以对本地文件系统</span><span lang="EN-US">IO</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">操作的操作接口</span><span lang="EN-US">,</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">然后是一个可以对网络</span><span lang="EN-US">IO</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">系统进行操作的操作接口</span><span lang="EN-US">,</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">已经一个可以把数据包装成字节流的操作接口</span><span lang="EN-US">,</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">他们分别可以提供客户和服务器两个进程进行读写的操作</span><span lang="EN-US">.</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如下图所示</span><span lang="EN-US">:</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">图</span><span lang="EN-US">2:</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">根据以上分析</span><span lang="EN-US">,</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们可以把问题归结到对以下编程接口的需求上</span><span lang="EN-US">:</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">1.<span style="mso-spacerun: yes">         </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字节包装器和字节解包器</span><span lang="EN-US">,</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">2.<span style="mso-spacerun: yes">         </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">网络传输器和网络接收器</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">3. <span style="mso-spacerun: yes">        </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本地文件读</span><span lang="EN-US">/</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">写器</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes"></span></span> </p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">而这些</span><span lang="EN-US">Java</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本身的</span><span lang="EN-US">API</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就已经提供</span><span lang="EN-US">.</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">他们都被包装到</span><span lang="EN-US">java.io</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US">java.net</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这两个包里</span><span lang="EN-US">,</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这里我提供一个基于</span><span lang="EN-US">TCP/IP</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的实现版本</span><span lang="EN-US">,</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用基于连接的方式来完成工作</span><span lang="EN-US">.</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们首先介绍几个相关的</span><span lang="EN-US">JDK</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的类来完成以上任务</span><span lang="EN-US">,</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">1.<span style="mso-spacerun: yes">       </span>DataOutputStream</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US">DataInputStream</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实现类提供了上面的字节包装和解包器的实现</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">2.<span style="mso-spacerun: yes">       </span>ServerSocket</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US">Socekt</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供了基于连接的网络传输和接受接口</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">3.<span style="mso-spacerun: yes">       </span>File,FileInputStream</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US">FileOutputStream</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供了基本的本地文件输入输出接口</span><span lang="EN-US">.</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes"></span></span> </p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes"></span></span> </p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务器端实现代码</span><span lang="EN-US">:</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">import java.io.*;</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">import java.net.*;</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes"></span></span> </p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">public class FileServer{</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">       </span>public static void main(String[] args)throws Exception{</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>//</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">创建文件流用来读取文件中的数据</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>File file=new File("lishengjie.jpg");</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>FileInputStream fos=new FileInputStream(file);</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>//</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">创建网络服务器接受客户请求</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>ServerSocket ss=new ServerSocket(3108);</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>Socket client=ss.accept();</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">    </span><span style="mso-spacerun: yes">          </span>//</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">创建网络输出流并提供数据包装器</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>OutputStream netOut=client.getOutputStream();</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>OutputStream doc=new DataOutputStream(new BufferedOutputStream(netOut));</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>//</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">创建文件读取缓冲区</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>byte[] buf=new byte[2048];</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>int num=fos.read(buf);</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>while(num!=(-1)){//</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是否读完文件</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">                     </span>doc.write(buf,0,num);//</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">把文件数据写出网络缓冲区</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">                     </span>doc.flush();//</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">刷新缓冲区把数据写往客户端</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">                     </span>num=fos.read(buf);//</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">继续从文件中读取数据</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">         </span><span style="mso-spacerun: yes">     </span>}</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>fos.close();</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>doc.close();</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">       </span>}</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">}</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes"></span></span> </p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">客户方实现代码</span><span lang="EN-US">:</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="FR" style="mso-ansi-language: FR">import java.io.*;<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="FR" style="mso-ansi-language: FR"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="FR" style="mso-ansi-language: FR">import java.net.*;<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="FR" style="mso-ansi-language: FR"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="FR" style="mso-ansi-language: FR"><span style="mso-spacerun: yes"> </span><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="FR" style="mso-ansi-language: FR"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">public class FileClient{</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">       </span>public static void main(String[] args)throws Exception{</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>//</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用本地文件系统接受网络数据并存为新文件</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>File file=new File("newFile.jpg");</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>file.createNewFile();</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>RandomAccessFile raf=new RandomAccessFile(file,"rw");</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>// </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过</span><span lang="EN-US">Socket</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">连接文件服务器</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>Socket server=new Socket(InetAddress.getLocalHost(),3108);</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>//</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">创建网络接受流接受服务器文件数据</span><span lang="EN-US"></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>InputStream netIn=server.getInputStream();</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>InputStream in=new DataInputStream(new BufferedInputStream(netIn));</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>//</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">创建缓冲区缓冲网络数据</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>byte[] buf=new byte[2048];</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>int num=in.read(buf);</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>while(num!=(-1)){//</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是否读完所有数据</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">                     </span>raf.write(buf,0,num);//</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将数据写往文件</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">                     </span>raf.skipBytes(num);//</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">顺序写文件字节</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">     </span><span style="mso-spacerun: yes">                </span>num=in.read(buf);//</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">继续从网络中读取文件</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>}</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>in.close();</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">              </span>raf.close();</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes">       </span>}</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">}</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">归结以上代码</span><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">:<o:p></o:p></span></p><table class="MsoNormalTable" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellspacing="0" cellpadding="0" border="1"><tbody><tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt" valign="top" width="284"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">服务器</span></b><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></b></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" valign="top" width="284"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">客户端</span></b><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></b></p></td></tr><tr style="mso-yfti-irow: 1; mso-yfti-lastrow: yes"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="284"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: list 18.0pt" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-fareast-font-family: 'Times New Roman'">1.</span><span lang="EN-US" style="FONT-SIZE: 7pt; COLOR: black; LINE-HEIGHT: 150%; mso-font-kerning: 0pt; mso-fareast-font-family: 'Times New Roman'">       </span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">服务器从本地文件系统读取文件</span><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: list 18.0pt" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-fareast-font-family: 'Times New Roman'">2.</span><span lang="EN-US" style="FONT-SIZE: 7pt; COLOR: black; LINE-HEIGHT: 150%; mso-font-kerning: 0pt; mso-fareast-font-family: 'Times New Roman'">       </span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">服务器创建网络服务连接</span><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: list 18.0pt" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-fareast-font-family: 'Times New Roman'">3.</span><span lang="EN-US" style="FONT-SIZE: 7pt; COLOR: black; LINE-HEIGHT: 150%; mso-font-kerning: 0pt; mso-fareast-font-family: 'Times New Roman'">       </span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">服务器提供数据包装器</span><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: list 18.0pt" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-fareast-font-family: 'Times New Roman'">4.</span><span lang="EN-US" style="FONT-SIZE: 7pt; COLOR: black; LINE-HEIGHT: 150%; mso-font-kerning: 0pt; mso-fareast-font-family: 'Times New Roman'">       </span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">服务器将本地文件写入数据包装器</span><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: list 18.0pt" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-fareast-font-family: 'Times New Roman'">5.</span><span lang="EN-US" style="FONT-SIZE: 7pt; COLOR: black; LINE-HEIGHT: 150%; mso-font-kerning: 0pt; mso-fareast-font-family: 'Times New Roman'">       </span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">服务器通过包装器写入到网络</span><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="284"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: list 18.0pt" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-fareast-font-family: 'Times New Roman'">1.</span><span lang="EN-US" style="FONT-SIZE: 7pt; COLOR: black; LINE-HEIGHT: 150%; mso-font-kerning: 0pt; mso-fareast-font-family: 'Times New Roman'">       </span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">客户端建立新文件准备存储来自网络的数据</span><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: list 18.0pt" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-fareast-font-family: 'Times New Roman'">2.</span><span lang="EN-US" style="FONT-SIZE: 7pt; COLOR: black; LINE-HEIGHT: 150%; mso-font-kerning: 0pt; mso-fareast-font-family: 'Times New Roman'">       </span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">客户端连接服务器</span><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: list 18.0pt" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-fareast-font-family: 'Times New Roman'">3.</span><span lang="EN-US" style="FONT-SIZE: 7pt; COLOR: black; LINE-HEIGHT: 150%; mso-font-kerning: 0pt; mso-fareast-font-family: 'Times New Roman'">       </span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">客户端通过网络接受服务器数据并进行数据解包</span><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: list 18.0pt" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-fareast-font-family: 'Times New Roman'">4.</span><span lang="EN-US" style="FONT-SIZE: 7pt; COLOR: black; LINE-HEIGHT: 150%; mso-font-kerning: 0pt; mso-fareast-font-family: 'Times New Roman'">       </span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">客户端将数据写入缓冲区</span><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: list 18.0pt" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-fareast-font-family: 'Times New Roman'">5.</span><span lang="EN-US" style="FONT-SIZE: 7pt; COLOR: black; LINE-HEIGHT: 150%; mso-font-kerning: 0pt; mso-fareast-font-family: 'Times New Roman'">       </span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">客户端从缓冲区把数据写入客户本地文件</span><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p></td></tr></tbody></table><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">总结</span></b><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">:<o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-tab-count: 1">    </span></span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">事实上</span><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">java</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">的开发环境为我们提供大多数的编程接口</span><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">,</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">为我们简化了开发工作量</span><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">.</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">我们通过</span><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">java</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">的</span><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">IO</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">接口所提供的文件</span><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">,</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">数据包装器等接口非常方便的解决了我们上面的开发工作量</span><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">.</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">同时在</span><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">java</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">的</span><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">net</span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">接口所提供的套接字也使得基于连接的数据接受和发送成为非常容易的工作</span><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">.<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><br /><br /><p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=283322</p><br /></div></div><img src ="http://www.blogjava.net/javaboys/aggbug/107798.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaboys/" target="_blank">javaboys</a> 2007-04-01 18:19 <a href="http://www.blogjava.net/javaboys/articles/107798.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA 文件操作</title><link>http://www.blogjava.net/javaboys/articles/107660.html</link><dc:creator>javaboys</dc:creator><author>javaboys</author><pubDate>Sat, 31 Mar 2007 09:29:00 GMT</pubDate><guid>http://www.blogjava.net/javaboys/articles/107660.html</guid><wfw:comment>http://www.blogjava.net/javaboys/comments/107660.html</wfw:comment><comments>http://www.blogjava.net/javaboys/articles/107660.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javaboys/comments/commentRss/107660.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaboys/services/trackbacks/107660.html</trackback:ping><description><![CDATA[import java.io.*;<br /><br />public class FileTest{<br />   public FileTest(){<br /><br />}<br />try{<br />File f  = new File("d:\test.txt");<br />FileReader fr = new FileReader(f);<br />BufferedReader br  = new BufferedReader(fr);<br /><br />String line = br.readLine();<br /><br />while(line != null){<br />   System.out.println(line + "\n");<br /><br />  line = br.readLine();<br />}<br /><br />}catch(Exception ex){<br />    System.err.println(ex);<br />}<br />}<img src ="http://www.blogjava.net/javaboys/aggbug/107660.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaboys/" target="_blank">javaboys</a> 2007-03-31 17:29 <a href="http://www.blogjava.net/javaboys/articles/107660.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>