`

IO(1)

    博客分类:
  • java
阅读更多

Java中的I/O(input/output)流是用来处理设备之间数据的传递的,用来操作流的对象都存放在JAVA.IO包中。

IO流的分类:

      按流向: 输入流和输出流

      按操作对象: 节符流和字节流

      按功能:节点流和处理流

JAVA中所提供的所有的流类型都继承于以下四个抽象流基类:

  字节流 字符流
输入流 InputStream Reader
输出流 OutputStream Writer

因为都是抽象的类,所以只能使用继承了基类的类来创建对象引用。

简单介绍一下:

InputStream:输入字节数据用的类。常用方法:

   abstract int read()  读取一个字节并以整数形式返回(0-255),如果返回-1则到了输入流的末尾。

   int read(byte [] b)  从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中,返回读入缓冲区的总字节数;如果因为已经到达  流末尾而不再有数据可用,则返回 -1。

  int read(byte []b,int off,int len) 读取len个字节并存入字符数组b中,返回实际读取的字节数,如果读到末尾返回-1.

  void close() 关闭并释放内存资源。

  long skin(long n) 跳过N个字节不读,返回实际跳过的字节数。

  int available()  返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。


Reader: 输入字符数据用的类

   常用方法与InputStream基本相同,没有int available()方法。

 

OutputStream:输出字节数据用的类。常用方法:

  void write(int b) 向输出流写入一个字节数据,为参数b的低8位

  void write(byte [] b) 将一个字节类型数组中的数据写入输出流

  void write(byte [] b,int off,int len) 将制定数组从制定位置开始到len结束的部分写入输出流

  void flush()  将输出流中缓冲的数据全部写出到目的地

  void close() 关闭流并释放内存资源

Writer:输出字符数据用的类

   常用方法与OutputStream类似,不过Writer的Write()方法支持对字符数组、单个字符、字符串、字符串一部分、字符数组一部分的输出。

缓冲流:

   缓冲流存在的前提必须是相应的流先存在,它对数据的读写提供了缓冲的功能,提高了对数据的读写效率,对流的功能进行了相应的增强。

JAVA提供了四种缓冲流:BufferedReader    BufferedWriter    BufferedInputStream BufferedOutputStream 。
BufferedReader 提供了readLine()方法方便用于读取一行字符串(\r \n标示)。

BufferedWriter  提供了newLine()方法用于写入一个行分隔符。

对于输出的缓冲流,写出的数据会先在缓存中存放,使用flush()可以将缓存中的数据全部读出,即刷新流。

练习:(需求:使用四种方式将C盘下一个MP3文件拷贝到D盘下)

import java.io.*;
public class CopyMp3 {
 public static void main(String[] args) {
  copy1();
  copy2();
  copy3();
  copy4();
 }
 // 不使用缓冲区
 public static void copy1() {
  FileInputStream fi = null;
  FileOutputStream fo = null;
  try {
   fi = new FileInputStream("c:\\fir.mp3");
   fo = new FileOutputStream("d:\\fir1.mp3");
   int num = 0;
   while ((num = fi.read()) != -1) {
    fo.write(num);
   }
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   if (fi != null) {
    try {
     fi.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
   if (fo != null) {
    try {
     fo.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
 }
 // 使用自定义缓冲区
 public static void copy2() {
  FileInputStream fi = null;
  FileOutputStream fo = null;
  try {
   fi = new FileInputStream("c:\\fir.mp3");
   fo = new FileOutputStream("d:\\fir2.mp3");
   int num = 0;
   byte[] b = new byte[1024 * 4];
   while ((num = fi.read(b)) != -1) {
    fo.write(b, 0, num);
   }
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   if (fi != null) {
    try {
     fi.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
   if (fo != null) {
    try {
     fo.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
 }
 // 使用刚好的缓冲区
 public static void copy3() {
  FileInputStream fi = null;
  FileOutputStream fo = null;
  try {
   fi = new FileInputStream("c:\\fir.mp3");
   fo = new FileOutputStream("d:\\fir3.mp3");
   byte[] b = new byte[fi.available()];
   fi.read(b);
   fo.write(b);
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   if (fi != null) {
    try {
     fi.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
   if (fo != null) {
    try {
     fo.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
 }
 // 使用缓冲流
 public static void copy4() {
  FileInputStream fi = null;
  FileOutputStream fo = null;
  BufferedInputStream bi = null;
  BufferedOutputStream bo = null;
  try {
   fi = new FileInputStream("c:\\fir.mp3");
   fo = new FileOutputStream("d:\\fir4.mp3");
   bi = new BufferedInputStream(fi);
   bo = new BufferedOutputStream(fo);
   int num = 0;
   while ((num = bi.read()) != -1) {
    bo.write(num);
   }
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   if (fi != null) {
    try {
     fi.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
   if (fo != null) {
    try {
     fo.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
 }
}

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/liuxiaolei7676/archive/2010/04/12/5478391.aspx

分享到:
评论

相关推荐

    51单片机开发,两个IO输入循环检测电平,串口输出IO口状态,两个IO口控制继电器,分别对应关系C代码详细介绍带注释.txt

    使用51单片机C语言编写的示例程序,用于检测两个IO口的电平状态,并通过串口输出状态,同时控制两个继电器的动作。该程序会每1ms检测一次电平状态,并且在检测到状态变化后... // IO1的状态:0为关闭,1为打开 unsigne

    逻辑IO与物理IO 逻辑IO与物理IO 逻辑IO与物理IO

    在计算机系统中,IO(Input/Output)操作是与外部设备进行通信的关键环节。IO 端口是指CPU与外部设备交互的接口,用于发送和接收数据。在不同的硬件架构中,IO 端口的管理和访问方式有所不同,主要分为逻辑IO和物理...

    lsgwr#linux-c-cpp#04_异步io1

    6.1 回顾同时读键盘、鼠标的方法、 6.2 异步IO的原理 6.3 使用异步IO方式读鼠标和键盘 6.3 使用异步IO时,应用层的设置步骤 6.4 代码演示

    Soem-1个IO模块输入IO显示及IO输出控制-添加代码注释-CSDN - EtherCAT主站-SOEM专栏的源代码

    注意: 该项目源代码提供了 QT-SOEM 配置从站到OP状态,并且对1个EtherCAT从站 IO模块进行操作,包括:IO输出控制,IO采集进行显示。 源代码 主要功能: 获取网卡信息,绑定网卡,配置EtherCAT网络,等待从站进入OP...

    网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO.pdf

    同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non...

    PlatformIO 离线安装资源

    1. **跨平台支持**:PlatformIO可在Windows、macOS和Linux等操作系统上运行,提供一致的开发体验。 2. **多框架集成**:它不仅支持Arduino框架,还支持Micropython、CMSIS-DSP、mbed等多个嵌入式开发框架,使得...

    socket.io,socket.io-client下载

    1. **服务器端设置**:在Node.js项目中,导入`socket.io`模块,初始化服务器并监听特定端口,然后使用`io.on('connection', (socket) => {})`来处理新连接和事件。 2. **客户端连接**:在Java或Android应用中,导入...

    IO端口和IO内存详解

    几乎每一种外设都是通过读写设备上的寄存器来进行...CPU对外设IO端口物理地址的编址方式有两种:一种是I/O映射方式(I/O-mapped),另一种是内存映射方式(Memory-mapped)。而具体采用哪一种则取决于CPU的体系结构。

    socket.io-client-unity3d:Unity3D的socket.io-Client,与socket.io v1.x兼容

    Socket.IO-客户端-Unity3D 产品特点 Unity3D的Socket.IO客户端,与Socket.IO v1.0及更高版本兼容。 (当前不支持Socket.IO V2。) Socket.io是开源实时应用程序框架。 Socket.io组页面: : 版本控制 Socket.IO-...

    RapidIO V3.0

    在RapidIO V3.0规范中,包含了几个核心组件,其中Part 1: Input/Output Logical Specification 3.0是规范的基础部分。在这一部分中,详细描述了RapidIO协议的基础逻辑,包括数据包的格式、传输协议、流控制机制、...

    intouch IOserver 全

    1. 驱动配置:首先,用户需要在Intouch中配置相应的IO驱动,为每个PLC设备选择正确的驱动程序。这通常涉及到设置通讯参数,如波特率、数据位、停止位和奇偶校验。 2. 连接建立:一旦驱动配置完成,Intouch会尝试建立...

    Linux文件IO跟标准IO总结

    1. **缓冲机制**:标准IO有自己的缓冲区,而文件IO通常没有,除非手动开启缓冲。 2. **性能**:标准IO因为有缓冲,可能在大量数据传输时表现更好;而文件IO通常更快,尤其是小块数据的读写。 3. **灵活性**:文件IO...

    很给力的IO按键扫描电路,老外的5个IO可以驱动25个按键

    在电子设计中,IO按键扫描电路是一个常见的技术挑战,尤其是当资源有限且需要处理大量按键输入时。本文探讨了一种高效的方法,通过5个IO口驱动25个按键,大大节省了硬件资源。 首先,传统的按键扫描方法通常采用行...

    rapidIO嵌入式系统互连_rapidio_rapidIO嵌入式系统互连_rapidio嵌入式_嵌入式_

    1. **RapidIO基本原理**:介绍RapidIO协议的基本结构、数据传输机制和协议栈。 2. **RapidIO硬件设计**:讲解如何设计和实现RapidIO接口,包括物理层和数据链路层的实现。 3. **RapidIO软件支持**:阐述如何在操作...

    系统IO跟标准IO的连续与区别

    1. 系统 IO 在读写文件时,每次操作都会执行相关系统调用,这样处理的好处是直接读写实际文件,坏处是频繁的系统调用会增加系统开销。标准 IO 可以看成是在文件 IO 的基础上封装了缓冲机制,先读写缓冲区,必要时再...

    stm单片机io管脚翻转实验

    1. 编写C语言程序来控制单片机IO口的翻转。 2. 使用示波器来观察波形的变化。 3. 改变编译器、单片机类型和时钟频率等因素来观察IO口翻转速度和波形样式的变化。 实验结果: * AT89S52单片机:IO口翻转速度约为333...

    platformio.platformio-ide-2.4.3

    platformio.platformio-ide-2.4.3

    DDRIO模块简要使用说明

    DDRIO(Double Data Rate Input/Output)模块是Xilinx FPGA设计中用于实现高速数据传输的关键组件。这个模块的独特之处在于其支持在时钟的上升沿和下降沿同时处理数据,从而实现了双倍数据速率(DDR),极大地提高了...

    drawio.js源码

    1. **图形渲染**:drawio.js的核心是图形渲染引擎,它使用SVG(可缩放矢量图形)作为基础,实现了图形的精确绘制和缩放。SVG的优势在于其矢量特性,无论放大多少倍都能保持清晰度,这对于绘图工具至关重要。 2. **...

Global site tag (gtag.js) - Google Analytics