一、IO流概述
IO流:Java对数据的操作是通过流的方式,IO流用来处理设备之间的数据传输,上传文件和下载文件,Java用于操作流的对象都在IO包中。
二、IO流的分类
按流向分:
输入流: 程序可以从中读取数据的流。
输出流: 程序能向其中写入数据的流。
按数据传输单位分:
字节流: 以字节为单位传输数据的流
字符流: 以字符为单位传输数据的流
常用的IO流
InputStream(字节输入流):继承自InputStream的流都是用于向程序中输入数据的,且数据单位都是字节(8位)。
OutputStream(字节输出流):继承自OutputStream的流都是程序用于向外输出数据的,且数据单位都是字节(8位)。
Reader(字符输出流):继承自Reader的流都是用于向程序中输入数据的,且数据单位都是字符(16位)。
Writer(字符输出流):继承自Writer的流都是程序用于向外输出数据的,且数据单位都是字符(16位)。
三、字节流常用操作
1、inputStream读入 方法(一次读取一个字节)
try {
InputStream inputStream = new FileInputStream(new File("f://hezhi.txt"));
int i = 0;
//一次读取一个字节
while ((i = inputStream.read()) != -1) {
System.out.print((char) i);
}
//关闭IO流
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
2、inputStream读入方法(一次读取N个字节)
try {
InputStream inputStream = new FileInputStream(new File("f://hezhi.txt"));
byte[] b = new byte[2];
int i = 0;
// 一次读取一个字节数组
while ((i = inputStream.read(b)) != -1) {
System.out.print(new String(b, 0, i) + " ");
}
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
3、OutputStream写出方法(一次写出1个字节)
try {
OutputStream outputStream = new FileOutputStream(new File("f://hezhi.txt"));
// 写出数据
outputStream.write("ABCD".getBytes());
// 关闭IO流
outputStream.close();
// 内容追加写入
OutputStream outputStream2 = new FileOutputStream("f://hezhi.txt", true);
// 输出换行符
outputStream2.write("\r\n".getBytes());
// 输出追加内容
outputStream2.write("hello".getBytes());
// 关闭IO流
outputStream2.close();
} catch (Exception e) {
e.printStackTrace();
}
4、BufferedInputStream字节缓冲流(高效流)
try {
InputStream in = new FileInputStream("f://Hezhi.txt");
// 字节缓存流
BufferedInputStream bis = new BufferedInputStream(in);
byte[] bs = new byte[20];
int len = 0;
while ((len = bis.read(bs)) != -1) {
System.out.print(new String(bs, 0, len));
}
// 关闭流
bis.close();
} catch (Exception e) {
e.printStackTrace();
}
5、BufferedOutputStream字节缓冲流(高效流)
try {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("f://Hezhi.txt", true));
// 输出换行符
bos.write("\r\n".getBytes());
// 输出内容
bos.write("Hello Hezhi".getBytes());
// 刷新此缓冲的输出流
bos.flush();
// 关闭流
bos.close();
} catch (Exception e) {
e.printStackTrace();
}
三、字符流常用操作
1.Reader
Reader:读取字符流的抽象类.
常用方法:
// 读取单个字符
int read()
// 将字符读入数组
int read(char[] cbuf)
// 将字符读入数组的某一部分
abstract int read(char[] cbuf, int off, int len)
// 跳过字符
long skip(long n)
// 关闭该流并释放与之关联的所有资源
abstract void close()
try {
FileReader fileReader = new FileReader("f://Hezhi.txt");
int len = 0;
while ((len =fileReader.read())!=-1){
System.out.print((char) len);
}
} catch (Exception e) {
e.printStackTrace();
}
![image.png](https://upload-images.jianshu.io/upload_images/15721586-5f543eb7760a0dc1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
1.Writer
Writer:写入字符流的抽象类.
常用方法:
// 写入字符数组
void write(char[] cbuf)
// 写入字符数组的某一部分
abstract void write(char[] cbuf, int off, int len)
// 写入单个字符
void write(int c)
// 写入字符串
void write(String str)
// 写入字符串的某一部分
void write(String str, int off, int len)
// 将指定字符添加到此 writer
Writer append(char c)
// 将指定字符序列添加到此 writer
Writer append(CharSequence csq)
// 将指定字符序列的子序列添加到此 writer.Appendable
Writer append(CharSequence csq, int start, int end)
// 关闭此流,但要先刷新它
abstract void close()
// 刷新该流的缓冲
abstract void flush()
实例:
try {
FileInputStream fileInputStream = new FileInputStream("f://IMG_2275.MP4");
FileOutputStream fileOutputStream = new FileOutputStream("f://22IMG_2275.MP4");
int len = 0;
byte[] bytes = new byte[1024];
long time = System.currentTimeMillis();
while ((len = fileInputStream.read(bytes,0,bytes.length))!=-1){
fileOutputStream.write(bytes,0,bytes.length);
}
fileOutputStream.flush();
fileInputStream.close();
fileOutputStream.close();
System.out.println("time1:"+(System.currentTimeMillis()-time));
FileInputStream fileInputStream1 = new FileInputStream("f://IMG_2275.MP4");
FileOutputStream fileOutputStream1 = new FileOutputStream("f://33IMG_2275.MP4");
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream1);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream1);
time = System.currentTimeMillis();
len = 0;
byte[] bytes1 = new byte[1024];
while ((len = bufferedInputStream.read(bytes1,0,bytes1.length))!=-1){
bufferedOutputStream.write(bytes1,0,bytes1.length);
}
System.out.println("time2:"+(System.currentTimeMillis()-time));
fileOutputStream1.flush();
bufferedOutputStream.flush();
fileInputStream1.close();
fileOutputStream1.close();
bufferedInputStream.close();
bufferedOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}