`
mifi_cheung
  • 浏览: 6649 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

I/0

    博客分类:
  • Java
阅读更多
I/O流
流的概念:程序与数据来源之间的桥梁

流的分类:
按数据方向分:输入流和输出流
输入流:InputStream/Reader
OutputStream/Writer
按数据类型分:字节流和字符流
字节流:InputStream/OutputStream
字符流:Reader/Writer
按流的功能分:节点流和处理流
节点流用操作数据的来源。
处理流用来封装节点流,从而给节点流增加一个功能,不能独立存在,在关闭流时如果使用了处理流,只需关闭最外层的流就可以了。
区分节点流和处理流的小方法:
看构造器,节点流参数为数据来源,而处理流参数为其他流。

选择流的思路:
先考虑是输入流还是输出流,
再考虑是字节流还是字符流,
最后考虑是节点流还是处理流。

字符流:Reader和Writer所有字符流的父类型
Java技术使用Unicode来表示字符串和字符,而且提供16位版本的流,以便用类似的方法处理字符。
如果构造了一个连接到流的Reader和Writer,转换规则会在使用缺省平台所定义的字节编码和Unicode之间切换。

桥梁流:InputStreamReader和OutputStreamWriter(字节流转化成字符流的桥转换器)
这两个类不是用于直接输入输出的,他是将字节流转换成字符流的桥转换器,并可以指定编解码方式。

逐行读写流:BufferedReader/BufferedWriter
以上两个都是过滤流,需要用其他的节点流来作参数构造对象。
BufferedReader的方法:readLine():String ,当他的返回值是null时,就表示读取完毕了。要注意,再写入时要注意写换行符,否则会出现阻塞。
BufferedWriter的方法:newLine() ,这个方法会写出一个换行符。

管道流:线程交互的时候使用
PipedInputStream/PipedOutputStream
传送输出流可以连接到传送输入流,以创建通信管道。传送输出流是管道的发送端。通常,数据由某个线程写入 PipedOutputStream 对象,并由其他线程从连接的 PipedInputStream 读取。
注意:管道输出流和管道输入流需要对接。

数据流:DataInputStream和DataOutputStream
通过流来读写Java基本类,注意DataInputStream和DataOutputStream的方法是成对的。
支持直接输出输入各种数据类型。
注意:使用DataOutputStream/DataInputStream时,要注意写入顺序和读取顺序相同,否则会将没有分割写入的信息分割不正确而读取出错误的数据。

Properties类:针对属性文件(*.properties,内容是name=value)进行操作,在java.util包下
load(InputStream inStream)
          从输入流中读取属性列表(键和元素对)。
          getProperty(String key)
          用指定的键在此属性列表中搜索属性。

java编码方式:
编码:把字符转换成数字存储到计算机中,按ASCII将字母映射为整数。
解码:把数字从计算机转换成相应的字符的过程。

不同的国家有不同的编码,当编码方式和解码方式不统一时,产生乱码。
因为美国最早发展软件,所以每种的编码都向上兼容ASCII 所以英文没有乱码。
ASCII(英文)                 1个字符占一个字节(所有的编码集都兼容ASCII)
ISO8859-1(拉丁文)    1个字符占一个字节
GB-2312/GBK          1个字符占两个字节(多用于中文)
Unicode              1个字符占两个字节(网络传输速度慢)
UTF-8                变长字节,对于英文一个字节,对于汉字两个或三个字节。

中文编码时出现乱码的情况:
用流操作文件。
网页(动态静态)。
网络传递消息。

解决乱码的方式:
String temp = 乱码的字符串
temp = new String(temp.getBytes("ISO8859-1") , "GBK")  
将temp按照ISO8859-1的方式进行解码生成一个字节序列,然后在按照GBK的方式解码字节序列生成字符串。

File类:可表示文件或者目录
File下的方法是对磁盘上的文件进行磁盘操作,但是无法读写文件的内容。

构造器:
File(String pathname) //以文件的路径做参数

File类的方法:
boolean createNewFile()
创建一个新文件
File createTempFile(String prefix, String suffix, File directory)
           在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。会在前缀和后缀之间加一个随机数
boolean mkdir()
创建一个新目录
boolean delete()
删除文件,删除的是创建File对象时指定与之关联创建的那个文件。
String[] List()
返回当前File对象下所有显文件和目录名(相对路径)
File[] ListFiles()
返回当前File对象(必须是目录)下的所有File对象,可以用getName()来访问到文件名。
boolean isDirectory()和boolean isFile()
判断究竟是目录还是文件。
boolean exists()
判断文件或文件夹是否存在。
String getPath()
获得相对路径。
String getAbsolutePath()
获得文件的绝对路径

注意:
File类的对象实施表示一个文件并不是真正的文件,只是一个代理而已,通过这个代理来操作文件
创建一个文件对象和创建一个文件在java中是两个不同的概念。前者是在虚拟机中创建了一个文件,但却并没有将它真正地创建到OS的文件系统中,随着虚拟机的关闭,这个创建的对象也就消失了。而创建一个文件才是在系统中真正地建立一个文件。
例如:
File f=new File(“11.txt”); //创建一个名为11.txt的文件对象
f.CreateNewFile();     //真正地创建文件

RandomAccessFile:
允许随机访问文件,类支持直接输出输入各种数据类型。

构造器:
RandomAccessFile(File file, String mode)
          创建从中读取和向其中写入(可选)的随机存取文件流,该文件由 File 参数指定。
RandomAccessFile(String name, String mode)
          创建从中读取和向其中写入(可选)的随机存取文件流,该文件具有指定名称。
mode( r:以只读方式打开      rw:可读可写,不存在则创建)

相关方法:
long getFilePointer()
返回文件指针的当前位置。
void seek(long pos)
设置文件指针到给定的绝对位置。
long length()
返回文件的长度。

对象流:ObjectInputStream和ObjectOutputStream(实现对象序列化)
对象流是过滤流,需要节点流作参数来构造对象,用于直接把对象写入文件和从文件中读取对象。
只有实现了Serializable接口的类型的对象才可以被读写,Serializable接口是个标记接口,其中没有定义方法。
对象会序列化成一个二进制代码,文件中保存对象的属性。

writeObject(o)、readObject()这两个是对象读写操作时用的方法。
Object o = new Object();
FileOutputStream fos=new FileOutputStream("Object.txt");
ObjectOutputStream oos=new ObjectOutputStream(fos);
oos.writeObject(o);
oos.close();

FileInputStream fis =new FileInputStream(“Object.txt”);
ObjectInputStream ois =new ObjectInputStream(fis);
Object o = (Object)Ois.readObject();
ois.close();

一个类中有其他类型的对象,那么,这个类实现了Serializable接口,在对象序列化时,也同样要求这个类中属性都能够对象序列化(基本类型除外)。

注意:
对于对象流的操作,在写对象时要一次写入完毕,如果使用追加模式写入,只会读取到上一次写入的对象,使用对象流写入时,会先写入一个头部,然后写入数据,最后加上结束符号,如果使用追加方式写入的话,那就会在结束符号继续向下写入,但是在读取时只会读到结束符为止,以后再次写入的数据就会丢失。

I/O流
对象流:ObjectInputStream和ObjectOutputStream
对象流是过滤流,需要节点流作参数来构造对象,用于直接把对象写入文件和从文件中读取对象。
只有实现了Serializable接口的类型的对象才可以被读写,Serializable接口是个标记接口,其中没有定义方法。
对象会序列化成一个二进制代码。

writeObject(o)、readObject()这两个是对象读写操作时用的方法。
Object o = new Object();
FileOutputStream fos=new FileOutputStream("Object.txt");
ObjectOutputStream oos=new ObjectOutputStream(fos);
oos.writeObject(o);
oos.close();

FileInputStream fis =new FileInputStream("Object.txt");
ObjectInputStream ois =new ObjectInputStream(fis);
Object o = (Object)ois.readObject();
ois.close();

transient只能用来修饰属性。表示这个属性在对象序列化时将被忽略。
transient int num;
表示当我们进行序列化时忽略这个属性。

注意:
对于对象流的操作,在写对象时要一次写入完毕,如果使用追加模式写入,只会读取到上一次写入的对象。使用对象流写入时,会先写入一个头部,然后写入数据,最后加上结束符号,如果使用追加方式写入的话,那就会在结束符号继续向下写入,但是在读取时只会读到结束符为止,以后再次写入的数据就会丢失。
包名、类名和属性可以被序列化,方法和构造器不会被序列化的。
静态属性不会被序列化的。
属性会被递归序列化的,也就是一个类中有引用类型的属性,如果这个属性对应的类实现了Serializable接口,在对象序列化时,也同样会对这个类中的属性进行对象序列化,如果没有实现Serializable接口,则会抛出异常。
所有属性必须都是可序列化的,特别是当有些属性本身也是对象的时候,要尤其注意这一点。
网络中传递对象必须实现序列化。

nio无阻塞的I/O(优化的I/O)
java.nio   定义块
Buffer类:一种用于特定的基本类型数据的容器
缓冲:就是块,用来存储内容。
容量:内存开辟的大小,根据类型的不同,有不同的空间。
界限:可用部分,即不应读取或写入的第一个元素的索引。
位置:当前指针的位置,从0开始。
容量>=界限>=位置

相关方法:
int capacity()
          返回此缓冲区的容量。
          int limit()
          返回此缓冲区的界限。
          int position()
          返回此缓冲区的位置。
          Buffer flip()
          相当于截断没有用的空间,然后把指针移向开头,使limit=position,position=0
          Buffer position(int newPosition)
          设置此缓冲区的位置。
         
当有大的文件需要处理的时候,为了不影响性能建议用直接缓冲。
Buffer有直接缓冲和间接缓冲两种。
只有ByteBuffer类提供了直接缓冲。使用直接缓冲,不影响程序。其它类想用直接缓冲需要进行转换。

java.nio.channels    对块进行读写的通道,类似于以前的流
Channel接口:用于 I/O 操作的连接

编程步骤:
a. 先创建一个I/O流,
b. 使用I/O流.getChannel()方法,获得通道,
c. 创建大小合适的ByteBUffer,
d. 通道的对象.read(buffer)/write(buffer)进行读写,
e. 关闭所有的流和通道,
f. 如果有多线程并发,可以使用"通道.lock()"获得FileLock对象,用FileLock.release() 释放此锁定。
g. 当遇到编码问题,使用CharSet、CharsetDecoder、CharsetEncoder三个类去解决

注意:
在读之前需要调用一下clear()方法,帮助读操作清理缓冲;写之前需要调用flip()方法,帮助写操作清理缓冲。

java.nio.charset    字符集,进行编码解码
Charset类:编码类,编码的信息
forName(String charsetName)
生成一个CharSet实例。
decode(ByteBuffer bb)
          将此 charset 中的字节解码成 Unicode 字符的便捷方法。
          encode(CharBuffer cb)
          将此 charset 中的 Unicode 字符编码成字节的便捷方法。
         
CharsetDecoder类:解码器
能够把特定 charset 中的字节序列转换成 16 位 Unicode 字符序列的引擎。

CharsetEncoder类:编码器,编码的行为
能够把 16 位 Unicode 字符序列转换成特定 charset 中字节序列的引擎。
      
分享到:
评论

相关推荐

    MPC41010 SPI 模拟I/0

    调试OK!AVR16 SPI的模拟I/0通讯,效果很好!可下

    微型以太网I/O控制器(12路I/O、1路RS-232).pdf

    4. I/O功能:12路数字I/O可以进行高电平(+5V)和低电平(0V)的读写操作。I/O口为TTL电平,输出低电平时驱动电流大约为10~20mA,高电平时为0.2mA。 5. 隔离与保护:控制器的以太网与I/O、RS-232、电源之间使用...

    I O地址译码 微机实验报告

    在实验中,这八个输出线Y0至Y7分别对应微机I/O地址范围内的不同端口。例如,Y0对应280H到287H,以此类推。当CPU执行I/O指令,并且所指定的地址位于280H到2BFH之间时,译码器会选定一个相应的输出线,输出一个负脉冲...

    C++ I/O流课件 很不错的哦

    C++中的I/O流是程序与外部世界交互的重要机制,主要涉及输入操作(读操作)和输出操作(写操作)。I/O流的概念来源于数据流,它就像一条河流,允许数据从一个源头流向另一个目的地。在C++中,数据流是以字节序列的...

    I/O接口实验

    I/0接口,中断,地址译码;对单片机相关内容进行讲解

    Linux下必用的I/O 操作手段I/O文件

    在Linux操作系统中,I/O操作是程序与外部设备交互的关键途径。系统调用是用户空间程序与内核交互的桥梁,提供了对操作系统功能的访问。Linux系统调用包括多种类型,其中I/O相关的调用是程序员必须掌握的重要部分,...

    I/O LINK 模块的设置

    北京 FANUC 0i-B /0i-Mate-B 系统,由于I/O 点、手轮脉冲信号都连在I/O LINK 总线上,在PMC梯形图编辑之前都要进行I/O 模块的设置(地址分配),同时也要考虑到手轮的连接位置。

    IBM Power服务器I/O Drawer硬件特性及介绍

    IBM Power服务器I/O Drawer是IBM推出的一种用于扩展服务器I/O能力的硬件设备,主要针对POWER6和POWER7架构的服务器。这些I/O Drawer提供了多种型号,包括fc#5802,fc#5877和fc#5803,以满足不同用户的扩展需求。 fc...

    51单片机I/0扩展的芯片-8155应用举例

    经常我们会发现我们的单片机上的I/O又不够用了,这时8155便可以轻松解决你的问题~!~!

    51单片机I/O必看

    1. **I/O口结构**:51单片机有4个8位并行I/O端口,即P0、P1、P2和P3。每个端口包含8个可单独编程的引脚,可用于输入或输出。 2. **I/O口模式**:每个I/O口既可以配置为输入模式,也可以设置为输出模式。在输入模式...

    Windows Socket五种I/O模型——代码全攻略

    ### Windows Socket五种I/O模型详解 在计算机网络编程中,Windows Socket(Winsock)是实现网络通信的重要机制之一。为了高效地处理网络数据传输,Winsock提供了多种输入/输出(I/O)模型来满足不同场景下的需求。...

    SIMATIC S7-1500/ET 200MP 模拟量输入模块 AI 8xU/I/RTD/TC ST[手册].pdf

    SIMATIC S7-1500/ET 200MP 模拟量输入模块 AI 8xU/I/RTD/TC ST[手册]pdf,

    如何实现单片机用一个I/O采集多个按键信号

    二、基于模数转换的AD键盘 我们知道按键检测实际上是检测连接按键的端口的高低电平值,在单个I/O口检测单个按键时,只是简单的判断连接按键的端口的电平是高电平(+5V)还是低电平(0V)。那么是否可以通过电平的...

    运放组成的V/I和I/V变换电路设计

    V/I变换电路和I/V变换电路是其中的两个典型应用,分别实现电压到电流的转换和电流到电压的转换。这类变换在信号采集、处理和控制中非常关键。本知识点将详细介绍运放组成的各种V/I和I/V变换电路设计,以及相关技术...

    I/O口输入、输出实验

    I/O口输入、输出实验 P0口做输出口,接八只LED,编写程序,使LED循环点亮,间隔0.5秒

    FANUC 0i数控系统 I/O解决方案.pdf

    FANUC 0i数控系统 I/O解决方案pdf,FANUC 0i数控系统 I/O解决方案

    介绍当前Windows支持的各种Socket I/O模型

    ### 当前Windows支持的各种Socket I/O模型 在现代操作系统中,网络编程是不可或缺的一部分,而Socket I/O模型则是实现高效网络通信的关键技术之一。本文将详细介绍当前Windows系统中支持的各种Socket I/O模型,包括...

    Intel英特尔ICH7R/ICH8R/ICH9R/ICH10R系列南桥芯片组Matrix Storage Manager驱动

    Intel英特尔ICH7R/ICH8R/ICH9R/ICH10R系列南桥芯片组Matrix Storage Manager驱动最新8.2.3.1001官方正式版For WinXP/XP-64/2003/2003-64/Vista/Vista-64(2008年7月3日发布)Intel Matrix Storage Manager是英特尔...

Global site tag (gtag.js) - Google Analytics