---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
IO流概括:input output的缩写。简单说就是数据的传输方式。
IO流的分类:
根据流向分类:
输入流——读取数据。
输出流——写入数据。
根据数据类型分类:
|--字节流
|--读取数据 输入流 InputStream
FileInputStream
|--写入数据 输出流 OutputStream
FileOutputStream
|--字符流
|--读取数据 输入流 Reader
FileReader
|--写入数据 输出流 Writer
FileWriter
一般按照数据来进行区分。
既然知道了io流的基本类,如何确定什么时候用字符流或者字节流呢。如果用记事本打开,数据是可以读懂的,就采用字符流,否者,
一概使用字节流。
字符流的操作步骤:
1创建字符流输出对象。
2调用writer方法。
3关闭流
例:需求,我要往a.txt中写入一句话:hello,io。
步骤:
A:首先创建一个a.txt文件
B:创建字符输出流
C:写数据
D:释放资源,关闭流
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
/*
* 我们去使用Writer类,但是,发现它是抽象类,所以找到他的儿子:FileWriter(File file)
*/
public class FileWriterDemo {
public static void main(String[] args) throws IOException {
//FileWriter(File file)
//首先创建一个a.txt文件
File file = new File("a.txt");
file.createNewFile();
//创建字符输出流
FileWriter fw = new FileWriter(file);
//写数据
//public void write(String str)
fw.write("hello,io");
//释放资源,关闭流
fw.close();
}
}
上面完成了一个基础的IO流的实现,对一个文本进行写入。如果我们要将一个文本的数据转入到另一个文本中去又该如何进行呢?
需求:把d盘目录下的a.txt的内容复制到e盘目录下的b.txt中。
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/*
*
* 数据源:
* d:\\a.txt -- 读取数据 -- 字符输入流 -- FileReader
* 目的地:
* e:\\b.txt -- 写入数据 -- 字符输出流 -- FileWriter
*/
public class CopyFileDemo {
public static void main(String[] args) throws IOException {
//封装数据源
FileReader fr = new FileReader("d:\\a.txt");
//封装目的地
FileWriter fw = new FileWriter("e:\\b.txt");
//读写操作
int ch = 0;
while((ch=fr.read())!=-1){
fw.write(ch);
}
//释放资源
fw.close();
fr.close();
}
}
上面是对数据进行写入性的操作,如果我们需要对数据进行读取并显示在控制台呢?
下面是代码的实现。
import java.io.FileReader;
import java.io.IOException;
/*
* 需求:把d盘目录下的a.txt文件中的内容,读取并显示在控制台。
*/
public class FileReaderTest {
public static void main(String[] args) throws IOException {
// 字符输入流
FileReader fr = new FileReader("d:\\a.txt");
//读取数据
int ch = 0;
while((ch=fr.read())!=-1){
System.out.print((char)ch);
}
//释放资源
fr.close();
}
}
字符流在文件copy中分为两类:
A基本流:
FileReader
int read():一次读取一个字符
int read(char[] chs):一次读取一个字符数组
FileWriter:
write(int ch):一次写一个字符
write(char[] chs ,int index, int len):一次写一个字符数组的一部分
B高效流:
BufferedReader
int read():一次读取一个字符int read(char[] chs):一次读取一个字符数组
特殊:
String readLine():一次读取一行数据
BufferedWriter:
write(int ch):一次写一个字符
write(char[] chs ,int index, int len):一次写一个字符数组的一部分
特殊:
newLine():写一个换行符
下面简单对高效流做下演绎
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/*
* 我们前面在使用数组读写数据的时候,是为了提高效率。
* 而数组的大小是由我们自己定义,既然这样都能提高效率,那么,
* java在设计类的时候,它本身也应该考虑到了这样的问题,就是
* 自己定义一个缓冲区,将来读写数据。
* 带缓冲区的流对象:
* 字符流:
* BufferedReader:带缓冲的读取数据
* BufferedWriter:带缓冲的写入数据
*
* 字节流:
* BufferedInputStream:
* BufferedOutputStream:
*
* BufferedWriter功能:
* BufferedWriter(Writer out)
* 为什么构造参数居然是一个Writer,而不是File或者String类型的?
* 缓冲流它仅仅提供缓冲效果,基本的读写操作还得靠基本的流对象进行操作。
*
* 基本流:就是能直接操作文件的流对象。
* 高级流:站在基本流的基础之上,提供了其他功能的流对象。他们本身不具备直接读写文件的操作。
*/
public class BufferStreamDemo {
public static void main(String[] args) throws IOException {
// write();
read();
}
private static void read() throws IOException {
BufferedReader br = new BufferedReader(new FileReader("w.txt"));
//方式1
// int ch = 0;
// while((ch=br.read())!=-1){
// System.out.print((char)ch);
// }
//方式2
char[] chs = new char[1024];
int len = 0;
while((len=br.read(chs))!=-1){
System.out.print(new String(chs,0,len));
}
//关闭流对象
br.close();
}
// 写数据操作
private static void write() throws IOException {
// 创建流对象
// Writer w = new FileWriter("w.txt");
// BufferedWriter bw = new BufferedWriter(w);
BufferedWriter bw = new BufferedWriter(new FileWriter("w.txt"));
// 调用write功能
bw.write("hello");
bw.flush();
// 关闭流对象
bw.close();
}
}
---------------------- ASP.Net+Android+IOS开发、 .Net培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net