Java IO流

原创 2018年04月16日 11:13:25

本文章仅供Java的初学者查阅和学习

    跟大家分享一下我的Java IO流的学习心得

在学习一个新知识前,我们应该先对它的概念进行了解:

概念理解:                          绝对路径与相对路径

                        所谓“绝对路径”就是从根目录开始一直到该目录的全程的路径。

举个例子:"c:\apache\htdocs\cgi-bin\test.cgi"就是文件test.cgi的绝对路径。

                        所谓“相对路径”就是相对于当前目录的路径。

举个例子:例如当前目录目录是 "c:\apache\htdocs" 你要浏览 c:\apache\htdocs\cgi-bin\test.cgi文件的内容,那么只需在命令行里输入 "type cgi-bin\test.cgi" 就可以了,要是在"c:\apache\htdocs\cgi-bin\xyz"下呢,那么就是 "type ..test.cgi"。

简单说:绝对路径必须从哪个盘开始,相对路径是从当前目录开始操作。

            注意:     绝对路径是不变的,而相对路径是随用户工作目录的变化而变化。


                            2:字符流和字节流

简单来说:如果你能打开一个文档(文件)并能读懂里面的内容,文档里面的内容就是字符流,如果读不懂就是字节流大笑

            3:每种流的命名都是以其基类的名字作为后缀
遍历一个父目录下的所有子目录的算法
/
* 自定义一个父目录字符串然后将它   转化为抽象路径;
* 遍历该抽象路径的所有子目录,如   果是文件夹就输出
* 运用递归的方法来遍历

*/

                                                4:输入和输出流的类

字节流:InputStream OutputStream
字符流:  Reader      Writer
实质:
输出流方法:把程序里的数据传到文档里
输出流方法:把文档里的数据传到程序里

                        ________________________________________________________________

                                                                下面,我们开始详细学习

首先,我们来看看IO流的结构图


InputStream是所有输入流的超类,OutputStream是所有输出类的超类

它们的子类结构图如下




每个子类都对应相应的数据类型的输入流和输出流,这个详细的可以看API文档(有附件)

                                        下面讲解子类的介绍和类方法

InputStream类

InputStream类{
ByteArrayInput
StringBufferInputStream 
FileInputStream
}

上面表示的是三种基本的介质流,分别从Byte数组、StringBuffer、和本地文件读取数据PipedInputStream是从与其他线程共用的管道中读取数据ObjectInputStream和所有的FileInputStream的子类都是装饰流(装饰器模式的主角)


InputStream类的方法
abstract int read();读取一个字节数据,并返回读到的数据,如果返回-1,表示读到了末尾
                    int read(byte[]):将数据读入一个字符数组,相当于缓冲器的作用
                    intread(byte[], int off, int len) :将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。off指定在数组b中存放数据的起始偏移位置;len指定读取的最大字节数。
流结束的判断:方法read(0的返回值为-1时;readLine()的返回值为null
long skip(long n):在输入流中跳过n个字节,并返回时机跳过的字节数
int available():返回在不发生阻塞的情况下,可读取的字节数
void close() 关闭输入流,释放和这个流相关的系
统资源
void mark(int readlimit)在输入流的当前位置放置一个标志,如果读取的字节数多余readlimit设置的值,则流忽略这个标记
void reset(): 返回上一个标记
boolean markSupported()测试当前流是否支持mark和reset方法,,返回值:true和false


OutputStream类

实质:OutputStream是所有的输出字节流的父类,它是一个抽象类

ByteArrayOutputStream、FileOutputStream是两种基本的介质流,他们分别向Byte数组、和本地文件中写入数据.

PipedOutputStream是向与其它线程共用的管道中写入数据。

ObjectOutputStream和所有的FileOutputStream的子类都是装饰流


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():关闭输出流,释放和这个流相关的系统资源

字符输入流Reader

实质:Reader是所有的输入字符流的父类,它是一个抽象类。

CharReader、StringReader是两种基本的介质流,它们分别将Char数组、String中读取数据。

PipedReader是从与其它线程共用的管道中读取数据。

BufferedReader很明显就是一个装饰器,它和其子类负责装饰其它Reader对象。

FileReader是所有自定义具体装饰流的父类,其子类Pushback对Reader对象进行装饰,会增加一个行号

InputStreamReader是一个连接字节流和字符流的桥梁,他将字节流转为字符流。


Reader的三个基本方法:
 public int read() throws IOException; //读取一个字符,返回值为读取的字符 
 public int read(char cbuf[]) throws IOException; /*读取一系列字符到数组cbuf[]中,返回值为实际读取的字                                                                                                                                     符的数量*/ 
 public abstract int read(char cbuf[],int off,int len) throws IOException; 
读取len个字符,从数组cbuf[]的下标off处开始存放,返回值为实际读取的字符数量,该方法必须由子类实现
 
字符输出流:Write
实质:Writer是所有的输出字符流的父类,它是一个抽象类。
CharArrayWriter、StringWriter是两种基本的介质流,它们分别向Char数组、String中写入数据。PipedWriter           是向与其它线程共用的管道中写入数据,
BufferedWriter     是一个装饰器为Writer提供缓冲功能。
PrintWriter和PrintStream极其类似,功能和使用也非常相似。
OutputStreamWriter是OutputStream到Writer转换的桥梁,它的子类FileWriter其实就是一个实现此功能的具体类(具体可以研究一SourceCode)。功能和使用和OutputStream极其类似.
主要方法:
(1)  public void write(int c) throws IOException; //将整型值c的低16位写入输出流 
(2)  public void write(char cbuf[]) throws IOException; //将字符数组cbuf[]写入输出流 
(3)  public abstract void write(char cbuf[],int off,int len) throws IOException; //将字符数组cbuf[]中的从索引为off的位置处开始的len个字符写入输出流 
(4)  public void write(String str) throws IOException; //将字符串str中的字符写入输出流 
(5)  public void write(String str,int off,int len) throws IOException; //将字符串str 中从索引off开始处的len个字符写入输出流                                                    _______________________________________________________________________________                                             

                                    拓展:字符流与字节流转换、

先了解字节流跟字符流

字节流没有缓冲区,是直接输出的,而字符流是输出到缓冲区的。因此在输出时,字节流不调用colse()方法时,信息已经输出了,而字符流只有在调用close()方法关闭缓冲区时,信息才输出。要想字符流在未关闭时输出信息,则需要手动调用flush()方法。
·     读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
· 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。

转换流的特点:

1.    其是字符流和字节流之间的桥梁
2.    可对读取到的字节数据经过指定编码转换成字符
3.    可对读取到的字符数据经过指定编码转换成字节

何时使用转换流?
1.    当字节和字符之间有转换动作时;
2.    流操作的数据需要编码或解码时。


 IOException异常类的子类
public class  EOFException :   非正常到达文件尾或输入流尾时,抛出这种类型的异常。    
 public class FileNotFoundException:   当文件找不到时,抛出的异常。
 public class InterruptedIOException: 当I/O操作被中断时,抛出这种类型的异常。
















JavaSE高级篇---(IO流+多线程+XML+Socket+swing)

肖老师的这套课程,针对有一定Java基础的学员,详细讲解了多线程、XML、Socket、Swing、IO流、反射、注解,还有传值与传址的区别 、递归算法等,使学员熟练掌握JavaSE技术。
  • 2016年09月29日 15:01

Java的例外处理和IO流

  • 2009年04月25日 10:21
  • 106KB
  • 下载

JAVA IO流小结

  • 2011年08月29日 10:33
  • 27KB
  • 下载

Java 常用IO流操作详解

IO流大家肯定不陌生,简单整理了一下常用IO流基本用法,其他的IO流以后有时间在整理。 1.基本概念IO:Java对数据的操作是通过流的方式,IO流用来处理设备之间的数据传输,上传文件和下载文件,...
  • MAGIC_JSS
  • MAGIC_JSS
  • 2016-05-22 17:19:31
  • 15207

Java中常见的IO流及其使用

Java中常见的IO流的介绍及使用: ByteArrayInputStream & ByteArrayOutputStream FileInputStream & FileOutputStream P...
  • sunqunsunqun
  • sunqunsunqun
  • 2015-07-09 19:54:49
  • 4554

java IO流学习总结

Java中的流,可以从不同的角度进行分类。     按流的方向分:输入流和输出流。     按处理数据单位分:字节流和字符流。     按实现功能分:节点流和处理流。       输出流:     ...
  • du_minchao
  • du_minchao
  • 2015-10-11 12:35:20
  • 20336

java io流最详解

初学Java,一直搞不懂java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂。而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正,也希望大家提出宝贵意见...
  • sinat_22797429
  • sinat_22797429
  • 2016-11-13 20:31:38
  • 1222

java中的IO流实现文件的复制下载

public HttpServletResponse download(String path, HttpServletResponse response) {         try {    ...
  • m0_37704670
  • m0_37704670
  • 2017-10-13 09:42:19
  • 238

Java中的IO流总结

Java中的IO流总结 1. 流的继承关系,以及字节流和字符流。 2. 节点流FileOutputStream和FileInputStream和处理流BufferedInputStream和Bu...
  • u013309870
  • u013309870
  • 2016-08-03 20:03:22
  • 1812

Java中IO流学习总结

Java中IO流学习总结一.IO流中的结构 字符流:顾名思义,该流只能处理字符,但处理字符速度很快 字节流:可以处理所有以bit为单位储存的文件,也就是说可以处理所有的文件,但是在处理字符上的速度不如...
  • Yue_Chen
  • Yue_Chen
  • 2017-05-26 18:00:19
  • 1867
收藏助手
不良信息举报
您举报文章:Java IO流
举报原因:
原因补充:

(最多只允许输入30个字)