-----------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):如果append为true,则为追加写入
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));
}
带缓冲区的字节流:
BufferedInputStream和BufferedOutputStream
通过定义数组的方式确实比以前一次读取一个字节的方式快很多,所以,看来有一个缓冲区还是非常好的。
既然是这样的话,那么,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
转换流:InputStreamReader和OutputStreamWriter
把字节流转换为字符流。
字符流 =字节流 +编码表。
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()仅仅刷新缓冲区,刷新之后,流对象还可以继续使用。
字符流类:FileWriter和FileReader
字节流:
输出流: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;
带缓冲功能的字符流:
BufferedWriter和BufferdReader
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培训、期待与您交流! -------