黑马程序员——高新技术---Java基础-IO流

来源:互联网 发布:阿里云为什么要幕布 编辑:程序博客网 时间:2024/05/19 18:18

-----------android培训java培训、java学习型技术博客、期待与您交流!------------ 

IO流用来处理设备之间的数据传输:上传文件和下载文件

Java对数据的操作是通过流的方式。

Java用于操作流的对象都在IO包中。

IO流:对文件进行读取和写入的流:

站在应用程序的角度:

输入:从外部,向应用程序中读取数据。

输出:从应用程序,向外部写出数据。


IO流基类概述和一个简单的需求分析

 类层次结构:                

字节流:

                         输出流:OutputStream(抽象的)

                         输入流:InputStream(抽象的)                

字符流:

                         输出流:Writer(抽象的)                        

输入流:Reader(抽象的)

 

 练习:向项目根目录下的一个文件:output.txt写入一个字符串:HelloWorld

 1.向文件中写数据:使用输出流:OutputStream

 2.向文件中写:使用子类:FileOutputStream; 


 构造方法:

  FileOutputStream(Stringname):使用name作为文件路径,构造一个通向这个文件的输出流管道;

  FileOutputStream(File file):使用File作为文件路径,构造一个通向这个文件的输出流管道;

 

FileOutputStream写入数据:

  public void write(int b):输出一个字节;

  public void write(byte[] b):输出一个byte数组(常用)

  public void write(byte[]b,int off,int len):输出一个byte数组的一部分(常用)

 

 关闭流:

close();

 

换行符:

 windows:\r\n

 

 追加写入:

 需要使用FileOutputStream另外的构造方法:

public FileOutputStream(File file,boolean append):如果appendtrue,则为追加写入

publicFileOutputStream(String fileName , boolean append):

 

字节流:

                输出流:OutputStream

                                 |--FileOutputStream:

                输入流:InputStream

                                |--FileInputStream:

 

InputStream输入流:

 

 构造方法:

 FileInputStream(File file)

 FileInputStream(String name)

 读取的方法:

 public int read():一次读取一个字节。当读到文件末尾,返回-1

 public int read(byte[] b):一次读取一个字节数组;

 

常用的读取字节的代码:

(1):

int n = 0;

while((n =in.read()) != -1){

System.out.println("读取的字节:" + n);

System.out.println("转换为字符:" + (char)n); 

}

(2):

byte[] bys = newbyte[1024];

intlen = 0;

while((len = fis.read(bys)) != -1) {

System.out.print(newString(bys, 0, len));

}

 

带缓冲区的字节流:

BufferedInputStreamBufferedOutputStream 

通过定义数组的方式确实比以前一次读取一个字节的方式快很多,所以,看来有一个缓冲区还是非常好的。

 既然是这样的话,那么,java开始在设计的时候,它也考虑到了这个问题,就专门提供了带缓冲区的字节类。

 这种类被称为:缓冲区类(高效类)

 写数据:BufferedOutputStream

 读数据:BufferedInputStream

 

字节流:

        输出流:OutputStream:

                 |--FileOutputStream()

                |--FilterOutputStream(没学)

                        |--BufferedOutputStream()

        输入流:InputStream:

                |--FileInputStream()

                |--FilterInputStream(没学)

                        |--BufferedInputStream();

                                

 BufferedOutputStream:内部使用构造方法提供OutputStream类型的对象去操作底层流输出。BufferedOutputStream类本身只提供了一些"缓冲"的一些功能;

  构造方法:

         BufferedOutputStream(OutputStreamout)创建一个新的缓冲输出流,以将数据写入指定的底层输出流。

         BufferedOutputStream(OutputStreamout, int size)创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。

成员方法:

没有;

 为什么不传递一个具体的文件或者文件路径,而是传递一个OutputStream对象呢?

原因很简单,字节缓冲区流仅仅提供缓冲区,为高效而设计的。但是呢,真正的读写操作还得靠基本的流对象实现。

 

BufferedInputStream读取数据

 

  构造方法:

 BufferedInputStream(InputStream in)创建一个BufferedInputStream并保存其参数,即输入流 in,以便将来使用。

 BufferedInputStream(InputStream in, int size)创建具有指定缓冲区大小的 BufferedInputStream并保存其参数,即输入流 in,以便将来使用。

 读取方法:

        无,都是从父类继承的;


String(byte[]bytes, String charsetName):通过指定的字符集解码字节数组

byte[]getBytes(String charsetName):使用指定的字符集合把字符串编码为字节数组


编码:把看得懂的变成看不懂的

 String -- byte[]


 解码:把看不懂的变成看得懂的

byte[] -- String

 

转换流:InputStreamReaderOutputStreamWriter

把字节流转换为字符流。

 字符流 =字节流 +编码表。

InputStreamReader(InputStreamis):用默认的编码读取数据

InputStreamReader(InputStreamis,String charsetName):用指定的编码读取数据

 

InputStreamReader的方法:

 int read():一次读取一个字符

intread(char[] chs):一次读取一个字符数组

 

OutputStreamWriter(OutputStreamout):根据默认编码把字节流的数据转换为字符流

OutputStreamWriter(OutputStreamout,String charsetName):根据指定编码把字节流数据转换为字符流


OutputStreamWriter的方法:

 public void write(int c):写一个字符

 public void write(char[] cbuf):写一个字符数组

 public void write(char[] cbuf,int off,intlen):写一个字符数组的一部分

 public void write(String str):写一个字符串

 public void write(String str,int off,int len):写一个字符串的一部分

 

 面试题:close()flush()的区别?

  A:close()关闭流对象,但是先刷新一次缓冲区。关闭之后,流对象不可以继续再使用了。

  B:flush()仅仅刷新缓冲区,刷新之后,流对象还可以继续使用。

 

字符流类:FileWriterFileReader

 字节流:

                 输出流:OutputStream

                 输入流:InputStream

 字符流:

                 输出流:Writer:

                                 |--OutputStreamWriter(转换流 )

                                                 |--FileWriter(基本字符流)

                                

                 输入流:Reader:

                                 |--InputStreamReader:(转换流)

                                                 |--FileReader(基本字符流)

 

 FileWriter:

 构造方法:

FileWriter(File file)根据给定的 File对象构造一个 FileWriter对象。

FileWriter(File file, boolean append):根据给定的File对象构造一个 FileWriter对象。

FileWriter(String fileName):根据给定的文件名构造一个FileWriter对象。

FileWriter(String fileName, boolean append):根据给定的文件名以及指示是否附加写入数据的 boolean值来构造FileWriter 

 成员方法

         无,都是继承的:5种写的方法;

 ------------------------------------------------------------------------------------------------------------------------

FileReader:

 构造方法:

  FileReader(File file):在给定从中读取数据的 File的情况下创建一个新 FileReader

 FileReader(String fileName)在给定从中读取数据的文件名的情况下创建一个新 FileReader

 成员方法:

         无,都是继承的:2种读的方法;

 

  复制文本文件:

  1.输入流:FileReader;

  2.输出流:FileWriter;

 

带缓冲功能的字符流:

BufferedWriterBufferdReader

BufferedWriter:

Writer:

        |--BufferedWriter:

 

  构造方法:

 BufferedWriter(Writer out):创建一个使用默认大小输出缓冲区的缓冲字符输出流。

  BufferedWriter(Writer out,int sz):创建一个使用给定大小输出缓冲区的新缓冲字符输出流。

 

  写的方法:

         无。全是继承的:5种写的方法:

 

  特有的方法:

         voidnewLine():输出一个换行符;

BufferdReader

 Reader:

        |--BufferedReader:

 

 构造方法:

 BufferedReader(Reader in)创建一个使用默认大小输入缓冲区的缓冲字符输入流。

 BufferedReader(Reader in, intsz):创建一个使用指定大小输入缓冲区的缓冲字符输入流。

 读的方法:

         1.继承了父类的读的方法:2种需要掌握:(一次读一个字符,一次读一个字符数组)

         2.String readLine():一次读取一行文本(不带换行符)

 

 

IO流小结:

 

IO

|--字节流

 

|--字节输入流

InputStream

int read():一次读取一个字节

int read(byte[] bys):一次读取一个字节数组

 

|--FileInputStream

|--BufferedInputStream

 

|--字节输出流

OutputStream

void write(int by):一次写一个字节

void write(byte[] bys,int index,int len):一次写一个字节数组的一部分

 

|--FileOutputStream

|--BufferedOutputStream

|--字符流

 

|--字符输入流

Reader

int read():一次读取一个字符

int read(char[] chs):一次读取一个字符数组

 

|--InputStreamReader

|--FileReader

|--BufferedReader

String readLine():一次读取一个字符串

 

|--字符输出流

Writer

void write(int ch):一次写一个字符

void write(char[] chs,int index,int len):一次写一个字符数组的一部分

 

|--OutputStreamWriter

|--FileWriter

|--BufferedWriter

void newLine():写一个换行符

 

void write(String line):一次写一个字符串

 

案例:(多练)

A:复制文本文件 5种方式(掌握)

B:复制图片(二进制流数据) 4种方式(掌握)

C:把集合中的数据存储到文本文件

D:把文本文件中的数据读取到集合并遍历集合

E:复制单级文件夹

F:复制单级文件夹中指定的文件并修改名称

回顾一下批量修改名称

G:复制多级文件夹

H:键盘录入学生信息按照总分从高到低存储到文本文件

I:把某个文件中的字符串排序后输出到另一个文本文件中

J:Reader模拟BufferedReader的特有功能

K:模拟LineNumberReader的特有功能

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

0 0
原创粉丝点击