动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息



本月文章推荐
.扩展JAAS实现类实例级授权.
.Java如何处理ARP报文的收发.
.使用SMTP协议发送邮件.
.浅论手机游戏发展趋势与相关 J2M.
.WebLogic7中的JDBC Pool的配置.
.我的java学习经验谈2.
.用java实现外部调用exe文件.
.在JBuilder 9上使用Struts 1.1的.
.用句柄操纵对象.
.使用.net Remtoing并行计算.
.一个连接池的例子(来自JIVE).
.使用JAVA编写网络通信程序.
.采用POI创建Excel文件.
.纯继承与扩展.
.Java Servlet 编程及应用之三.
.违例控制器.
.客户端的Java同样精彩.
..Net下调用SQL Server2000中存储.
.X3D实战基础讲座之二.
.实现高效Java编程规范的十一条基.

彻底明白 Java 语言中的IO系统

发表日期:2008-1-5 |


  一. Input和Output

  1. stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。在Java的IO中,所有的stream(包括Input和Out stream)都包括两种类型:

  1.1 以字节为导向的stream

  以字节为导向的stream,表示以字节为单位从stream中读取或往stream中写入信息。以字节为导向的stream包括下面几种类型:

  input

  stream:

  1) ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用

  2) StringBufferInputStream:把一个String对象作为InputStream

  3) FileInputStream:把一个文件作为InputStream,实现对文件的读取操作

  4) PipedInputStream:实现了pipe的概念,主要在线程中使用

  5) SequenceInputStream:把多个InputStream合并为一个InputStream

  Out

  stream

  1) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中

  2) FileOutputStream:把信息存入文件中

  3) PipedOutputStream:实现了pipe的概念,主要在线程中使用

  4) SequenceOutputStream:把多个OutStream合并为一个OutStream

  1.2 以Unicode字符为导向的stream

  以Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取或往stream中写入信息。以Unicode字符为导向的stream包括下面几种类型:

  Input

  Stream

  1) CharArrayReader:与ByteArrayInputStream对应

  2) StringReader:与StringBufferInputStream对应

  3) FileReader:与FileInputStream对应

  4) PipedReader:与PipedInputStream对应

  Out

  Stream

  1) CharArrayWrite:与ByteArrayOutputStream对应

  2) StringWrite:无与之对应的以字节为导向的stream

  3) FileWrite:与FileOutputStream对应

  4) PipedWrite:与PipedOutputStream对应

  以字符为导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同,字是在操作时的导向不同。如 CharArrayReader:和ByteArrayInputStream的作用都是把内存中的一个缓冲区作为InputStream使用,所不同的 是前者每次从内存中读取一个字节的信息,而后者每次从内存中读取一个字符。

  1.3 两种不现导向的stream之间的转换

  InputStreamReader和OutputStreamReader:把一个以字节为导向的stream转换成一个以字符为导向的stream。

  2. stream添加属性

  2.1 “为stream添加属性”的作用

  运用上面介绍的Java中操作IO的API,我们就可完成我们想完成的任何操作了。但通过FilterInputStream和FilterOutStream的子类,我们可以为stream添加属性。下面以一个例子来说明这种功能的作用。

  假如我们要往一个文件中写入数据,我们可以这样操作:

FileOutStream fs = new FileOutStream(“test.txt”);

  然后就可以通过产生的fs对象调用write()函数来往test.txt文件中写入数据了。但是,假如我们想实现“先把要写入文件的数据先缓存到内存 中,再把缓存中的数据写入文件中”的功能时,上面的API就没有一个能满足我们的需求了。但是通过FilterInputStream和 FilterOutStream的子类,为FileOutStream添加我们所需要的功能。

  2.2 FilterInputStream的各种类型

  2.2.1 用于封装以字节为导向的InputStream

  1) DataInputStream:从stream中读取基本类型(int、char等)数据。

  2) BufferedInputStream:使用缓冲区

  3) LineNumberInputStream:会记录input stream内的行数,然后可以调用getLineNumber()和setLineNumber(int)

  4) PushbackInputStream:很少用到,一般用于编译器开发

  2.2.2 用于封装以字符为导向的InputStream

  1) 没有与DataInputStream对应的类。除非在要使用readLine()时改用BufferedReader,否则使用DataInputStream

  2) BufferedReader:与BufferedInputStream对应

  3) LineNumberReader:与LineNumberInputStream对应

  4) PushBackReader:与PushbackInputStream对应

  2.3 FilterOutStream的各种类型

  2.2.3 用于封装以字节为导向的OutputStream

  1) DataIOutStream:往stream中输出基本类型(int、char等)数据。

  2) BufferedOutStream:使用缓冲区

  3) PrintStream:产生格式化输出

  2.2.4 用于封装以字符为导向的OutputStream

  1) BufferedWrite:与对应

  2) PrintWrite:与对应

  3. RandomAccessFile

  1) 可通过RandomAccessFile对象完成对文件的读写操作

  2) 在产生一个对象时,可指明要打开的文件的性质:r,只读;w,只写;rw可读写

  3) 可以直接跳到文件中指定的位置

  4. I/O应用的一个例子

  java 代码

import java.io.*;
public class TestIO{
 public static void main(String[] args)
 throws IOException{
 //1.以行为单位从一个文件读取数据
 BufferedReader in = new BufferedReader(
  new FileReader("F:\\nepalon\\TestIO.java"));
 String s, s2 = new String();
 while((s = in.readLine()) != null)
 s2 += s + "\n";
 in.close();
 //1b. 接收键盘的输入
 BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
 System.out.println("Enter a line:");
 System.out.println(stdin.readLine());
 //2. 从一个String对象中读取数据
 StringReader in2 = new StringReader(s2);
 int c;
 while((c = in2.read()) != -1)
 System.out.println((char)c);
 in2.close();
 //3. 从内存取出格式化输入
 try{
  DataInputStream in3 =new DataInputStream(new ByteArrayInputStream(s2.getBytes()));
  while(true)
   System.out.println((char)in3.readByte());
 }
 catch(EOFException e){
  System.out.println("End of stream");
 }
 //4. 输出到文件
 try{
  BufferedReader in4 =new BufferedReader(new StringReader(s2));
  PrintWriter out1 =new PrintWriter(new BufferedWriter(new FileWriter("F:\\nepalon\\ TestIO.out")));
  int lineCount = 1;
  while((s = in4.readLine()) != null)
   out1.println(lineCount++ + ":" + s);
   out1.close();
   in4.close();
 }
 catch(EOFException ex){
  System.out.println("End of stream");
 }
 //5. 数据的存储和恢复
 try{
  DataOutputStream out2 =new DataOutputStream(new BufferedOutputStream(
   new FileOutputStream("F:\\nepalon\\ Data.txt")));
  out2.writeDouble(3.1415926);
  out2.writeChars("\nThas was pi:writeChars\n");
  out2.writeBytes("Thas was pi:writeByte\n");
  out2.close();
  DataInputStream in5 =new DataInputStream(
   new BufferedInputStream(new FileInputStream("F:\\nepalon\\ Data.txt")));
   BufferedReader in5br =new BufferedReader(new InputStreamReader(in5));
   System.out.println(in5.readDouble());
   System.out.println(in5br.readLine());
   System.out.println(in5br.readLine());
 }
 catch(EOFException e){
  System.out.println("End of stream");
 }
 //6. 通过RandomAccessFile操作文件
 RandomAccessFile rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "rw");
 for(int i=0; i <10; i++)
  rf.writeDouble(i*1.414);
  rf.close();
  rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "r");
  for(int i=0; i <10; i++)
   System.out.println("Value " + i + ":" + rf.readDouble());
   rf.close();
   rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "rw");
   rf.seek(5*8);
   rf.writeDouble(47.0001);
   rf.close();
   rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "r");
   for(int i=0; i <10; i++)
    System.out.println("Value " + i + ":" + rf.readDouble());
    rf.close();
  }
 }

  关于代码的解释(以区为单位):

  1区中,当读取文件时,先把文件内容读到缓存中,当调用in.readLine()时,再从缓存中以字符的方式读取数据(以下简称“缓存字节读取方式”)。

  1b区中,由于想以缓存字节读取方式从标准IO(键盘)中读取数据,所以要先把标准IO(System.in)转换成字符导向的stream,再进行BufferedReader封装。

  2区中,要以字符的形式从一个String对象中读取数据,所以要产生一个StringReader类型的stream。 
上一篇:Java 6.0 操作脚本语言基础 人气:504
下一篇:为Java程序中添加播放MIDI音乐功能 人气:671
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-7-24 Sablog-X v2.0 预览版
2008-7-24 帝国备份王EmpireBak 2008 正式版
2008-7-24 网趣网上购物系统时尚版 v8.2
2008-7-24 纵横B2B电子商务系统XYECS!B2B v
2008-7-24 e路小说小偷 v1.2.0723
2008-7-24 凌风美女图片站程序 v2.2
2008-7-24 TOM15电影收索程序
2008-7-24 清风信息自动采集生成系统 v1.0
2008-7-24 QQ邮箱编辑器 v1.0 (小小菜刀ASP
2008-7-19 UltraEdit 简体中文增强版 14.10
2008-7-19 CentOS 5.2 i386 LiveCD
2008-7-19 Snapture多功能相机 v1.4
2008-7-19 iAcces中文输入法 v1.0Build016
2008-7-19 Cookbook烹饪秘籍 v2.5
2008-7-19 苹果专用DVD转换工具 v1.1.59汉化
2008-7-19 Modem修复软件ZiPhone修改版04.0
2008-7-19 AgileMessenger即时通讯工具美化
2008-7-19 Sketches画图软件 v0.7b6破解版


  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵