I/O 流
I/O操作的相似性
I/O输出处理是程序设计中非常重要的一部分,比如从键盘读取数据、从文件中读取数据或向文件中写数据等等。这些操作都有相似性,如:
控制台(console)——打印/读入
文件(file)——读/写
File类
File类是IO包中唯一代表磁盘文件本身信息的类,而不是文件中的内容;
File类定义了一些与平台无关的方法来操纵文件,例如;创建、删除文件和重命名文件。
流的抽象
Java把这些不同类型的输入、输出源抽象为流(stream),用统一接口来表示,从而使程序简单明了。
什么是流
流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动起来。
Java I/O流的分类
java.io 包中定义了多个流类型(类或抽象类)来实现输入/输出功能:可以从不同的角度对其进行分类;
按数据流的方向不同可以分为输入流和输出流;
按处理数据单位不同可以分为字节流和字符流;
按照功能不同可以分为节点流和处理流。
JDK所提供的所有流类型位于包java.io内,都分别继承自以下四种抽象流接口:
字节流(byte stream):一个字节(8-bit)一个字节读/写
字符流(character stream):一个字符一个字符读/写(具有特定字符编码的数据)
InputStream
继承自InputStream的流都是用于向程序中输入数据,且数据的单位为字节(8 bit)
InputStream基本方法
public abstract int read( ) throws IOException
读取一个字节并以整数的形式返回(0~255),如果返回-1表示到达输入流的结尾
public int read(byte[] buffer) throws IOException
读取一系列字节并存储到一个数组buffer,返回实际读取的字节数,到末尾返回-1
public long skip(long n) throws IOException
跳过n个字节不读,返回实际跳过的字节数
public void close( ) throws IOException
关闭流释放内存资源
读(Reading)
建立联系
选择流
操作流
关闭资源
代码实现示例:
//1建立联系
String path = "D:/Test/1.txt";
File src = new File(path );
//2选择流
InputStream is = null;//提升作用域
try {
is = new FileInputStream(src );
//3操作流,不断读取
byte[] car = new byte[1024];
int leg = 0;//接受实际读取的大小
//循环读取
while(-1!=(leg =is .read(car ))){
String inf = new String(car,0,leg );
System. out.println(inf );
}
}
catch (FileNotFoundException e) {
System. out.println("文件不存在" );
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
System. out.println("文件读取失败" );
}finally {
try {
//4.关闭资源
is.close();
} catch (IOException e ) {
e.printStackTrace();
System. out.println("关闭失败" );
}
}
文件处理
类FileInputStream和FileOutputStream用来进行文件I/O处理,由它们所提供的方法可以打开本地主机上的文件,并进行顺序的读/写。
OutputStream
继承自OutputStream的流都是用于程序中输出数据,且数据的单位为字节(8 bit)
OutputStream基本方法
public abstract void write(int b) throws IOException
向输出流中写入一个字节数据,该字节数据为参数b的第8位
public void write(byte[] data) throws IOException
将一个字节类型的数组中的数据写入输出流
public void close( ) throws IOException
关闭流释放内存资源
public void flush( ) throws IOException
将输出流中缓存的数据全部写出到目的地
流的写出过程
写(Writing)
建立联系
选择流
输出
关闭流
代码实现示例:
File f = new File("D:" + File.separator+"test.txt");
OutputStream out=new FileOutputStream(f);//如果文件不存在会自动创建
//OutputStream out=new FileOutputStream(f,true);//追加内容
String str="Hello World";
byte[] b=str.getBytes();
out.write(b);//因为是字节流,所以要转化成字节数组进行输出
out.close();
字符流Reader
继承自Reader的流都是用于向程序中输入数据,且数据的单位为字符(2个字节)
Reader基本方法
public int read( ) throws IOException
public int read(char[] text) throws IOException
public long skip(long n) throws IOException
public void close() throws IOException
流代码实现:
public static void main(String[] args) throws IOException {
File f = new File("D:" + File.separator + "text.java");
Reader input = new FileReader(f);
int b=0;
while((b=input.read())!=-1){
System.out.println((char)b);
}
input.close();
}
字符流Writer
继承自Writer的流都是用于程序输出数据,且数据的单位为字符(16 bit)
Writer基本方法
public void write(int c) throws IOException
public void write(char[] text) throws IOException
public void write(String string) throws IOException
public void flush(char[] text) throws IOException
public void close(char[] text) throws IOException
Writer代码实现示例:
public static void main(String[] args) throws IOException {
File file = new File("D:/text.java");
Writer w = new FileWriter(file);
String str = "测试";
w.write(str);
w.close();
}
节点流和处理流
处理流:是对一个已存在的流的连接和封装,通过所封装的功能调用实现数据读写。如:BufferedReader。处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。
常用的节点流
父类:InputStream、OutputStream、Reader、Writer
对文件进行处理的节点流
FileInputStream 、FileOutputStream 、FileReader、FileWriter
常用的处理流
父类:InputStream、OutputStream、Reader、Writer
缓冲流
BufferedInputStream、BufferedOutputStream
BufferedReader、BufferedWriter
需要父类作为参数构造,增加缓存功能,避免频繁读写硬盘,可以初始化缓冲数据的大小,由于带了缓冲功能,所以就写数据的时候需要使用flush方法。
转换流
InputStreamReader、OutputStreamWriter 要inputStream或OutputStream作为参数,实现从字节流到字符流的转换
通过处理流读数据到程序
第一步:创造一个字符流/字节流,直接操作文件
Reader in = new FileReader("G:/Book1.csv");
第二步:在节点流的基础上,套一个缓冲流,实现缓冲和按行读取
BufferedReader reader = new BufferedReader(in);
第三步:读取
String line=null;
第四步:关闭流,有两种方式
1. 可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法
2. 关闭原则:先打开的后关闭,后打开的先关闭。否则会抛出异常
通过处理流写数据到文件
第一步:创造一个字符流/字节流,直接操作文件
Writer out = new FileWriter("G:/Book2.csv");
第二步:在节点流的基础上,套一个缓冲流,实现缓冲
BufferedWriter writer = new BufferedWriter(out);
第三步:写入
writer.write("ddddd"); 换行的方法是writer.newLine();
第四步:写完之后,关闭之前,必须flush!
writer.flush();
第五步:关闭流,有两种方式
1. 可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法
2. 关闭原则:先打开的后关闭,后打开的先关闭。否则会抛出异常
中文乱码的解决方案
第一步:创造一个节点流/字符流,直接操作文件
InputStream file = new FileInputStream("G:/Book1.csv");
第二步:按照指定编码从字节流转化为字符流
InputStreamReader in = new InputStreamReader(file, "GBK");
第三步:在节点流的基础上,套一个缓冲流,实现缓冲和按行读取
BufferedReader reader = new BufferedReader(in);
总结
父类:InputStream、OutputStream、Reader、Writer
对文件进行处理的节点流
FileInputStream 、FileOutputStream 、FileReader、FileWriter
处理流中的缓冲流
BufferedInputStream、BufferedOutputStream
BufferedReader、BufferedWriter
处理流中的转化流实现从字节到字符的转换
nputStreamReader、OutputStreamWriter
上一篇: 第一个博客~