1.字节流
字节流的抽象基类
InputStream:字节输入流
OutputStream:字节输出流
/*
* 字节输入流读取数据:
* 方式1:一次读取一个字节
* 方式2:一次读取一个字节数组
*/
public class FileInputStreamDemo {
public static void main(String[] args) throws IOException {
// 创建字节输入流对象
FileInputStream fis = new FileInputStream("fos.txt");
// 读取数据
/* 方式1
int by = 0;
while ((by = fis.read()) != -1) {
System.out.print((char) by);
}
*/
// 方式2
byte[] bys = new byte[1024];
int len = 0;
while ((len = fis.read(bys)) != -1) {
System.out.print(new String(bys, 0, len));
}
// 释放资源
fis.close();
}
}
用字节流复制图片文件
/*
* 需求:把d盘目录下mn.jpg复制到e盘目录下copy.jpg
* 思路:
* 数据源:
* d:\\mn.jpg -- 字节流 -- 读取数据 -- InputStream -- FileInputStream
* 目的地:
* e:\\copy.jpg -- 字节流 -- 写入数据 -- OutputStream -- FileOutputStream
*/
public class CopyIMG {
public static void main(String[] args) throws IOException {
// 封装数据源
FileInputStream fis = new FileInputStream("d:\\mn.jpg");
// 封装目的地
FileOutputStream fos = new FileOutputStream("e:\\copy.jpg");
byte[] bys = new byte[1024];
int len = 0;
while ((len = fis.read(bys)) != -1) {
fos.write(bys, 0, len);
fos.flush();
}
// 释放资源
fos.close();
fis.close();
}
}
字节流-缓冲区作用是提高了字节流的读写效率
复制MP3文件
public class CopyMP3 {
public static void main(String[] args) throws IOException {
long start = System.currentTimeMillis();
method();
long end = System.currentTimeMillis();
System.out.println("时间为:" + (end - start) + "毫秒");
}
// 高效的一次读写一个字节
private static void method() throws IOException {
// 封装数据源
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
"d:\\a.mp3"));
// 封装目的地
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream("b.mp3"));
// 基本读写
byte[] bys = new byte[1024];
int len = 0;
while ((len = bis.read(bys)) != -1) {
bos.write(bys, 0, len);
}
// 释放资源
bos.close();
bis.close();
}
}
2.标准输入输出流
System类中的字段:in,out,它们各代表了系统标准的输入和输出设备
默认输入设备是键盘,输出设备是显示器
System.in的类型是InputStream,System.out的类型是PrintStream,它是OutputStream系列的子类
/*
* 需求:键盘录入数据,写入到文本文件当录入的数据是over时,结束打印程序
* 数据源:
* 键盘录入数据 -- Scanner -- readLine()
* 目的地:
* 文本文件 -- 写入数据 -- 字符流 -- 高效 -- BuffereWriter
*/
public class SystemInDemo {
public static void main(String[] args) throws IOException {
// 键盘录入数据
Scanner sc = new Scanner(System.in);
// 封装目的地
BufferedWriter bw = new BufferedWriter(new FileWriter("sc.txt"));
// 读写操作
String line = null;
while ((line = sc.nextLine()) != null) {
// 自定义结束标记
if ("over".equals(line)) {
break;
}
bw.write(line);
bw.newLine();
bw.flush();
}
// 释放资源
bw.close();
sc.close();
}
}
3.转换流
转换流包括:InputStreamReader和OutputStreamWriter
转换流的作用:是字节流和字符流的桥梁;方便了字节流和字符流之间的操作
转换流的应用:字节流中的数据都是字符时,转成字符流操作更高效
IO流复制文件的操作规律
(1)文本文件 -- 文本文件
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
(2)文本文件 -- 控制台输出
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
(3)键盘录入 -- 文本文件
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
(4)键盘录入 -- 控制台输出
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
使用IO时应先分清一下几点:
A:搞清楚数据源和目的地都可以用哪些对象操作
数据源:
InputStream
Reader
目的地:
OutputStream
Writer
B:分清楚数据源和目的地是什么类型的文件?
数据源:文本文件?
是:Reader
不是:InputStream
目的地:文本文件?
是:Writer
不是:OutputStream
C:搞清楚数据源和目的地的设备
数据源:
文件 FileReader
键盘录入 InputStream is = System.in;
使用转换流nputStreamReader isr = new InputStreamReader(is);
目的地:
文件 FileWriter
控制台输出 OutputStream os = System.out;
使用转换流OutputStreamWriter osw = new OutputStreamWriter(os);
D:是否要求高效
是:使用Buffered流对象
否:不使用Buffered流对象