一、简介
java中IO流(以下简称IO流)分为字符流和字节流。字符流在读写文件时和编码表相联系,适合传输文本类型的文件。字节流在读写文件时不和编码表发生联系,适合传输图片、视频等文件。
IO流中有两个常用的基类:
字节流的的抽象基类:InputStream 和 OutputStream
字符流的抽象基类:Reader 和 Writer
常用的IO流都是有这四个类派生踹来的子类,名称一般以父类的名称做后缀,前缀一般为该流的功能,例如:字符流:FileReader,FileWriter;字节流:FileInputStream, FileOutputStream等等。
二、字符流
1.使用字符流创建文件
字符流最常见的操作对象是文本文件,下面用一段代码来入门
public class FileWriterDemo {
public static void main(String[] args)throws Exception {
//创建一个FileWriter对象,这个对象已初始化就要指定要操作的文件
FileWriter fw = new FileWriter("1.txt");
//write()方法将字符串写入到流中,也就是写入了内存
fw.write("abcde");
//调用flash()方法刷新数据,把内存中字符串写到文件里
fw.flush();
fw.write("snn");
//关闭流资源,每当关闭前,就会进行一次刷新,
//将数据写入文件,关闭后,流消失
fw.close();
}
}
2.IO的异常处理
import java.io.*;
/**
* 本程序用来演示一个基本的IO的异常处理,这个可以作为一个模板
* @authorsnn
*/
public class FileWriterExceptionDemo {
public static void main(String[] args) {
//在外面建立流的引用
FileWriter fw = null;
//使用try-catch捕获
try {
fw = new FileWriter("k:\\demo.txt");
fw.write("hahaha");
} catch (IOException e) {
e.printStackTrace();
}finally{
//切记不要忘了关闭流资源
try {
if(fw!=null){
fw.close();
}
} catch (IOException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
}
}
}
3.文件的续写
FileWriter fw = new FileWriter("1.txt",true);
//加上参数true时表示不再覆盖原文件,而是在数据的后边接着写入数据
4.文件的读取一:读一个操作一个
FileReader fr = new FileReader("1.txt");
int ch;
while((ch=fr.read())!=-1){
System.out.print((char)ch);
}
fr.close();
5.文件的读取二:读到缓冲区中再操作
FileReader fr = new FileReader("1.txt");
char[] buf =newchar[1024];
int len = 0;
while((len=fr.read(buf))!=-1){
System.out.println(new String(buf,0,len));
}
fr.close();
6.文本文件的复制
①读一个,写一个
FileWriter fw = new FileWriter("f:\\1.txt");
FileReader fr = new FileReader("1.txt");
int ch = 0;
while((ch=fr.read())!=-1){//读一个字符,写一个字符
fw.write(ch);
fw.flush();
}
fw.close();
fr.close();
②读一些,写一些,即读到缓冲区,再写
FileWriter fw = new FileWriter("f:\\1.txt");
FileReader fr = new FileReader("1.txt");
char[] buf =newchar[1024];
intlen= 0;
while((len=fr.read(buf))!=-1){//先读满buf,在写数据
fw.write(buf,0,len);
fw.flush();
}
fw.close();
fr.close();
7.利用BufferedReader和BufferedWriter
BufferedWriter bfw = new BufferedWriter(new FileWriter("f:\\2.txt"));
BufferedReader bfr = new BufferedReader(new FileReader("2.java"));
String line = null;
while((line=bfr.readLine())!=null){//利用缓冲区读一行数据,写一行数据
bfw.write(line);
bfw.newLine();
bfw.flush();
}
bfw.close();
bfr.close();
8.装饰设计模式
当已有的对象要进行功能增强时,可以定义类,将已有的对象传入,基于已有的功能,并提供加强功能,那么自定义的类就成为装饰类
装饰类通常会通过构造方法接收被装饰的对象。并基于已有功能提供更强的功能。例如:BufferedWriter和BufferedReader就是FileWriter和FileReader的装饰类,提供了操作数据的更多的方法。
9.LineNumberReader带行号的读取流
BufferedWriter bfw = new BufferedWriter(new FileWriter("f:\\2.txt"));
LineNumberReader lnr = new LineNumberReader(new FileReader("2.java"));
String line = null;
while((line=lnr.readLine())!=null){
bfw.write(lnr.getLineNumber()+":"+line);//2.txt中会有行号
bfw.newLine();
bfw.flush();
}
bfw.close();
lnr.close();
三、字节流
1.写数据,不用刷新就可以写入
FileOutputStream fos = new FileOutputStream("xxx.txt");
fos.write("ni hao ya".getBytes());
fos.close();
2.读数据
①读一个操作一个
FileInputStream fis = new FileInputStream("1.txt");
int len = 0;
while((len=fis.read())!=-1){//读到一个就会写一个
System.out.print((char)len);
}
fis.close();
②读一些,操作一些
FileInputStream fis = new FileInputStream("1.txt");
byte[] buf =newbyte[1024];
intlen= 0;
while((len=fis.read(buf))!=-1){//先把数据存到数组里,再操作
System.out.print(new String(buf,0,len));
}
fis.close();
③字节流特有方法
fis.available()要读取的文件的长度,建立一个大小正好的数组
FileInputStream fis = new FileInputStream("1.txt");
byte[] buf =newbyte[fis.available()];
int len = 0;
while((len=fis.read(buf))!=-1){
System.out.print(new String(buf,0,len));
}
fis.close();
3.复制图片
FileInputStream fis = new FileInputStream("xin.jpg");
FileOutputStream fos = new FileOutputStream("f:\\xin.jpg");
byte[] buf =newbyte[1024];
int len = 0;
while((len=fis.read(buf))!=-1){
fos.write(buf,0, len);
fos.flush();
}
fos.close();
fis.close();
4.复制MP3-利用BufferedInputStream和BufferedOutputStream
BufferedInputStream bis = newBufferedInputStream(new FileInputStream("gj.mp3"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("f:\\gj.mp3"));
int len = 0;
byte[] buf =newbyte[1024];
while((len=bis.read(buf))!=-1){
bos.write(buf,0,len);
bos.flush();
}
bos.close();
bis.close();
5.键盘录入以及字节流和字符流的相互转换
System.out:对应着标准输出设备,控制台
System.in:对应着标准的输入设备,键盘
InputStreamReader:把字节流转换成字符流
OutputStreamWriter:把字符流转换成字节流
练习:读取键盘录入,并输出在控制台
//读取键盘录入
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
//将录入数据输出到控制台
BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(System.out));
String line = null;
while((line=bfr.readLine())!=null){
if("over".equals(line))
break;
bfw.write(line);
bfw.newLine();
bfw.flush();
}
bfw.close();
bfr.close();
6.流操作的基本规律
流的操作通过三个明确来完成
(1)明确源和目的
源:输入流。InputStream Reader
目的:输出流。OutputStream Writer
(2)操作的数据是否是纯文本
是:字符流
否:字节流
(3)当体系明确后,在明确要使用哪个具体的对象
通过设备来区分:
源设备:内存,硬盘,键盘
目的设备:内存,硬盘,控制台
7.改变标准输入输出设备
System.setIn(InputStream in):这个方法可以设置标准输入设备
System.setOut(OutputStream out):这个方法可以设置标准输出设备