`

Java IO 操作与字节流 简述

    博客分类:
  • java
阅读更多

File类

一个File类的对象,表示了磁盘上的文件或目录。
File类提供了与平台无关的方法来对磁盘上的文件或目录进行操作


流式I/O

流(Stream)是字节的源或目的。
两种基本的流是:输入流(Input Stream)和输出流(Output Stream)。可从中读出一系列字节的对象称为输入流。而能向其中写入一系列字节的对象称为输出流。
流的分类
节点流:从特定的地方读写的流类,例如:磁盘或一块内存区域。
过滤流:使用节点流作为输入或输出。过滤流是使用一个已经存在的输入流或输出流连接创建的。
InputStream
三个基本的读方法
         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

三个基本的写方法
        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的类层次


基本的流类


FileInputStream和FileOutputStream
       节点流,用于从文件中读取或往文件中写入字节流。如果在构造FileOutputStream时,文件已经存在,则覆盖这个文件。


BufferedInputStream和BufferedOutputStream
       过滤流,需要使用已经存在的节点流来构造,提供带缓冲的读写,提高了读写的效率。


DataInputStream和DataOutputStream
         过滤流,需要使用已经存在的节点流来构造,提供了读写Java中的基本数据类型的功能。


PipedInputStream和PipedOutputStream
       管道流,用于线程间的通信。一个线程的PipedInputStream对象从另一个线程的PipedOutputStream对象读取输入。要使管道流有用,必须同时构造管道输入流和管道输出流。


Java I/O库的设计原则
Java的I/O库提供了一个称做链接的机制,可以将一个流与另一个流首尾相接,形成一个流管道的链接。这种机制实际上是一种被称为Decorator(装饰)设计模式的应用。
通过流的链接,可以动态的增加流的功能,而这种功能的增加是通过组合一些流的基本功能而动态获取的。
我们要获取一个I/O对象,往往需要产生多个I/O对象,这也是Java I/O库不太容易掌握的原因,但在I/O库中Decorator模式的运用,给我们提供了实现上的灵活性。
I/O流的链接
Reader和Writer
Java程序语言使用Unicode来表示字符串和字符。
Reader和Writer这两个抽象类主要用来读写字符流。
java.io包中Reader的类层次
java.io包中Writer的类层次


字符集的编码
ASCII(American Standard Code for Information Interchange,美国信息互换标准代码),是基于常用的英文字符的一套电脑编码系统。我们知道英文中经常使用的字符、数字符号被计算机处理时都是 以二进制码的形式出现的。这种二进制码的集合就是所谓的ASCII码。每一个ASCII码与一个8位(bit)二进制数对应。其最高位是0,相应的十进制 数是0-127。如,数字“0”的编码用十进制数表示就是48。另有128个扩展的ASCII码,最高位都是1,由一些制表符和其它符号组成。ASCII 是现今最通用的单字节编码系统。
GB2312:GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集-基本 集》。主要用于给每一个中文字符指定相应的数字,也就是进行编码。一个中文字符用两个字节的数字来表示,为了和ASCII码有所区别,将中文字符每一个字 节的最高位置都用1来表示。
GBK:为了对更多的字符进行编码,国家又发布了新的编码系统GBK(GBK的K是“扩展”的汉语拼音第一个字母)。在新的编码系统里,除了完全兼容GB2312 外,还对繁体中文、一些不常用的汉字和许多符号进行了编码。
ISO-8859-1:是西方国家所使用的字符编码集,是一种单字节的字符集 ,而英文实际上只用了其中数字小于128的部分。

 


字符集的编码
Unicode:这是一种通用的字符集,对所有语言的文字进行了统一编码,对每一个字符都用2个字节来表示,对于英文字符采取前面加“0”字节的策略实现等长兼容。如 “a” 的ASCII码为0x61,UNICODE就为0x00,0x61。
UTF- 8:Eight-bit UCS Transformation Format,(UCS,Universal Character Set,通用字符集,UCS 是所有其他字符集标准的一个超集)。一个7位的ASCII码值,对应的UTF码是一个字节。如果字符是0x0000,或在0x0080与0x007f之 间,对应的UTF码是两个字节,如果字符在0x0800与0xffff之间,对应的UTF码是三个字节。
RandomAccessFile
RandomAccessFile类同时实现了DataInput和DataOutput接口,提供了对文件随机存取的功能,利用这个类可以在文件的任何位置读取或写入数据。
RandomAccessFile类提供了一个文件指针,用来标志要进行读写操作的下一数据的位置。

 


对象序列化
将对象转换为字节流保存起来,并在日后还原这个对象,这种机制叫做对象序列化。
将一个对象保存到永久存储设备上称为持续性。
一个对象要想能够实现序列化,必须实现Serializable接口或Externalizable接口。

 


对象序列化
当一个对象被序列化时,只保存对象的非静态成员变量,不能保存任何的成员方法和静态的成员变量。
如果一个对象的成员变量是一个对象,那么这个对象的数据成员也会被保存。
如果一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列化操作将会失败,并且会抛出一个NotSerializableException。我们可以将这个引用标记为transient,那么对象仍然可以序列化。

 


总结
InputStream和OutputStream:字节流的输入输出。
Reader和Writer:字符流的输入输出。
流的链接(Java I/O库的设计原则)

分享到:
评论
1 楼 happy_javaboy 2010-10-20  
两种基本的流是输入流和输出流?

相关推荐

    Java输入输出流(IO)教程

    8)简述Java中标准输入输出流(如System类的输入输出流)的操作方法及其重定向的技术;11)讨论过滤输入流和过滤输出流的作用和使用示例,最后给出了一系列文件读写的实际代码范例,并讨论了处理IO异常的方法。适用...

    Java基础知识点.html

    类加载器 ClassLoader 反射 Stream 流 函数式编程 Lambda 表达式 网络编程-协议 网络编程-端口 网络编程-IP 多线程 IO流-字节流 IO流-字符流 IO流-转换流 File Map HashMap 序列化和反序列化 可变参数 类型通配符 ...

    第10章IO.docx

    1. **简述字符流与字节流的区别** 字节流和字符流的主要区别在于它们处理数据的基本单位不同: - **字节流**:以8位字节为单位,适合处理二进制数据。 - **字符流**:以16位字符为单位,适合处理文本数据。 2...

    Java各个包简述.pdf

    16. **java.io**:I/O流相关的类,用于文件读写、数据序列化和网络通信。 17. **java.lang**:基础类库,包括Object、String、Math等核心类,以及反射和异常处理。 18. **java.lang.annotation**:支持注解的类和...

    北大Java教学PPT

    7. **IO流与NIO**:讲解Java的输入输出流体系,包括字节流、字符流以及缓冲流的使用。还会涉及Java NIO(非阻塞I/O)框架,以提高程序的效率。 8. **多线程**:介绍Java并发编程的基础,包括线程的创建、线程同步...

    java学习笔记markdown

    4. **IO流**:介绍输入/输出流的概念,包括文件操作、字节流、字符流、对象序列化等。这部分内容涉及数据的读写和传输。 5. **网络编程**:讲解Socket编程,如何创建客户端和服务器进行网络通信,以及HTTP、HTTPS...

    java编程那些事儿-陈跃峰71-102

    7. **IO类体系**:Java的IO体系包括字符流和字节流,以及缓冲流、转换流和过滤流等。理解这些流的概念,以及如何使用InputStream、OutputStream、Reader、Writer等类进行数据的读写,是进行文件操作和网络通信的基础...

    JAVA思维导图9张!

    8. **Java标准库API**:这部分可能会简述Java的主要包,如java.util、java.io、java.net和java.awt,以及它们包含的重要类和接口。 9. **Java高级特性**:最后,思维导图可能涉及Java的最新特性,如lambda表达式、...

    java面试题.rar

    Java IO流分为字节流和字符流,又分为输入流和输出流。NIO(New Input/Output)引入了通道和缓冲区的概念,提供非阻塞I/O操作,相比传统的阻塞IO,提高了性能。 8. **设计模式** - 你能列举几个常见的设计模式,...

    java面试题目大全

    - `&` 是位运算符,也可以用作逻辑运算符,在布尔表达式中将两边的操作数视为布尔值进行按位与操作。当用作逻辑运算符时,如果两边的操作数都为 true,则整个表达式的结果为 true;如果任一边的操作数为 false,则...

    java高级练习题 java 高级

    4. **IO流**:Java的IO流处理能力强大,分为字节流和字符流,还有输入流和输出流。NIO(New IO)是Java提供的一种更高效的数据传输方式,包含通道(Channel)、缓冲区(Buffer)和选择器(Selector)等概念。 5. **...

    Java核心技术 PDF(文字版 有目录 可以复制粘贴文字)

    6. **输入/输出流**:介绍I/O流的概念,如字节流和字符流,以及文件操作、对象序列化和缓冲区的使用。 7. **泛型**:讲解泛型的基本概念,其在集合和方法中的应用,以及通配符和边界限制。 8. **枚举和注解**:...

    疯狂java讲义(第2版)随书光盘

    4. **IO流**:阐述Java I/O流的概念,包括字节流和字符流,文件操作,缓冲流,对象序列化,以及NIO(New IO)框架的使用。 5. **多线程**:讲解线程的创建与管理,同步与通信机制(synchronized关键字,wait()、...

    PDF--java咖啡馆

    5. **输入/输出流**:讲解文件操作和IO流,包括字节流和字符流,以及缓冲区的概念,如何进行文件读写和数据的传输。 6. **多线程**:介绍并发编程的基础,包括线程的创建、同步机制(如synchronized关键字和wait/...

    java入门经典教程

    8. **IO流**:讲解Java的输入输出流,包括文件操作、字符流、字节流、缓冲流和对象序列化。 9. **多线程**:介绍并发编程的基本概念,如线程的创建、同步机制(synchronized关键字、wait()、notify()方法等),以及...

    Java培训教程课件

    7. **IO流**:介绍输入/输出流的概念,包括文件操作、字节流、字符流、缓冲流、对象序列化等。 8. **多线程**:讲解线程的创建、同步控制(synchronized,wait/notify,Lock接口等)以及线程池。 9. **反射机制**...

    北大java讲义ppt

    10. **输入/输出流**:介绍Java I/O系统,包括文件操作、字节流和字符流,以及缓冲流和对象序列化。 11. **集合框架**:讲解ArrayList、LinkedList、HashSet、HashMap等容器的使用,以及泛型和迭代器的概念。 12. ...

    java训前习题

    7. **IO流**:字节流、字符流、缓冲流、对象序列化,以及File类的相关操作。 8. **多线程**:线程的创建(Thread类和Runnable接口)、同步机制(synchronized关键字、wait/notify、Lock接口及其实现)。 9. **反射...

    JAVA经典教程带课件清华大学讲稿

    6. **IO流与NIO**:介绍Java的输入输出流系统,包括文件操作、字符流和字节流,以及最新的非阻塞I/O(New IO)框架。 7. **多线程**:讲解如何创建和管理线程,线程同步和互斥,以及线程池的使用。 8. **反射与...

    张孝祥java就业培训教程(完整版电子书)

    5. **IO流**:讲解输入输出流的概念,包括文件操作、字符流与字节流、缓冲流、对象序列化等。 6. **多线程**:介绍如何创建和管理线程,线程同步和互斥,以及线程池的使用。 7. **网络编程**:讲解Socket编程,...

Global site tag (gtag.js) - Google Analytics