一、字节流和字符流
字节流的两个顶层父类:
InputStream、OutputStream
字符流的两个顶层父类:
Reader、Writer
二、字符流
1、Writer:
例子1:将一些文字存储在一个硬盘上
记住:如果要操作文字数据,建议优先考虑字符流
而且要将数据从内存写到硬盘,要使用字符流中的输出流。Writer
代码:
//如果文件不存在,创建文件
// 如果文件存在,覆盖源文件
//1、 创建一个字符输出流对象
FileWriter fw = new FileWriter("demo.txt");
// 2、调用Writer对象中的write(String) 方法,写数据
// 这个数据写在了临时缓冲区中了,并没有写在文件中
fw.write("abc");
// 3、进行刷新,将数据写在文件中
fw.flush();
// 4、关闭流,关闭资源
fw.close();
2、Reader
读取一个文件,将读取的文件打印在控制台:
第一种方式:一次读取一个字符
代码:
//创建读取字符数据流对象
FileReader fr = new FileReader("demo.txt");
//用Reader里面的方法read读取字符
int ch = 0;
while((ch = fr.read()) != -1) {
System.out.println((char)ch);
}
//关闭刘对象
fr.close();
第二种方式:一次读取一个字符数组
代码:
FileReader fr = new FileReader("demo.txt");
char[] chars = new char[1024];
int ch = 0;
while((ch = fr.read(chars)) != -1) {
Systemout.println(new String(chars,0,ch));
}
fr.close();
3、例子:复制文本文件
1、方式一:
- 代码:
FileReader fr = new FileReader("demo.txt");
FileWriter fw = new FileWriter("1.txt");
int ch = 0;
while((ch = fr.read()) != -1) {
fw.write((char)ch);
}
fr.close();
fw.close();
2、方式二:
- 代码
FileReader fr = new FileReader("demo.txt");
FileWriter fw = new FileWriter("1.txt");
int num = 0;
char[] chars = new char[1024];
while((num = fr.read(chars)) != -1) {
fw.write(chars,0,num);
}
fr.close();
fw.close();
三、字符流的缓冲区
1、BufferedWriter
- 代码:
FileWriter fw = new FileWriter("demo.txt");
//创建缓冲流对象
BufferedWriter br = new BufferedWriter(fw);
//把数据写在缓冲区中
bw.write("abcd");
//把缓冲区的东西刷新到目的地
bw.flush();
//关闭缓冲区,其实就是关闭被缓冲的刘对象
bw.close();
- 一个方法:bw.newLine();
2、BufferedReader
- 代码:
FileReader fr = new FileReader("demo.txt");
BufferedReader br = new BufferedReader(fr);
String line = null;
while((line = br.readLine()) != null){
System.out.println(line);
}
br.close();
四、字节流
1、写数据
- 代码:
// 创建字节流输出对象
FileOutputStream fos = new FileOutputStream("demo.txt");
// 写数据
fos.write("abcd".getBytes());
// 关闭资源
fos.close();
2、读数据:
- 第一种:
FiInputStream fis = new FileInputStream("demo.txt");
int by = 0;
while((by = fis.read()) != -1) {
System.out.println((char)ch);
}
fis.close();
- 第二种:
FileInputStream fis = new FileInputStream("demo.txt");
int by = 0;
byte[] bytes = new byte[1024];
while((by = bytes.read(bytes)) != -1) {
System.out.println(bytes,0,by);
}
fis.close();
3、练习:拷贝mp3
- 第一种:(别用,效率太低)
FileOutputStream fos = new FileOutputStream("demo.mp3");
FileInoutStream fis = new FileInputStream("1.mp3");
byte[] bytes = new byte[1024];
int by = 0;
while((by = fis.read(bytes)) != -1){
fos.write(bytes,0,by);
}
fis.close();
fos.close();
- 第二种:
FileInputStream fis = new FileInputStream("demo.mp3");
FileOutputStream fos = new FileOutputStream("1.mp3");
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
int by = 0;
while((by = bis.read()) != -1) {
bos.wrote(by);
}
bis.close();
bos.close();
五、转换流
1、将字节流转换为字符流 InputStreamReader
- 代码:
InputStream is = System.in;
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
// 上面三行语句可以等效为:
// BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line = br.readLine()) != null){
System.out.println(line);
}
br.close();
2、将字符流转换为字节流 OutputStreamWriter
- 代码:
OutputStream os = System.out;
OutputStreamWrite osw = new OutputStreamWrite(os);
BufferedWrite bw = new BufferedWrite(osw);
//上面三行代码 简化为:
// BufferedWriter bw = new BufferedWriter(new OutputStreamWrite(System.out));
BufferedReader br = new BufferedReader(isr);
String line = null;
while((line = br.readLine()) != null) {
System.out.println(line);
bw.write(line);
bw.newLine();
bw.flush();
}
br.close();
bw.close();
3、记住两个语句:
BufferedReader br = new BufferedReader(new InputStreamReader(Syatem.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System,out));
======================================================
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("1.txt")));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("2.txt")));
4、举栗子
1、将键盘录入的数据写入文件中:
- 代码:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(1.txt)));
String line = null;
while((line = br.readLine()) != null){
bw.write(line);
bw.newLine();
bw.flush();
}
br.close();
bw.close();
2、将文件的内容显示在控制台上:
- 代码:
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("1.txt")));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String line = null;
while((line = br,readLine()) != null){
System.out.println(line);
}
br.close();
bw.close();
3、将一个文件中的内容复制到另一个文件 :
- 代码:
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("1.txt")));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("2.txt")));
String line = null;
while((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
br.close();
bw.close();
总结:
流的操作规律:
要想知道开发中需要用到什么对象,只要通过四个明确即可
1、明确目的和源
如果是源: InputStream Reader
如果是目的:OutputStream Writer2、明确数据是否是纯文本数据:
源:是:Reader
源:否:InputStream
目的:是:Writer
目的:否:OutputStream
3、明确具体的设备
源:硬盘:File
源:键盘:System.in
源:内存:数组
源:网络:Socket流
目的:硬盘:File
目的:控制台:System.out
目的:内存:数组
目的:网络:Socket流