Java:IO流

IO流

 

1.I是指Input(输入),O是指Output(输出)。

 

2.在Java中,文件的输入和输出是通过流(Stream)来实现的,流的概念源于Unix中管道(pipe)的概念。在Unix系统中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。

 

3.一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL。对于流而言,我们不用关心数据是如何传输的,只需要向源端输入数据,向目的端获取数据即可

 

4.流按照处理数据的单位,可以分为字节流和字符流;按照流向分为输入流和输出流(注意:输入流和输出流都是站在程序的角度参照的)。

 

 

字节流

 

1.节流用于处理以字节为单位的二进制文件(如音乐、图片等),

 

2.InputStream抽象类是所有输入字节流类的直接或间接父类,FileInputStream是其重要子类:

 

FileInputStream常用构造方法:

 

①FileInputStream(File file) :通过File对象(注:此时的File对象代表一个文件,不能是一个目录。)创建FileInputStream对象。

 

②FileInputStream(String name) :通过文件(非“目录”)路径创建FileInputStream对象。

 

FileInputStream常用方法:

 

①int read():从输入流中读取单个字节的数据;如果已到达文件末尾,则返回 -1。

 

②int read(byte[] b):从输入流中将最多b.length个字节的数据读入一个byte数组中,以整数形式返回存入数组中的实际字节个数;如果已到达文件末尾,则返回 -1。

 

③void close():关闭此文件输入流并释放与此流有关的所有系统资源。

 

3.OutputStream抽象类是所有输出字节流类的直接或间接父类,FileOutputStream是其重要子类:

 

FileOutputStream常用构造方法:

 

①FileOutputStream(File file) :通过File对象(注:此时的File对象代表一个文件,不能是一个目录)创建FileOutputStream对象。

 

②FileOutputStream(String name) :通过文件(非“目录”)路径创建FileOutputStream对象。

 

③FileOutputStream(File file, boolean append):通过File对象(此时的File对象代表一个文件,不能是一个目录。)创建FileOutputStream对象;第二个参数如果为true ,则字节将被写入文件的末尾而不是开头。

 

FileOutputStream常用方法:

 

①void write(int b):将指定的单个字节数据写入此文件输出流。

 

②void write(byte[] b, int off, int len):将byte数组中从off开始的len个字节写入此文件输出流。

 

③void flush():刷新字节输出流并强制写出缓冲内所有字节数据。

注意: FileOutputStream(File file) 、 FileOutputStream(String name) 或FileOutputStream(File file, false)创建FileOutputStream对象时会创建一个新的空文件;如果使用FileOutputStream(File file, true)创建FileOutputStream对象,则只在第一次执行时创建一个新的空文件。

 

④void close():关闭此文件输出流并释放与此流有关的所有系统资源。

注意: FileOutputStream(File file) 、 FileOutputStream(String name) 或FileOutputStream(File file, false)创建FileOutputStream对象时会创建一个新的空文件;如果使用FileOutputStream(File file, true)创建FileOutputStream对象,则只在第一次执行时创建一个新的空文件。

 

注:创建FileOutputStream对象的同时创建一个空文件;但因为第二个参数为true,所以再次执行该行代码不会创建新文件。

 

注:(从上至下)

File类构造输出流,其中第二个参数设置为true(即将字节写入文件末尾处,而不是写入文件开始处)

 

个读取输入流中的数据

 

向输出流中逐个存入字

 

刷新字节输出流并强制写出缓冲内所有字节数据。

 

关闭并释放资源

 

 

注:设置局部变量缓冲数组bufferArray,read方法会将字节保存到该数组中并返回实际写入bufferArray数组的元素个数,这样减少了循环次数,提高了复制效率。

 

Java虚拟机将字节转化为2个字节的Unicode字符就形成了字符流,字符流用于处理以Unicode字符为单位的文本文件(如记事本文件等)。

 

Reader抽象类是所有输入字符流类的直接或间接父类, FileReader是其重要子类:

 

FileReader常用构造方法:

 

      ①FileReader(File file) :通过File对象(此时的File对象代表一个文件,不能是一个目录。)创建FileReader对象。

 

      ②FileReader(String fileName) :通过文件(非“目录”)路径创建FileReader对象。

 

FileReader常用方法:

 

      ①int read():从输入流中读取单个字符的数据,如果已到达流的末尾,则返回 -1 。

 

     ②int read(char[] cbuf):从输入流中将最多cbuf.length个字符的数据读入一个char数组中,以整数形式返回存入数组中的实              际字节个数,如果已到达流的末尾,则返回 -1 。

 

    ③void close():关闭此文件输入流并释放与此流有关的所有系统资源。

 

Writer抽象类是所有输出字符流类的直接或间接父类,FileWriter是其重要子类:

 

FileWriter常用构造方法:

 

①FileWriter(File file) :通过File对象(此时的File对象代表一个文件,不能是一个目录。)创建FileWriter对象。

 

②FileWriter(String fileName) :通过文件(非“目录”)路径创建FileWriter对象。

 

③FileWriter(File file, boolean append):通过File对象(此时的File对象代表一个文件,不能是一个目录。)创建FileWriter对象;第二个参数如果为true ,则字节将被写入文件的末尾而不是开头。

 

FileWriter常用方法:

 

①void write(int c):将指定的单个字符数据写入此文件输出流。

 

②void write(char[] cbuf, int off, int len):将char数组中从off开始的len个字符写入此文件输出流。

 

③void flush():刷新字符输出流缓冲。

 

④void close():关闭此文件输出流并释放与此流有关的所有系统资源。

 

注意: FileWriter (File file) 、 FileWriter (String fileName) 或FileWriter (File file, false)创建FileWriter对象时会创建一个新的空文件;如果使用FileWriter (File file, true)创建FileWriter对象,则只在第一次执行时创建一个新的空文件。

 

注:创建FileWriter对象的同时创建一个空文件;但因为第二个参数为true,所以再次执行该行代码不会创建新文件。

 

注:(从上至下)

 

将C盘文档文件夹中的笔记.txt文件拷贝到D盘根目录

 

逐个读取Reader字符流中的字符

 

逐个向Writer字符流中存入字符

 

刷新字符输出流缓冲

 

关闭并释放资源

 

注:设置局部变量缓冲数组bufferArrayread方法会将字符保存到该数组中并返回实际写入bufferArray数组的元素个数,这样减少了循环次数,提高了复制效率

 

缓冲流

 

缓冲流是一种装饰器类,目的是让原字节流、字符流新增缓冲的功能以提高读取或写入。

 

缓冲字节输入流:

BufferedInputStream(InputStream in):

 

缓冲字节输出流:

BufferedOutputStream(OutputStream out):

 

缓冲流实现二进制文件拷贝

注:获取每次循环实际写入bufferArray数组的元素个数

 

缓冲字符输入流:

BufferedReader(Reader in):

 

缓冲字符输出流:

BufferedWriter(Writer out):

 

缓冲流实现文本文件拷贝

注:(从上至下)

 

逐行从Reader缓冲流中读取

 

逐行向Writer缓冲流中写入数据

 

写入一个分行符,否则内容在一行显示

 

刷新Writer缓冲流缓冲区

 

转换流

 

转换流仅用于将字节流转换成字符流。

 

InputStreamReader(字节输入流à字符输入流):

  • InputStreamReader(InputStream in) :
  • InputStreamReader(InputStream in, String charsetName):

 

OutputStreamWriter(字节输出流à字符输出流):

  • OutputStreamWriter(OutputStream out) :
  • OutputStreamWriter(OutputStream out, String charsetName) :

注:将字节流System.in通过InputStreamReader转换成字符流

 

根据前面所学知识,可以通过字符流或者缓冲字符流实现文本文件的复制,但是这种复制方法有可能会出现乱码,为了解决该问题可以通过字节流+转换流实现文本文件的复制。

 

注:

乱码:如果一个字符按照某种字符集进行存储,而使用另一种字符集读取该字符,则就会出现乱码现象。

 

 

数据流(了解)

 

通过DataInputStreamDataOutputStream数据流可以直接操作基本数据类型和字符串,如下代码:

 

 

 

 

 

 

posted @ 2018-10-18 23:00  龙雪  阅读(144)  评论(0编辑  收藏  举报