`
baochunyu
  • 浏览: 8670 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

io[转]

阅读更多

流式IO

流(Stream)是字节的源或目的。
01.png
两种基本的流是:输入流(Input Stream)和输出流(Output Stream)。可从中读出一系列字节的对象称为输入流。而能向其中写入一系列字节的对象称为输出流。

流的分类

节点流:从特定的地方读写的流类,例如:磁盘或一块内存区域。
过滤流:使用节点流作为输入或输出。过滤流是使用一个已经存在的输入流或输出流连接创建的。

InputStream

snap001.gif

三个基本的读方法
      abstract int read() :读取一个字节数据,并返回读到的数据,如果返回-1,表示读到了输入流的末尾。
      int read(byte[]?b) :将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。
      int read(byte[]?b, int?off, int?len) :将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。off指定在数组b中存放数据的起始偏移位置;len指定读取的最大字节数。
其它方法
      long skip(long?n) :在输入流中跳过n个字节,并返回实际跳过的字节数。
      int available() :返回在不发生阻塞的情况下,可读取的字节数。
      void close() :关闭输入流,释放和这个流相关的系统资源。
      void mark(int?readlimit) :在输入流的当前位置放置一个标记,如果读取的字节数多于readlimit设置的值,则流忽略这个标记。
      void reset() :返回到上一个标记。
      boolean markSupported() :测试当前流是否支持mark和reset方法。如果支持,返回true,否则返回false。
java.io包中 InputStream的类层次

OutputStream

snap002.gif

三个基本的写方法
     abstract void write(int?b) :往输出流中写入一个字节。
     void write(byte[]?b) :往输出流中写入数组b中的所有字节。
     void write(byte[]?b, int?off, int?len) :往输出流中写入数组b中从偏移量off开始的len个字节的数据。
其它方法
     void flush() :刷新输出流,强制缓冲区中的输出字节被写出。
     void close() :关闭输出流,释放和这个流相关的系统资源。
java.io包中 OutputStream的类层次

-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Demo1:在控制台读取键盘输入,然后显示。Ctrl+C结束运行
-------------------------------------------------------------------------------

 

 import  java.io. * ;
 
 
public   class  StreamDemo   {
  
   
public   static   void  main(String[] args)  throws  Exception   {
   
int  data;
  
    
while  ((data  =  System.in.read())  !=   - 1 )   {
   System.out.write(data);
  }
 
 
  }
 
  
 }
 
  


-------------------------------------------------------------------------------
-------------------------------------------------------------------------------


基本的流类

1、FileInputStream和FileOutputStream
 
   
节点流,用于从文件中读取或往文件中写入字节流。如果在构造FileOutputStream时,文件已经存在,则覆盖这个文件。
-------------------------------------------------------------------------------
Demo2:将字符串写入特定文件,注意write方法只接收字符数组。
-------------------------------------------------------------------------------

 

  import  java.io. * ;
  
   
public   class  StreamDemo   {
  
    
public   static   void  main(String[] args)  throws  Exception   {
   FileOutputStream fos  
=   new  FileOutputStream( " 1.txt " );
 
     
/** *//**/ /* 
    * 注意:FileOutputStream的write方法接收字符数组,不能接收String字符串,
   * 所以要用String的getBytes方法生成一个字符数组
     
*/
 
  fos.write( 
" http://www.cnblogs.com " .getBytes()); 
  fos.close();
  
  }
 
  
 }
 



-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
String的构造方法的API:
------------
Java API:
------------
String
public String(byte[] bytes,
              int offset,
              int length)
构造一个新的 String,方法是使用指定的字符集解码字节的指定子数组。新的 String 的长度是一个字符集函数,因此不能等于该子数组的长度。

当给定字节在给定字符集中无效的情况下,该构造方法无指定的行为。当需要进一步控制解码过程时,应使用 CharsetDecoder 类。

参数:
bytes - 要解码为字符的字节
offset - 要解码的首字节的索引
length - 要解码的字节数
抛出:
IndexOutOfBoundsException - 如果 offset 和 length 参数索引字符超出 bytes 数组的范围
从以下版本开始:
JDK1.1
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Demo3:将字符串写入特定文件,注意write方法只接收字符数组。
  然后通过文件输出流读取数据,注意使用String特定的构造方法。
-------------------------------------------------------------------------------

 

import  java.io. * ;
  
public   class  StreamDemo   {
  
    
public   static   void  main(String[] args)  throws  Exception   {
  FileOutputStream fos  
=   new  FileOutputStream( " 1.txt " );
  
     
/** *//**/ /* 
    * 注意:FileOutputStream的write方法接收字符数组,不能接收String字符串,
    * 所以要用String的getBytes方法生成一个字符数组
     
*/
 
   fos.write( 
" http://www.cnblogs.com " .getBytes()); 
   fos.close();
   
    
//  使用String的这个构造方法:
    
//  String(byte[] bytes, int offset, int length) 
    
   FileInputStream fis  
=   new  FileInputStream( " 1.txt " );
    
byte [] buf  =   new   byte [ 100 ];
    
int  len  =  fis.read(buf);
   
    
//  使用String的这个构造方法:
    
//  String(byte[] bytes, int offset, int length) 
    System.out.println( new  String(buf,  0 , len));
   fis.close();   
//  使用完后记得关闭文件流 
  
  }
 
  
 }
 


-------------------------------------------------------------------------------
运行结果:http://www.cnblogs.com/
-------------------------------------------------------------------------------


2、BufferedInputStream和BufferedOutputStream
   
过滤流,需要使用已经存在的节点流来构造,提供带缓冲的读写,提高了读写的效率。
   
------------
Java API:
------------
构造方法摘要
BufferedOutputStream(OutputStream out)
          创建一个新的缓冲输出流,以将数据写入指定的基础输出流。
BufferedOutputStream(OutputStream out, int size)
          创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的基础输出流。
-------------------------------------------------------------------------------
BufferedOutputStream
public BufferedOutputStream(OutputStream out)
创建一个新的缓冲输出流,以将数据写入指定的基础输出流。

参数:
out - 基础输出流。
BufferedOutputStream
public BufferedOutputStream(OutputStream out,
                            int size)
创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的基础输出流。

参数:
out - 基础输出流。
size - 缓冲区的大小。
抛出:
IllegalArgumentException - 如果 size <= 0
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Demo4:通过一个OutputStream对象来构造一个BufferedOutputStream对象。
  而FileOutputStream类是OutputStream类的子类,所以可以用它来构造。
-------------------------------------------------------------------------------

 1 import  java.io. * ;
 2
 3 public   class  StreamDemo  {
 4
 5   public   static   void  main(String[] args)  throws  Exception  {
 6   
 7   FileOutputStream fos  =   new  FileOutputStream( " 1.txt " );
 8   BufferedOutputStream bos  =   new  BufferedOutputStream(fos);
 9   bos.write( " http://www.cnblogs.com " .getBytes());
10  }

11
12 }

-------------------------------------------------------------------------------
运行结果:1.txt文件为空。原因:缓冲区没有写满,程序没有向文件写数据。
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
解决方法1:使用flush()方法:
-------------------------------------------------------------------------------
Demo4:使用flush()方法,可以使程序立即向文件写数据。
-------------------------------------------------------------------------------

 1 import  java.io. * ;
 2
 3 public   class  StreamDemo  {
 4
 5   public   static   void  main(String[] args)  throws  Exception  {
 6   
 7   FileOutputStream fos  =   new  FileOutputStream( " 1.txt " );
 8   BufferedOutputStream bos  =   new  BufferedOutputStream(fos);
 9   bos.write( " http://www.cnblogs.com " .getBytes());
10   
11   bos.flush();
12  }

13
14 }

-------------------------------------------------------------------------------
运行结果:数据被写入相应的文件。
-------------------------------------------------------------------------------
解决方法2:使用close()方法:
-------------------------------------------------------------------------------
Demo5:使用close()方法,同样可以使程序立即向文件写数据。
-------------------------------------------------------------------------------

 1 import  java.io. * ;
 2
 3 public   class  StreamDemo  {
 4
 5   public   static   void  main(String[] args)  throws  Exception  {
 6   
 7   FileOutputStream fos  =   new  FileOutputStream( " 1.txt " );
 8   BufferedOutputStream bos  =   new  BufferedOutputStream(fos);
 9   bos.write( " http://www.cnblogs.com " .getBytes());
10   
11   bos.close();
12  }

13
14 }

-------------------------------------------------------------------------------
运行结果:数据被写入相应的文件。
-------------------------------------------------------------------------------

flush()和close()的区别:
还要使用流对象,还需要写数据,使用flush(),否则使用close()。

另外,使用close()将关闭自己的流对象,同时会关闭与之相关的流对象,如FileOutputStream流。

-------------------------------------------------------------------------------
Demo6:使用BufferedInputStream流,从文件中读取数据。
  同样要用InputStream流对象或者其子类的对象来构造。
-------------------------------------------------------------------------------

 1 import  java.io. * ;
 2
 3 public   class  StreamDemo  {
 4
 5   public   static   void  main(String[] args)  throws  Exception  {
 6   
 7   FileOutputStream fos  =   new  FileOutputStream( " 1.txt " );
 8   BufferedOutputStream bos  =   new  BufferedOutputStream(fos);
 9   bos.write( " http://www.cnblogs.com " .getBytes());
10   
11   bos.close();
12   
13   FileInputStream fis  =   new  FileInputStream( " 1.txt " );
14   BufferedInputStream bis  =   new  BufferedInputStream(fis);
15    byte [] buf  =   new   byte [ 100 ];
16    int  len  =  bis.read(buf);
17   
18    //  使用String的这个构造方法:
19    //  String(byte[] bytes, int offset, int length)
20   System.out.println( new  String(buf,  0 , len));
21   bis.close();
22  }

23
24 }

-------------------------------------------------------------------------------
运行结果:输出http://www.cnblogs.com/
-------------------------------------------------------------------------------


3、DataInputStream和DataOutputStream 
     
过滤流,需要使用已经存在的节点流来构造,提供了读写Java中的基本数据类型的功能。
------------
Java API:
------------
java.io
类 DataOutputStream
java.lang.Object
  java.io.OutputStream
      java.io.FilterOutputStream
          java.io.DataOutputStream
所有已实现的接口:
Closeable, DataOutput, Flushable
public class DataOutputStream
extends FilterOutputStream
implements DataOutput

数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。


从以下版本开始:
JDK1.0
-------------------------------------------------------------------------------
构造方法摘要
DataOutputStream(OutputStream out)
          创建一个新的数据输出流,将数据写入指定基础输出流。
-------------------------------------------------------------------------------
DataOutputStream
public DataOutputStream(OutputStream out)
创建一个新的数据输出流,将数据写入指定基础输出流。计数器 written 被设置为零。

参数:
out - 基础输出流,将被保存供以后使用。
-------------------------------------------------------------------------------
Demo7:使用DataOutputStream流,将基本数据类型以二进制形式写入文件中。
  同样要用InputStream流对象或者其子类的对象来构造,
  这里使用BufferedOutputStream对象来构造。
-------------------------------------------------------------------------------

 1 import  java.io. * ;
 2
 3 public   class  StreamDemo  {
 4
 5   public   static   void  main(String[] args)  throws  Exception  {
 6   
 7   FileOutputStream fos  =   new  FileOutputStream( " dos.txt " );   //  获得写入文件功能
 8   BufferedOutputStream bos  =   new  BufferedOutputStream(fos);  //  获得缓冲功能
 9   DataOutputStream dos  =   new  DataOutputStream(bos);   //  获得写入基本类型功能
10   
11    /**/ /*
12    * 定义8种基本类型的对象
13     */

14    byte  b  =   3 ;
15    short  s  =   4 ;
16    int  i  =   78 ;
17    long  l  =   100000
18    char  ch  =   ' a ' ;
19    boolean  bl  =   false ;
20    float  f  =   4.5f ;
21    double  d  =   4.0001 ;
22   
23    /**/ /*
24    * 将8种基本类型的对象写入文件中
25     */

26   dos.writeByte(b);
27   dos.writeShort(s);
28   dos.writeInt(i);
29   dos.writeLong(l);
30 http://w
分享到:
评论

相关推荐

    stm单片机io管脚翻转实验

    STM单片机IO管脚翻转实验 STM单片机IO管脚翻转实验是 SINGLE-CHIP MICROCOMPUTER 的一个重要实验,它可以帮助我们了解单片机IO口的翻转速度和波形样式对比。实验使用的器件包括AT89S52、STM8和STM32等单片机,Keil3...

    VB例程_UI051_upperq99_USBCOM_vbusbocx_USB2IO转接芯片UI051_

    标题中的“VB例程_UI051_upperq99_USBCOM_vbusbocx_USB2IO转接芯片UI051”暗示了这个压缩包包含的是一组使用Visual Basic (VB)编写的例程,专门针对UI051转接芯片以及USB2IO设备的通信。UI051是一种USB到串口的转接...

    STM8S IO转uart.zip

    面对这种情况,"STM8S IO转uart.zip"提供的解决方案是利用IO端口模拟UART功能,以解决串口资源不足的问题。 首先,我们需要理解串口通信的基本原理。串口通信是一种同步串行通信协议,通常包括数据帧的起始位、数据...

    RapidIO转PCIe的桥接芯片资料

    RapidIO(SRIO)与PCI Express(PCIe)是两种不同的计算机系统互连技术。RapidIO是一种面向高可靠性和高性能的互连技术,多用于嵌入式系统中的多处理器通信,而PCIe是一种通用的高速串行计算机扩展总线标准,广泛...

    德国赫优讯(Hilscher)PROFINET IO转PROFIBUS网关NT50-PNS-DPM产品样本.pdf

    德国赫优讯(Hilscher)PROFINET IO转PROFIBUS网关NT50-PNS-DPM产品样本pdf,德国赫优讯(Hilscher)PROFINET IO转PROFIBUS网关NT50-PNS-DPM产品样本

    玩转430 之玩转IO

    "玩转430之玩转IO"的主题聚焦于Texas Instruments(TI)的MSP430系列微控制器的I/O特性与应用。MSP430是一款低功耗、高性能的16位微控制器,广泛应用于各种嵌入式系统设计,如物联网设备、传感器节点、智能仪表等。 ...

    java_io.rar_java 文件操作_java 读取 本地文件_java.io转动_文件操作

    本资源“java_io.rar”提供了关于如何在Java中进行文件操作的示例代码,包括读取、移动、删除和复制文件等常见任务。我们将深入探讨这些主题,以便更好地理解Java I/O API的使用。 首先,让我们从读取本地文件开始...

    KUKA 通过IO传输浮点数.docx

    KUKA 通过IO(输入/输出)传输浮点数是一种高效的数据交互方式,特别是在perfinet和EIP(以太网工业协议)这样的工业网络环境中。本文将详细解析如何利用KUKA的IO接口来实现浮点数和整数的传输。 首先,我们需要...

    golang将多路复异步io转成阻塞io的方法详解

    ### Golang将多路复用异步IO转成阻塞IO的方法详解 #### 前言 在Golang中处理网络通信时,开发者通常利用语言内置的高效并发机制(如goroutines和channels)来实现非阻塞IO或多路复用IO。然而,在某些场景下,我们...

    PCI转RapidIO桥的设计与实现

    ### PCI转RapidIO桥的设计与实现 #### 概述 随着嵌入式系统和高性能计算领域的快速发展,不同计算平台间的高效互联变得尤为重要。RapidIO作为一种新兴的高速网络技术,逐渐被应用于嵌入式系统中,特别是对于需要...

    IO控制led灯的亮度

    本主题将探讨如何利用IO(Input/Output)口控制灯具的亮度,特别是在ZigBee网络环境下。ZigBee是一种低功耗、短距离、无线通信协议,广泛应用于物联网设备间的通信。 首先,我们要理解基础的GPIO(General Purpose ...

    TIA博途-通过PEEK指令在TP900触摸屏上实现监控所有IO地址的具体方法示例.docx

    本示例主要介绍如何利用TIA博途中的PEEK指令在TP900触摸屏上实时监控所有的输入/输出(IO)地址。 首先,我们需要创建一个新的TIA博途项目,并添加一个数据块(DB)作为存储变量的容器。在这个例子中,我们使用了DB...

    可扩展型 远程IO模块系列说明书.zip

    《可扩展型远程IO模块系列详解》 在现代工业自动化领域,远程IO模块扮演着至关重要的角色,它们能够实现远程数据采集与控制,提高系统的灵活性和效率。本篇将深入探讨"可扩展型远程IO模块系列",主要依据提供的"可...

    [MacOS (AppleSilicon)] XMind +DrawIO

    MacOS平台必装文本图表设计工具 DrawIO + Xmind [MacOS (AppleSilicon)] DrawIO_23.0.2 + Xmind-24_03_04745 MacOS 平台 M1 芯片可用,快来下载吧!!! MacOS平台必装文本图表设计工具 DrawIO + Xmind [MacOS ...

    Unity M580 IO地址转换.zip

    在实际的系统设计和编程中,理解IO(输入/输出)地址转换至关重要,因为这关系到如何正确地配置硬件设备与PLC进行通信。下面将详细解释Unity M580 PLC的IO地址转换及相关知识点。 1. **Unity M580 PLC简介** Unity...

    mcgs批量自动生成IO监视表.zip,能够自动生成IO监视界面,此代码仅供学习参考

    这个“mcgs批量自动生成IO监视表.zip”压缩包提供了一种高效的方法来创建IO监视界面,特别适用于西门子PLC系统的应用。该工具能够显著减少程序员的工作量,通过自动化处理来提高开发效率。 首先,我们要理解IO表...

    Linux文件IO跟标准IO总结

    在Linux操作系统中,文件输入/输出(IO)是程序与数据交互的核心机制。本文将深入探讨Linux中的文件IO和标准IO,以及它们之间的差异。首先,我们从基本概念出发,理解这两种IO方式。 **文件IO**是Linux系统中最常见...

    Java IO commons-io-2.5.jar

    Java IO 是Java编程语言中处理输入/输出流的重要部分,它是连接程序与外部世界的桥梁,允许数据在程序和外部资源之间流动。`commons-io-2.5.jar` 是Apache Commons项目的一部分,它提供了一系列增强和扩展了Java标准...

Global site tag (gtag.js) - Google Analytics