第七章输入和输出流

一、数据流的基本概念

1、输入数据流
  • 输入输出流:只能读不能写的数据流。
  • 输入数据流都是从抽象类InputStream继承。
  • 输入、输出源抽象为流(Stream)。
  • 数据流是指一组有顺序的、有起点和终点的字节集合。
  • 字节流:一次读入或读出是8位二进制。
  • 字符流:一次读入或读出是16位二进制。
  • 字节流和字符流的区别:
      (1).读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
      (2).处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
      结论:只要是处理纯文本数据,就优先考虑使用字符流。除此之外都使用字节流。
  • 输入数据流中提供的主要数据操作方法如下:
    ·int read( ):从输入流中读取一个字节的二进制数据。
    ·int read(byte[ ]b):将多个字节读到数组中,填满整个数组。
    ·int read(byte[ ]b,int off,int len):从输入流中读取长度为len的数据,从数组b中下标为off的位置开始放置读入的数据,读毕返回读取的字节数。
    ·void close( ):关闭数据流。当结束对一个数据流的操作时应该将其关闭,同时释放与该数据流相关的资源,因为Java提供系统级的垃圾自动回收功能,所以当一个流对象不再使用时,系统可以自动关闭。但是,为提高程序的安全性和可读性,建议显式关闭输入/输出流。
    ·int available( ):返回目前可以从数据流中读取的字节数(但实际的读操作所读得的字节数可能大于该返回值)。
    ·long skip(long l):跳过数据流中指定数量的字节不读取,返回值表示实际跳过的字节数。
      对数据流中字节的读取通常是按从头到尾顺序进行的,如果需要以反方向读取,则需要使用回推(Push Back)操作。在支持回推操作的数据流中经常用到如下几个方法:
      ·boolean markSupported( ):用于测试数据流是否支持回推操作,当一个数据流支持mark( )和reset( )方法时返回true,否则返回false。
      ·void mark(intmarkarea):用于标记数据流的当前位置,并划出一个缓冲区,其大小至少为指定参数的大小。
      ·void reset( ):将输入流重新定位到对此流最后调用mark方法时的位置。
2、输出数据流
  • 输出数据流:是指只能写不能读的流
  • java.io包中所有输出数据流大多是从抽象类OutputStream继承而来的
  • 输出数据流中提供的主要数据操作方法如下:
      ·void write(int i):将字节i写入到数据流中,它只输出所读入参数的最低8位。该方法是抽象方法,需要在其输出流子类中加以实现,然后才能使用。
      ·void write(byte b[ ]):将数组b[ ]中的全部b.length个字节写入数据流。
      ·void write(byte b[ ],int off,int len):将数组b[ ]中从下标off开始的len个字节写入数据流。元素b[off]是此操作写入的第一个字节,b[0ff+len-1]是此操作写入的最后一个字节。以上这些方法用于向输出数据流中写数据。在实际应用中,和操作输入数据流一样,通常以系统允许的最大数据块长度为单位进行写操作。
      ·void close( ):当结束对输出数据流的操作时应该将其关闭。
      ·void flush( ):刷新此输出流并强制写出所有缓冲的输出字节。

二、基本字节数据流类

1、文件数据流
  • 文件数据流包括FilelnputStream和FileOutputStream,这两个类用来进行文件的I/O处理,其数据源或数据终点都应当是文件。通过所提供的方法可以对本机上的文件进行操作,但是不支持方法mark()和reset( )
  • 文件流示例:
FilelnputStream fis=new FileInputStream("myFile"); 
//这样,便把文件myFile作为该数据流的数据源。
2、过滤器(filter)数据流
  • 缓冲区数据流有BufferedlnputStream和BufferedOutputStream,它们是在数据流上增加了一个缓冲区,都属于过滤器数据流。
  • 这两个流还提供了对mark( )、reset( )和skip( )等方法的支持。
在创建该类的实例对象时,可以使用两种方法,一种是使用默认缓冲区的大小,
例如:
  FilelnputStream fis=new FileInputStream("myFile");
  InputStream is=new BufferedlnputStream(fis);
  FileOutputStream fos=new FileOutputStream("myFile");
  OutputStream os=new BufferedOutputStream(fos);
  另一种是自行设置缓冲区的大小,例如:
  FilelnputStream fis=new FilelnputStream("myFile");
  InputStream is=new BufferedlnputStream(fis,1024);
  FileOutputStreamf os=new FileOutputStream("myFile");
  OutputStream os=new BufferedOutputStream(fos,1024);
3、数据数据流
  • DatalnputStream和DataOutputStream就是这样的两个过滤器数据流,它们允许通过数据流来读写Java基本类型,包括布尔型(boolean)、浮点型(float)等。
  • 在DatalnputStream类中,提供了如下一些方法:
      ·byte readByte( )
      ·long readLong( )
      ·double readDouble( )
      ·boolean readBoolean( )
      ·String readUTF( )
      ·int readlnt( )
      ·float readFloat( )
      ·short readShort( )
      ·char readChar( )
  • 在DataOutputStream类中提供了如下的方法:
      ·void writeByte(int aByte)
      ·void writeLong(long aLong)
      ·void writeDouble(double aDouble)
      ·void writeBoolean(boolean aBool)
      ·void writeUTF(String aString)
      ·void writelnt(int anlnt)
      ·void writeFloat(float aFloat)
      ·void writeShort(short aShort)
      ·void writeChar(char aChar)
  • 三个文件流的区别
      在计算机中文件是byte 、byte、byte地存储
      FileInputStream在读取文件的时候,就是一个一个byte地读取,
      DataInputStream则是在FileInputStream的一个轻量级的包装类,
      BufferInputStream则是自带缓冲区,默认缓冲区大小为8×1024
      通俗地讲就是:
      FileInputStream在读取文件的时候,一滴一滴地把水从一个缸复制到另外一个缸
      DataInputStream则是一瓢一瓢地把水从一个缸复制到另外一个缸
      BufferInputStream则是一桶一桶地把水从一个缸复制到另外一个缸。
4、对象流
  • 将对象信息写入文件或从文件读取对象信息。
  • 通过java.io包中的ObjectlnputStream和ObjectOutputStream两个类实现的。能够输入/输出对象的流称为对象流。
  • 写对象数据流
   Date d=new Date( );//一个对象d
  FileOutputStream f=new FileOutputStream("date.ser");
  ObjectOutputStream s=new ObjectOutputStream(f);//输出文件
  try{
  s.writeObject(d);
  s.close( );//将对象d写入文件,关闭文件
  }catch(IOException e){
  e.printStackTrace( );
  }
  • 读对象数据流
    读对象和写对象一样简单,但是要注意,方法readObject()把数据流以Object类型返回,返回内容应该在转换为正确的类名之后再执行该类的方法。
   Date d=null;
  FilelnputStream f=new FilelnputStream("date.ser");
  ObjectlnputStream s=new ObjectlnputStream(f);
  try{
  d=(Date)s.readObject();
  s.close( );
  }catch(IOException e){
  e.printStackTrace( ); 
  } 
5、序列化
  • 概念:对象信息长久保存到文件叫序列化,反之叫反序列化。
  • 序列化是一种用来处理对象流的机制。
  • 要序列化一个对象,必须与特定的对象输出/输入流联系起来,通过对象输出流将对象状态保存下来,或是将对象保存到文件中,之后再通过对象输入流将对象状态恢复。该功能是通过java.io包中的ObjectOutputStream和ObjectlnputStream两个类实现的。

三、基本字符流

1、读者和写者
  • InputStreamReader和OutputStreamWriter类可以用于不同平台间编码方式转换。
  • 例如:构造方法如下所示:
·InputStreamReader(InputStream in):默认规范。
·InputStreamReader(InputStream in,String enc):指定规范enc
·OutputStreamWriter(OutputStream out):默认规范。
·OutputStreamWriter(OutputStream out,String enc):指定规范enc。

  • 读者提供的方法包括以下几种。
      ·void close( )
      ·void mark(intreadAheadLimit)
      ·boolean markSupported( )
      ·int read( )
      ·int read(char[ ]cbuf)
      ·int read(char[ ]cbuf, int off, int len)
      ·boolean ready( )
      ·void reset( )
      ·long skip(longn)
  • 写者提供的方法包括以下几种。
      ·void close( )
      ·void flush( )
      ·void write(char[ ] cbuf)
      ·void write(char[ ] cbuf,int off,int len)
      ·void write(int c)
      ·void write(String str)
      ·void write(String str,int off,int len)
2、缓冲区读者和缓冲区写者
  • BufferedlnputStream和BufferedOutputStream,缓冲区字符流。
  • 构造方法:
//构造方法
  BufferedReader(Reader  r)
  BufferedWriter(Writer  w)

常用方法:

readLine():读一行
newLine():写一空白行

三、文件的处理

1、File类
  • Java提供了File类,用于处理与文件相关的操作。
  • File对象可以用来生成与文件(及其所在的路径)或目录结构相关的对象。不同的系统可能会有不同的目录结构表示法,但使用File类可以达到与系统无关的目的,这里使用的是抽象的路径表示法。java.io.File类提供了获得文件基本信息及操作文件的一些方法。
  • 与文件名相关的方法
      ·String getName( ):获取文件名。
      ·String getPath( ):获取文件路径。
      ·String getAbsolutePath( ):获取文件绝对路径。
      ·String getParent( ):获取文件父目录名称。
      ·boolean renameTo(File newName):更改文件名,成功返回true,否则返回false。
  • 文件测定方法
      ·boolean exists( ):文件对象是否存在。
      ·boolean canWrite( ):文件对象是否可写。
      ·boolean canRead( ):文件对象是否可读。
      ·boolean isFile( ):文件对象是否是文件。
      ·boolean isDirectory( ):文件对象是否是目录。
      ·boolean isAbsolute( ):文件对象是否是绝对路径。
      常用文件信息和方法
      ·long lastModified( ):获取文件最后修改时间。
      ·long length( ):获取文件长度。
      ·boolean delete( ):删除文件对象指向的文件,成功则返回true,否则返回false。
2、随机访问文件
  • RandomAccessFile类来处理这种类型的输入/输出。
  • 创建一个随机访问文件有以下两种方法供选择。
    1.使用文件名
 myRAFile=new RandomAccessFile(String name,String mode);

2.使用文件对象

  myRAFile=new RandomAccessFile(File file,String mode);

参数mode决定是以只读方式(“r”)还是以读写方式(“rw”)访问文件。例如,可以打开一个数据库进行更新:

  RandomAccessFile myRAFile;
  myRAFile=new RandomAccessFile("db/stock.dbf","rw");

对象RandomAccessFile读写信息的方法同数据输入/输出对象的方法相同,它可以访问DatalnputStream和DataOutputStream类中的所有read( )和write( )方法。Java语言提供了移动文件读写指针的几个方法。
  ·long getFilePointer( ):返回文件指针的当前位置。
  ·void seek(longpos):将文件指针置于指定的绝对位置。位置值以从文件开始处的字节偏移量pos来计算,pos为0代表文件的开始。
  ·long length( ):返回文件的长度。位置值为length( ),代表文件的结尾。为文件添加信息时可以利用随机访问文件来完成文件输出的添加模式,例如:
  myRAFile=new RandomAccessFile(“java.log”,“rw”);
  myRAFile.seek(myRAFile.length( ));

  • 总结:
      输入流:InputStream或者Reader:从文件中读到程序中;
      输出流:OutputStream或者Writer:从程序中输出到文件中;
      文件相关的流:FileInputStream 、 FileOutputStrean 、FileReader 、FileWriter
      缓冲流:BufferedInputStrean 、BufferedOutputStream、 BufferedReader、 BufferedWriter
      转换流:InputStreamReader 、OutputStreamWriter
      数据流:DataInputStream 、DataOutputStream
      对象流:ObjectInputStream、ObjectOutputStream

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值