??xml version="1.0" encoding="utf-8" standalone="yes"?>精品亚洲免a,粉嫩av一区二区三区免费观看,欧美一区二区免费视频http://www.aygfsteel.com/javaboys/category/21161.htmlzh-cnSun, 01 Apr 2007 17:05:13 GMTSun, 01 Apr 2007 17:05:13 GMT60[转] 技术交?QuickTime媒体和Java(? http://www.aygfsteel.com/javaboys/articles/107799.htmljavaboysjavaboysSun, 01 Apr 2007 10:22:00 GMThttp://www.aygfsteel.com/javaboys/articles/107799.htmlhttp://www.aygfsteel.com/javaboys/comments/107799.htmlhttp://www.aygfsteel.com/javaboys/articles/107799.html#Feedback0http://www.aygfsteel.com/javaboys/comments/commentRss/107799.htmlhttp://www.aygfsteel.com/javaboys/services/trackbacks/107799.html  技术交?QuickTime媒体和Java(?
qƈ不是卛_问世的QuickTime for Java book一书的摘录Q虽然我希望是的?br />  
  你看Q问题是Q在QTJ世界中大多数的我们都一直假定QTJ中的媒体API已经损坏Q我q不是想为此事而掩盖什么。好的,我l来通过各种各样的h通过不同的技术进行工作的掩盖获取去这样做Q但是我不想再来一ơ。此外,媒体冲H的情况g特别的糟p。没有h能得到它的演CZ码工作方式――this post to the quicktime-java list 是o许多用户对获取苹果公司的AudioBroadcaster 和DrawableBroadcaster 演示工作方式l望的典型。让事情更糟p,演示之一依靠一个在QTJ 6.1版本中作为退回到原始的GUI提供的已l被取消的GUI预览lgc,提供lg只对Movies QMovieControllers 和GraphicsImporters Q而不是流式的Presentations Q视频捕捉,或者某些图形美好得像来自多U资源“合成”制作。所以,官方l出的演C它首先看v来是不会工作Q和现在的关键类有冲H(如果在Java 1.4中运行会抛出RuntimeExceptions异常Q。预实际的式内容和QTJ 6.1看上M非常p糕?br />  
  令我ƣ喜Q甚x有点吃惊的是Q有报道U流媒体能够在QTJ 6.1中工作。在本文章中Q我介l通过QTJ实现单的|络q播的基
  
  需?/b>
  
  QuickTime的流媒体APIQ在Java中由只可在Mac OSQClassic和OS XQ中q行的包quicktime.streaming声明。在QTJ中存在Windows版本的类Q但是它们却不能工作。但是,你可以用Windows版本的QuickTime作ؓ媒体的客户端,如果在Java中运行ƈ不是关键的,你可获取Darwin Streaming ServerQ一个开源项目可在Windows 2000 Server ?003 Server上运行如同在Solaris 9 ?Red Hat Linux 9上一栗?br />  
  使用QuickTime媒体最单的事情是我在此说明的生动内容。你需要至一个音频输入设备,如一个内|的麦克风或者一个x。当Ӟ拥有一个QuickTime支持的摄像机Q如一个iSightQ将会更让h印象深刻?br />  
  Streaming 是什么,不是什?/b>
  
  l出了术语“流”的含义q不Ҏ明确术语“Streaming ”的正确含义。例如,QuickTime长期支持一U“快速启动”的特征――如果QuickTime明确拥有_的开始播攄资源q且不会用完目前下蝲速率下的资源一D录像能开始播䏀―那是一些用户将Streaming 的一UŞ式弄错了。自然的Q这有它自己的优势:Ҏ创徏q且保了所有的包都到达了客L。但是真正的 Streaming Q换句话_Streaming W合Internet工程工作组QIETFQ的标准Q这是一个完全不同的问题Q直到QuickTime 5才被支持Qƈ且直到QTJ 6才支持Java?br />  
  Streaming 的Ş式允许服务器控制传输Q但很难在实时中保证最优化q行。客L未下载潜在的大文Ӟq样的方法是独特的便利的直接q播。事实上QQuickTime的流媒体使用两种“实时”的媒体传输协议:实时传输协议(RTP)来传输媒体数据包Q实时流协议(RTSP)用于控制信息。RTP使用潜在的有损UDPq接Q所以所有的人都有意的忍耐再传输期间的包的丢失。这意味着客户端需要友好的操作未获取所有数据的视频帧或者音频例子。更好的Ҏ是通过ZTCP/IP的连接,它可以用不定的重试(也会因此需要一个不定的时_来获取丢q包?br />  
  Presentation和SDP文g
  
  在QuickTime中,媒体传输等同一个电影――一个电影可以有韌和视轨,一个元数据的聚集将它们全都联系在一P此表CZ一些多U的音频和视频流的元数据联系h。音频和视频你非常喜Ƣ的媒体种cM是值得x的,自从某些其他的媒体类型(spritesQFlash内容Q被QuickTime支持后ƈ没有操作好失ȝ包,q不适合作ؓ媒体传播?br />  
  你可能被d立一个流媒体Q你会需要创Z个Presentation q开始它。但是现在呢Q最普遍的这样做的方法是创徏一个会话描q协议(SDPQ文Ӟ其攑օ静态工厂方法Presentation.fromFile()。SDP文g以一U适当的简单的文本格式Q由RFC 2327和several updates所定义。我发现q些都是早期的理不是实际操作,但是E后让我们担心的是执行详l信息。这是一个被一些Apple的流媒体使用的例子,在Tim Monroe的QuickTime Toolkit Volume Two中:
  
  v=0
  c=IN IP4 224.2.1.2/20/1
  m=audio 1000 RTP/AVP 12
  m=video 2000 RTP/AVP 101
  a=rtpmap:101 H263-1998
  
  以下是每一行的解释Q?br />  
  ·v=0Q这是SDP的版本号。在q里版本h0表示在SDP中没有次要的L?br />  ·c=IN IP4 224.2.1.2/20/1Q这是提供在描述中用的q接的信息。IN IP4 表示是一个IPv4的网l地址?24.2.1.2是地址Q注意这是一个多点传输地址Q所有许多的客户端能q接到广播)Q?0是存在时_1是͘q用的多点传输地址的数量?br />  ·m=audio 1000 RTP/AVP 12Qm=q一行定义了用于q播的流媒体。在q里明显的是audioQ发送经由到RTP到端?000?2在简单的QCELP音频中定义了有效负蝲cd。这些在RFC 3551中定义了?br />  ·m=video 2000 RTP/AVP 101Q这一媒体行定义了一个video媒体,由RTP传输到端?000。有效负载类型ؓ95Q所以?01表示在原始的RFC中视频格式没有给载类型,在SDP中替换它会被映射C个众所周知的常量中?br />  ·a=rtpmap:101 H263-1998Q这个完成键入在前一行指出的动态负载。用此cdQ你会用一个在96?27之间的|本例中是101Q,然后用一个字W串命名此负载类型(H263-1998Q?br />  
  q当然好Q但是当在我的例E序中用它的时候,我只获得了一个视频流却没有声韟뀂所以,我用了一个很不同的SDPQ最初在QTJ的DrawableBroadcaster演示中出现。是的,他们不赞同这么做Q?br />  
  m=audio 2656 RTP/AVP 96
  c=IN IP4 239.60.60.60
  a=rtpmap:96 x-qt
  m=video 2700 RTP/AVP 96
  a=rtpmap:96 x-qt
  
  q里最大的不同是音频和视频都使用了相同的动态负载映,qƈ不是针对一个真正的~码器,而是一般的x-qt。在q里胜利的是你能在运行时间上挑选Q一QuickTime的音频和视频~码器,而不是在SDP文g中强q导致。底侧是q些可以不是由非QuickTime客户端可分析的,反之使用十分标准的和/或者旧的编码器q且在SDP中指定他们它更像其他的客户端(Real, JMF{)能够操作你的pȝ?br />  
  q就是你的SDP文g。现在不要加入一个Presentation?br />  
  创徏Presentation
  
  我们的流媒体服务器程序调用LittleBroadcastQ这q没有多代码,只有不过140行。在本文中,我将一步一步的q行Q解释一般的部分Q但提供其全部的清单。在后面的Resources章节中有可用C?tar.gz文gQ连同SDP文g和一个Ant构徏文g?br />  
  package com.mac.invalidname.qtjstreaming;import quicktime.*;
  import quicktime.std.*;
  import quicktime.util.*;
  import quicktime.qd.*;
  import quicktime.io.*;
  import quicktime.streaming.*;
  import quicktime.app.time.*;
  import java.io.*;import java.awt.*;
  import java.awt.event.*;
  public class LittleBroadcast extends Tasking implements ActionListener {
  
  q是一长串典型的引入QuickTimeQ包括了使用其QDGraphics来提供一个摄像机画面以外的图形界面的qdQ读取SDP文g的ioQ用于流媒体API的streamingQ以及获得给予Presentationq行旉的有效Q务的time。最后一点,注意该类扩展直Tasking――提供周期性调用的task()。本应用E序中,它用于不断的调用Presentation的idle()ҎQƈ使其循环工作。你在本书中学习C是Movies所需要的Q但是此d几乎一直都自动的ؓ你所操作。用Presentationq不好运。(或者ؓ此事而捕P但有些离开本主题了。)
  
  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;
  
  q些是服务器的实例变量。是一个用于指定当开?停止按钮按下的时候做什么的标记。下面是一对广播视频大的帔RQ紧跟着是服务器GUI的按钮。最后是一个Presentation对象Q以及它的时间尺度。(媒体的保持时间系l,一?00的时间尺度表CZU种里有600个单位;600也是QuickTime中默认的。)
  
  public static void main (String[] args) {
  System.out.println ("main");
  try {
  QTSession.open();
  new LittleBroadcast();
  } catch (QTException qte) {
  qte.printStackTrace();
  }
  }
  
  在这个main中ƈ没有什么独特的地方。我投入了所有的_֊在构造函C以防止ؓ那些我需要的实例创徏一个内部类。如果你扩展本代码,你可能会发现q很有用?br />  
  public LittleBroadcast() throws QTException {
  System.out.println ("LittleBroadcast constructor");
  QTFile file = new QTFile (new File ("little.sdp"));
  try {
  MediaParams mediaParams = new MediaParams();
  mediaParams.setWidth (BROADCAST_WIDTH);
  mediaParams.setHeight (BROADCAST_HEIGHT);
  QDGraphics myGWorld =
  new QDGraphics (new QDRect (
  BROADCAST_WIDTH, BROADCAST_HEIGHT));
  mediaParams.setGWorld (myGWorld);
  PresParams presParams =
  new PresParams( presenterTimeScale,
  QTSConstants.kQTSSendMediaFlag |
  QTSConstants.kQTSAutoModeFlag |
  QTSConstants.kQTSDontShowStatusFlag,
  mediaParams );
  pres = Presentation.fromFile(file, presParams );
  
  构造函数的W一事是装蝲名ؓlittle.sdp的SDP文g?但这q不是所有的都需要创建Presentation ――在调用Presentation.fromFile()的时候需要服务器应用E序讄一些必要的参数。首?你要创徏一个MediaParams对象,q样你能讄视频的高度和宽度。您必须做的其它重要事是提供照相Z个图形界?由QDGraphics创徏MediaParams讄。是? 名字是古怪的, 因ؓQTJ 设计员想注重与AWT Graphics对象的相似? 但得到或讄q样的对象的用途的所有方法是使用其本地API名字, GWorld?最? 你ؓ所有的Presentation创徏一个PresParams来设|参数?q采取一个有些Q意的时标, 一些算术上的行为标记彼此OR'ed, 以及MediaParams?可能的行为标? 都被定义在QTSConstants, 包括:
  
  ·KQTSAutoModeFlag: 都用默认倹{?最重要? q些使用默认值Sourcer, Presentation的来?是从各种各样的输入装|执行获取的SequenceGrabber?它还可能播放一个在盘上或是Q意目录下的的QuickTime 文g; E后我将探讨q些问题?br />  
  ·KQTDontShowStatusFlag: 不要创徏一个会Dq接数和状态信息总被昄在客L的流媒体状态处理程序?br />  
  ·KQTSSendMediaFlag:发送,不接收数据?br />  
  ·KQTSReceiveMediaFlagQ接Ӟ不发送数据?br />  
  在SDP文g说明, 参数, 以及GWorld 讄? 创徏Presentation和Presentation.fromFile()?br />  
  // find audio stream      Stream audioStream = null;
  for (int i=1; i<=pres.getNumStreams(); i++) {
  System.out.println ("stream: " + i + ": " +
  pres.getIndStream(i));
  Stream aStream = pres.getIndStream (i);
  if (pres.hasCharacteristic(aStream,
  StdQTConstants.audioMediaCharacteristic)) {
  audioStream = aStream;
  break;
  }
  }
  System.out.println ("audioStream = " + audioStream);
  pres.setVolumes (audioStream, 100, 100);
  System.out.println ("created presentation, gworld == " +
  pres.getGWorld() + ", size == "+
  mediaParams.getWidth() + "x" +
  mediaParams.getHeight() + ", streams == " +
  pres.getNumStreams());
  
  //*******q不是真正地必要? 但它告诉你怎么通过Presentation游览来挑选各自的媒体?Presentation.getIndStream 会由索引q回一个Stream(附注QuickTime 索引都是Z1)。它重复q些audioMediaCharacteristic h查找音频?(对于录媄, 您就要请求visualMediaCharacteristic) ?q个实例在audioStream上ؓ左右声道讄音量最大gؓ100?br />  
  最? println从Presentation和MediaParams转存一些有意义的元数据?br />  
  配置Presentation
  
  SettingsDialog sd = new SettingsDialog (pres);
  System.out.println ("Did settings");
  pres.preroll();
  broadcasting = false;
  
  q是讄presentation最后的步骤?SettingsDialog存在用户以输入装|选择的音频和视频 (二个媒体SDP 文g被指定在Presentation? 。每个流媒体都可׃个压~格式来定制 (MPEG-4, Sorenson Video 3, H.263, {? 以及一个分包器(有时由压~格式定? 可观察它是否随着压羃格式的改变而自动改? ?q个GUI实例昄在图1 ?br />  
 
  囑փ1. Z个Presentation SettingsDialog

  
  在此图中, 音频默认机q线输入。更改它为iSight, 您需要点击Source按钮,提出的可选设备列表显C在???br />  
 
  ?. 来源选择对话?/center>
  
  最后就是调用Presentation.preroll(), 如同Movie.preroll(), 提供Presentation一个机会预先分配资源以及准备好开始流媒体Presentation?br />  
  提供一个控制GUI
  
  // Make monitor window
  startStopButton = new Button ("Start");
  configButton = new Button ("Configure");
  startStopButton.addActionListener (this);
  configButton.addActionListener (this);
  Frame monitorFrame = new Frame ("QTJ Streaming");
  monitorFrame.setLayout (new BorderLayout());
  Panel buttonPanel = new Panel();
  buttonPanel.add (startStopButton);
  buttonPanel.add (configButton);
  monitorFrame.add (buttonPanel, BorderLayout.SOUTH);
  monitorFrame.pack();
  monitorFrame.setVisible(true);
  
  q个为控制和配置Presentation讄了很的GUI,提供基本的一个v?停止键和一个配|按钮?按钮作ؓ一个ActionListener提交lthis, 意味着q个cd需要提供一个actionPerformedҎ来处理按钮点凅R?控制GUI 的屏q截图显C在? ?br />  
 
  ?. 监控/控制H体

  
  在这点上你也怼问一个有的问题: "从什么时候我们开始关心用GUI提供server?"据推? q是从Classic Mac OS开始的一个传l? 它没有一个用命o行启动和传递参数的E序。但此外, 你通常会希望提供一个流媒体数据的预? q且如果您有一个预览视H? Z么会也没有一个配|的GUI?
  
  无论如何, q是大概的讨? 因ؓQTJ 6.1 不提供您能用来预览的一个AWT Component。在有些斚w有希望的? QTFactory得C个新的超负荷为采用一个Presentationq且q回一个显C流媒体视频的Component的makeQTComponent?它大概可能用一些QuickDraw voodoo而完全放弃Java的东ѝ?如果,在各task()中回?参见下面) 您采取GWorld被及早创? 转换它成Pict, q且作ؓ一份唯一命名的文? 您会看见每一个都是不同的, 意味GWorld每次都得到新数据?所以如果您替换掉GWorld, 改ؓ能给AWT Component在各通道上定义象? 您会有银q上的预览。何人有胆量如此? 在quicktime-java list上查看?br />  
  详细资料
  
  // add shutdown handler to make sure presentation
  // gets stopped
  Thread presentationStopper = new Thread() {
  public void run() {
  try {
  pres.stop();
  } catch (QTException qte) {}
  }
  };
  Runtime.getRuntime().addShutdownHook (presentationStopper);
  
  q个关闭异常分支定Presentation在程序退Z前被l止?q是重要的原? 象SequenceGrabber, Presentation愉快l箋q行在您的应用程序退Z?l定一个端?严重的@? 使用您的获取讑֤保留其它应用E序, {?br />  } catch ( QTException e ) {
  e.printStackTrace();
  System.exit (-1);
  }
  }
  
  最? 构造函数捕捉ƈ抛出所有的QTExceptions?br />  public void actionPerformed (ActionEvent ae) {
  System.out.println ("actionPerformed");
  try {
  if (ae.getSource() == startStopButton) {
  if (broadcasting) {
  pres.stop();
  stopTasking();
  broadcasting = false;
  startStopButton.setLabel ("Start");
  System.out.println ("Stopped");
  } else {
  pres.start();
  startTasking();
  broadcasting = true;
  startStopButton.setLabel ("Stop");
  System.out.println ("Started");
  }
  } else if (ae.getSource() == configButton) {
  new SettingsDialog (pres);
  }
  } catch (QTException qte) {
  qte.printStackTrace();
  }
  }
  
  q是非常直接的处理v?l止和设|按钮。如果点ȝ按钮是v?l止, 讄GUI ׃调用在Presentation上的 start() 或stop(), 开始或停止正在执行的Q?(定期回调q个cȝtask()Ҏ), Z按钮点击目的讄broadcasting标志, q且更改按钮标签。如果用LM配置, 它生成ؓPresentation新的SettingsDialog?br />  
  public synchronized final void task() throws QTException {
  pres.idle(null);
  }}
  
  最后的q个Ҏ实现了承自Tasking的task()Ҏq且被在操作开始按钮调用startTasking()后定时的调用。用简单的调用Presentation.idle(), 它提供了表达旉来从获取讑֤取得当前数据Q对其编码ƈ传输出厅R?br />  
  q行媒体客L
  
  最单的使客h看广播的Ҏ是用QuickTime 播放器打开服务器用ƈ创徏Presentation的同样SDP 文g。这调用SDP 输入E序q接到流媒体q且开始分析这些内宏V注意客h和服务器不能在同一台机器上, 明显地因为服务器Z用表C占用端? 拒绝客户机对q些端口的用?? 昄在我的计机上的媒体的外观(那是正在播放我的Macross和Escaflowne玩具) ?br />  
 
  ?. QuickTime媒体客L

  
  如果您用QuickTime 播放? 您能使用其得C息指令显CZU流媒体以及他们的格式?在表5, 您能看有二种媒体: 一条未压羃?4.1kHz 音频? 和一条H.263 的视频流?br />  
 
  ?. 客户端信息窗?/center>
  
  l语
  
  Ҏ来说,播放ZJava的QuickTime媒体比惌的容易多了?最单的例子, 从获取设备播? 只需要少?50 个代码行?昄, 最困难的部份是了解SDP文g, 它被证明是非常的q分讲究q且它的说明文g包含大量应用E序U别E序员不会有的知识。同样不q的是,QTJ不再提供预览lg, 但也许在来会提? 以及一段的GWorld/QuickDraw 堆砌也许会在来刉出q样的组件?br />  
  本文只包括怎么为实时获取数据设|广播。其它可利用的Sourcers, 譬如来自盘或Q意目录种的那些广播QuickTime 文g, 会在以后的部分中讨论?br />

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=530469




javaboys 2007-04-01 18:22 发表评论
]]>
Java |络文g传输http://www.aygfsteel.com/javaboys/articles/107798.htmljavaboysjavaboysSun, 01 Apr 2007 10:19:00 GMThttp://www.aygfsteel.com/javaboys/articles/107798.htmlhttp://www.aygfsteel.com/javaboys/comments/107798.htmlhttp://www.aygfsteel.com/javaboys/articles/107798.html#Feedback0http://www.aygfsteel.com/javaboys/comments/commentRss/107798.htmlhttp://www.aygfsteel.com/javaboys/services/trackbacks/107798.html  

Java |络文g传输

读者范?/span>:

本文是一简短入门文?/span>.本文假设读者对Java?/span>IOpȝ?/span>Java的网l系l有所了解.

正文:

关于文g传输的问?/span>,实际也是一U?/span>IOd的基本问?/span>.对于|络而言也是一U?/span>IOd问题.因此所谓网l的文g传输实际是两U?/span>IO问题的综合讨?/span>.q里我们首先分析一个图C?/span>.然后围绕q个囄来讨?/span>:

?/span>1:

分析?/span>1我们基本可以知道从服务器文gpȝ中通过把文g中的数据写入到服务器的进E中,然后把进E中的数据通过|络IOpȝ传递到客户?/span>,q个阶段,|络中的数据以字节流的Ş式保?/span>.当该字节被客户q程接受?/span>,客户q程通过客户本地文g写入客h地的文gpȝ?/span>.

 

Ҏ以上分析,我们基本可以定我所需要处理的问题?/span>.首先我们需要可以对本地文gpȝIO操作的操作接?/span>,然后是一个可以对|络IOpȝq行操作的操作接?/span>,已经一个可以把数据包装成字节流的操作接?/span>,他们分别可以提供客户和服务器两个q程q行d的操?/span>.如下图所C?/span>:

 

?/span>2:

 

Ҏ以上分析,我们可以把问题归l到对以下编E接口的需求上:

 

1.         字节包装器和字节解包?/span>,

 

2.         |络传输器和|络接收?/span>

 

3.         本地文g?/span>/写器

 

 

 

而这?/span>Java本n?/span>API已l提?/span>.他们都被包装?/span>java.io?/span>java.netq两个包?/span>,q里我提供一个基?/span>TCP/IP的实现版?/span>,使用Zq接的方式来完成工作.我们首先介绍几个相关?/span>JDK中的cL完成以上d,

 

1.       DataOutputStream?/span>DataInputStream实现cL供了上面的字节包装和解包器的实现

 

2.       ServerSocket?/span>Socekt提供了基于连接的|络传输和接受接?/span>

 

3.       File,FileInputStream?/span>FileOutputStream提供了基本的本地文g输入输出接口.

 

 

 

 

 

服务器端实现代码:

 

import java.io.*;

 

import java.net.*;

 

 

 

public class FileServer{

 

       public static void main(String[] args)throws Exception{

 

              //创徏文g用来读取文件中的数?/span>

 

              File file=new File("lishengjie.jpg");

 

              FileInputStream fos=new FileInputStream(file);

 

             

 

              //创徏|络服务器接受客戯?/span>

 

              ServerSocket ss=new ServerSocket(3108);

 

              Socket client=ss.accept();

 

             

 

              //创徏|络输出ƈ提供数据包装?/span>

 

              OutputStream netOut=client.getOutputStream();

 

              OutputStream doc=new DataOutputStream(new BufferedOutputStream(netOut));

 

             

 

              //创徏文gd~冲?/span>

 

              byte[] buf=new byte[2048];

 

              int num=fos.read(buf);

 

              while(num!=(-1)){//是否d文g

 

                     doc.write(buf,0,num);//把文件数据写出网l缓冲区

 

                     doc.flush();//h~冲区把数据写往客户?/span>

 

                     num=fos.read(buf);//l箋从文件中d数据

 

              }

 

              fos.close();

 

              doc.close();

 

       }

 

}

 

 

 

客户方实C?/span>:

 

import java.io.*;

 

import java.net.*;

 

 

 

public class FileClient{

 

       public static void main(String[] args)throws Exception{

 

              //使用本地文gpȝ接受|络数据q存为新文g

 

              File file=new File("newFile.jpg");

 

              file.createNewFile();

 

              RandomAccessFile raf=new RandomAccessFile(file,"rw");

 

             

 

              // 通过Socketq接文g服务?/span>

 

              Socket server=new Socket(InetAddress.getLocalHost(),3108);

 

             

 

              //创徏|络接受接受服务器文g数据

 

              InputStream netIn=server.getInputStream();

 

              InputStream in=new DataInputStream(new BufferedInputStream(netIn));

 

             

 

              //创徏~冲区缓冲网l数?/span>

 

              byte[] buf=new byte[2048];

 

              int num=in.read(buf);

 

             

 

              while(num!=(-1)){//是否d所有数?/span>

 

                     raf.write(buf,0,num);//数据写往文g

 

                     raf.skipBytes(num);//序写文件字?/span>

 

                     num=in.read(buf);//l箋从网l中d文g

 

              }

 

              in.close();

 

              raf.close();

 

       }

 

}

归结以上代码:

服务?/span>

客户?/span>

1.       服务器从本地文gpȝd文g

2.       服务器创建网l服务连?/span>

3.       服务器提供数据包装器

4.       服务器将本地文g写入数据包装?/span>

5.       服务器通过包装器写入到|络

1.       客户端徏立新文g准备存储来自|络的数?/span>

2.       客户端连接服务器

3.       客户端通过|络接受服务器数据ƈq行数据解包

4.       客户端将数据写入~冲?/span>

5.       客户端从~冲区把数据写入客户本地文g

 

ȝ:

    事实?/span>java的开发环境ؓ我们提供大多数的~程接口,为我们简化了开发工作量.我们通过java?/span>IO接口所提供的文?/span>,数据包装器等接口非常方便的解决了我们上面的开发工作量.同时?/span>java?/span>net接口所提供的套接字也得基于连接的数据接受和发送成为非常容易的工作.

 



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=283322




javaboys 2007-04-01 18:19 发表评论
]]>
JAVA 文g操作http://www.aygfsteel.com/javaboys/articles/107660.htmljavaboysjavaboysSat, 31 Mar 2007 09:29:00 GMThttp://www.aygfsteel.com/javaboys/articles/107660.htmlhttp://www.aygfsteel.com/javaboys/comments/107660.htmlhttp://www.aygfsteel.com/javaboys/articles/107660.html#Feedback0http://www.aygfsteel.com/javaboys/comments/commentRss/107660.htmlhttp://www.aygfsteel.com/javaboys/services/trackbacks/107660.html
public class FileTest{
   public FileTest(){

}
try{
File f  = new File("d:\test.txt");
FileReader fr = new FileReader(f);
BufferedReader br  = new BufferedReader(fr);

String line = br.readLine();

while(line != null){
   System.out.println(line + "\n");

  line = br.readLine();
}

}catch(Exception ex){
    System.err.println(ex);
}
}

javaboys 2007-03-31 17:29 发表评论
]]>
վ֩ģ壺 | ͭ| ֥| | | ʡ| ɽ| Ӽ| | ̩| ɽ| ¡| | | | ɽ| ˮ| Ӳ| | | | | ³ɽ| | | | | | ³ľ| | Ϫ| | | | | | | | | | غ|