------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
IO流(1)
IO的体系:
字节流两个基类:
InputStream(字节输入流) OutputStream(字节输出流)
字符流两个基类:
Reader(字符输入流) Writer(字符输出流)
---------------------------------------------------------------------------------
学习io流体系:看顶层(父类共性功能),用底层(子类具体对象)。
该体系的一个好处就是:
每个子类的后缀名都是所属体系的父类的名称,很容易区分所属的体系。
而且每一个子类前缀名都是该子类对象的功能体现。
这样我们在使用io体系中的对象时,就非常容易查找了。
字符流的由来:
以前处理数据都是字节数据,使用字节流技术就可以完成了。
因为后期编码表的不断出现,识别某一文字的码表不唯一。比如中文,GBK,unicode都可以识别。
就出出现了编码问题。
中文字节数据 gbk --> 流处理--->gbk解析可以了。
后期:容器出现这样的问题:
中文字节数据gbk --> 流处理 unicode来处理-->数据错误。
为了处理文字数据,就需要通过 字节流技术+编码表 相结合来完成。注意:只有文字是这样的,因为文字涉及编码问题。
虽然字节流+编码表可以解决文字数据处理问题,但是较为麻烦。
为了便于使用,将字节流和编码表进行了封装,就出现了便于文字操作的流技术:字符流。
其实字符流就是:字节流+编码表。
字符流演示
FileWriter
package cn.itcast.io.p1.filewriter.demo;
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo3 {
/**
* @param args
*/
public static void main(String[] args) {
/*
* IO异常的处理规范。 创建流对象。 在try外创建流对象的引用。 在try内对流对象进行初始化。
*/
FileWriter fw = null;
try {
fw = new FileWriter("k:\\demo3.txt");
fw.write("abcde");
fw.flush();
} catch (IOException e) {
System.out.println(e.toString());
} finally {
if (fw != null)
try {
fw.close();
} catch (IOException e) {
// 相关的代码处理。比如说,将关闭失败的信息记录到日志文件中。
throw new RuntimeException("关闭失败");
}
}
}
}
FileReader演示
package cn.itcast.io.p2.filereader.demo;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
/*
* 使用FileReader在构造时明确被读取的文件。
* 通过FileReader和指定的文件相关联。
*/
FileReader fr = new FileReader("tempfile\\demo.txt");
/*
* 调用字符读取流对象的read方法。对关联的文件进行读取。
* read():一次读取一个字符。并返回该字符的对应的数字。
* 读取到什么字符,就返回什么字符,读到结尾就返回-1.用-1来标示结束了。
*
*/
//代码使用循环解决就哦了。
int ch = 0;
while((ch=fr.read())!=-1){
System.out.println((char)ch);
}
//关闭资源。
fr.close();
}
}
为了提高字符流的读写效率出现了两个类 字符流的缓冲区。
BufferedReader
BufferedWriter
缓冲区给给流的操作动作(读写)提高效率.所以缓冲区的对象建立必须要有流
package cn.itcast.io.p4.charbuffer.read;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedReaderDemo {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
/*
* 演示BufferedReader
*
* 1,先有字符读取流。
* 2,该类有一个特有方法。readLine().一次读一行。
*/
//创建读取流对象和文件相关联。
FileReader fr = new FileReader("tempfile\\buf.txt");
//创建读取缓冲区对象和流对象关联,对其进行高效操作。
BufferedReader bufr = new BufferedReader(fr);
String line = null;
while((line=bufr.readLine())!=null){
System.out.print(line);
}
bufr.close();
}
}
bufferdreader与bufferedwriter用法相同。
练习一下复制文件:
package cn.itcast.io.p3.test;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyTextTest2 {
/**
* @param args
*/
public static void main(String[] args) {
/*
* 复制方式二:
* 使用缓冲区数组。
* 使用的就是可以操作数组的读写方法。
*
*
*/
//1,定义字符输入流和字符输出流的引用。
FileReader fr = null;
FileWriter fw = null;
try {
//2,对流对象进行初始化。
fr = new FileReader("tempfile\\demo.txt");
fw = new FileWriter("tempfile\\copy_demo2.txt");
//3,定义一个数组缓冲区。用于缓冲读取到的数据。
char[] buf = new char[1024];
//4,读写操作。
int len = 0;
while((len = fr.read(buf))!=-1){
fw.write(buf,0,len);
}
} catch (Exception e) {
System.out.println(e.toString());
}finally{
if(fw!=null)
try {
fw.close();
} catch (IOException e) {
throw new RuntimeException("写入关闭失败");
}
if(fr!=null)
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}