IO流
一、IO流概述
1、IO流用来处理设备之间的数据传输
上传文件和下载文件
2、Java对数据的操作是通过流的方式
3、Java用于操作流的对象都在IO包中
二、
IO
流分类
1、按照数据流向
输入流
读入数据
输出流
写出数据
2、按照数据类型
字节流
字符流
3、什么情况下使用哪种流呢
?
如果数据所在的文件通过
windows
自带的记事本打开并能读懂里面的内容,就用字符流。其他用字节流。
如果你什么都不知道,就用字节流
三、
IO
流常用基类
1、字节流的抽象基类:
InputStream,OutputStream。
2、字符流的抽象基类:
Reader, Writer。
注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。
如:InputStream的子类FileInputStream。
如:Reader的子类FileReader。
四、
IO流应用
1、字节流写数据
FileOutputStream
的构造方法:
FileOutputStream
(File file);
FileOutputStream
(String name)
字节流写数据的方式
lpublic void write(int b):一次写一个字符
lpublic void write(byte[] b):一次写一个字节数组
lpublic void write(byte[]b,intoff,intlen):一次写字节数组的一部分
2、字节流读数据
FileInputStream的构造方法:FileInputStream(File file);FileInputStream(String name)
FileInputStream的成员方法
public int read():一次读取一个字符;publicintread(byte[] b):一次读取一个字节数组
【案例】
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/*
* 将read.txt的内容复制到write.txt
* 其实read.txt和write.txt可以是任何文件
*/
public class InputOutputStream {
public static void main(String[] args) {
FileOutputStream fos = null;
FileInputStream fis = null;
try {
fos = new FileOutputStream("write.txt");
fis = new FileInputStream("read.txt");
byte[] bys = new byte[1024];
int len = 0;
while ((len = fis.read(bys)) != -1) {// 从文件中读取数据
fos.write(bys);// 将该数据写进另一个文件中
System.out.print(new String(bys, 0, len));// 将读取的数据输出到控制台
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();// 关闭输出流
} catch (IOException e) {
e.printStackTrace();
}
}
if (fis != null) {
try {
fis.close();// 关闭输入流
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
【思考】
(1)创建字节输出流到底做了哪些事情?
A:调用系统功能去创建文件
B:创建fos对象
C:把fos对象指向这个文件
(2)数据写成功后,为什么要close()?
A:让流对象变成垃圾,这样就可以被垃圾回收器回收了
B:通知系统去释放跟该文件相关的资源
(3)如何实现数据的换行?
windows:"\r\n";linux:"\n";Mac":\r"
(4)如何实现数据的追加写入?
用构造方法带第二个参数是true的情况即可
3、字节流转换成字符流:由于字节流操作中文不是特别方便,所以,java就提供了转换流。字符流=字节流+编码表。
(1)OutputStreamWriter字符输出流构造方法
public
OutputStreamWriter
(
OutputStream
out)
public
OutputStreamWriter
(
OutputStream
out,String
charsetName
)
(2)
InputStreamReader
字符输入流构造方法
public
InputStreamReader
(
InputStream
in)
public
InputStreamReader
(
InputStream
in,String
charsetName
)
(3)
OutputStreamWriter
写数据方法
publicvoid write(
int
c)//一次写一个字符
publicvoid write(char[]
cbuf
)//一次写一个字符数组
publicvoid write(char[]
cbuf,int
off,int
len
)
publicvoid write(String
str
)//一次写一个字符串
publicvoid write(String
str,int
off,int
len
)
(4)
OutputStreamWriter
读数据方法
public
int
read()
public
int
read(char[]
cbuf
)//一次读取应该字符数组
【案例】
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
/*
* 将read.txt的内容复制到write.txt
* 其实read.txt和write.txt可以是任何文件
*/
public class InputOutputStream {
public static void main(String[] args) {
OutputStreamWriter osw = null;
InputStreamReader isr = null;
try {
osw = new OutputStreamWriter(new FileOutputStream("write.txt"));
isr = new InputStreamReader(new FileInputStream("read.txt"));
char[] bys = new char[1024];
int len = 0;
while ((len = isr.read(bys)) != -1) {// 从文件中读取数据
osw.write(bys);// 将该数据写进另一个文件中
System.out.print(new String(bys, 0, len));// 将读取的数据输出到控制台
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (osw != null) {
try {
osw.close();// 关闭输出流
} catch (IOException e) {
e.printStackTrace();
}
}
if (isr != null) {
try {
isr.close();// 关闭输入流
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
【思考】
(1)flush()
的作用
刷新缓冲区
(2)close()和flush()的区别?
A:close()关闭流对象,但是先刷新一次缓冲区。关闭之后,流对象不可以继续再使用了。
B:flush()仅仅刷新缓冲区,刷新之后,流对象还可以继续使用。
B:flush()仅仅刷新缓冲区,刷新之后,流对象还可以继续使用。
4、
转换流的名字比较长,而我们常见的操作都是按照本地默认编码实现的,所以,为了简化我们的书写,转换流提供了对应的子类:
FileWriter和
FileReader。
5、缓冲流:提高IO流的读写速率。
(1)字节缓冲流
字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,这是加入了数组这样的缓冲区效果,
java
本身在设计的时候,也考虑到了这样的设计,
所以提供了字节缓冲区流。
字节缓冲输出流:
BufferedOutputStream;
字节缓冲输入流:
BufferedInputStream
(2)字符缓冲流
BufferedWriter和
BufferedReader。特殊功能:
void
newLine
()换行;StringreadLine()读取一行。
【例子】
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/*
* 将read.txt的内容复制到write.txt
* 其实read.txt和write.txt可以是任何文件
*/
public class InputOutputStream {
public static void main(String[] args) {
BufferedWriter bw = null;
BufferedReader br = null;
try {
// 封装数据
bw = new BufferedWriter(new FileWriter("write.txt"));
br = new BufferedReader(new FileReader("read.txt"));
String line = null;
while ((line = br.readLine()) != null) {// 从文件中读取一行数据
bw.write(line);// 将该行数据写进另一个文件中
bw.newLine();// 换行
bw.flush();// 刷新缓存区
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bw != null) {
try {
bw.close();// 关闭输出流
} catch (IOException e) {
e.printStackTrace();
}
}
if (br != null) {
try {
br.close();// 关闭输入流
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}