IO流分类
分类 | 字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
---|---|---|---|---|
抽象基类 | InputStream | OutputStream | Reader | Writer |
访问文件 | FileInputStream | FileOutputStream | FileReader | FileWriter |
访问字符串 | StringReader | StringWriter | ||
缓冲流 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
转换流 | InputStreamReader | OutputStreamWriter |
一个简单的输出流的demo
/**
步骤:
A:创建输出流对象
B:调用输出流对象的写数据方法,并刷新缓冲区
C:释放资源
*/
public class FileWriterDemo {
public static void main(String[] args) throws IOException {
//A:创建输出流对象
FileWriter fw = new FileWriter("d:\\a.txt");
// B:调用输出流对象的写数据方法,并刷新缓冲区
//写一个字符串数据
fw.write("IO流你好");
//数据没有直接写到文件,其实是写到了内存缓冲区
fw.flush();
//C:释放资源: 通知系统释放和该文件相关的资源
fw.close();
}
}
注意
* flush():刷新缓冲区。流对象还可以继续使用。
* close():先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。
一个简单的输入流的demo
* 输入流读数据的步骤:
A:创建输入流对象
B:调用输入流对象的读数据方法
C:释放资源
public class FileReaderDemo {
public static void main(String[] args) throws IOException {
//A:创建输入流对象
FileReader fr = new FileReader("FileWriterDemo.java");
//B:调用输入流对象的读数据方法
//int read():一次读取一个字符
/*
//第一次读数据
int ch = fr.read();
System.out.println(ch);
System.out.println((char)ch);
//第二次读数据
ch = fr.read();
System.out.println(ch);
System.out.println((char)ch);
//第三次读数据
ch = fr.read();
System.out.println(ch);
System.out.println((char)ch);
//这个时候,我们发现代码的重复度很高,想用循环改进,但是不知道循环的结束条件是什么
ch = fr.read();
System.out.println(ch);
ch = fr.read();
System.out.println(ch);
//通过测试,我们知道,如果读取数据的返回值是-1的时候,就说明没有数据了,这也是我们循环的结束条件
*/
//故代码最终改造为循环格式:
int ch;
//1:fr.read()
//2:ch=fr.read()
//3:ch != -1
while((ch=fr.read())!=-1) {
//System.out.println(ch);
//System.out.println((char)ch);
System.out.print((char)ch);
}
//C:释放资源
fr.close();
}
}
使用缓冲流复制字符文件的demo(1)
/*
* 需求:把项目路径下的FileWriterDemo.java中的内容复制到项目路径下的Copy.java中
* 数据源:FileWriterDemo.java -读数据 -FileReader
* 目的地:Copy.java -写数据 -FileWriter
*/
public class CopyFileDemo2 {
public static void main(String[] args) throws IOException {
//创建输入流对象
FileReader fr = new FileReader("FileWriterDemo.java");
//创建输出流对象
FileWriter fw = new FileWriter("Copy.java");
//读写数据
char[] chs = new char[1024];
int len;
while((len=fr.read(chs))!=-1) {
fw.write(chs, 0, len);
}
//释放资源
fw.close();
fr.close();
}
}
使用缓冲流复制字符文件的demo(2)
/*
* 需求:把项目路径下的FileWriterDemo.java中的内容复制到项目路径下的Copy.java中
* 数据源:FileWriterDemo.java -- 读数据 -- FileReader -- 高效的读数据 -- BufferedReader
* 目的地:Copy.java -- 写数据 -- FileWriter -- 高效的写数据 -- BufferedWriter
*/
public class CopyFileDemo {
public static void main(String[] args) throws IOException {
//创建输入缓冲流对象
BufferedReader br = new BufferedReader(new FileReader("FileWriterDemo.java"));
//创建输出缓冲流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java"));
//读写数据
String line;
while((line=br.readLine())!=null) {
bw.write(line);
bw.newLine();
bw.flush();
}
//释放资源
bw.close();
br.close();
}
}
使用缓冲流读数据到集合
/*
* 从文本文件中读取数据到ArrayList集合中,并遍历集合
* 每一行数据作为一个字符串元素
*
* 分析:
* A:创建输入缓冲流对象
* B:创建集合对象
* C:读取数据,每次读取一行数据,把该行数据作为一个元素存储到集合中
* D:释放资源
* E:遍历集合
*/
public class FileToArrayListTest {
public static void main(String[] args) throws IOException {
//创建输入缓冲流对象
BufferedReader br = new BufferedReader(new FileReader("array.txt"));
//创建集合对象
ArrayList<String> array = new ArrayList<String>();
//读取数据,每次读取一行数据,把该行数据作为一个元素存储到集合中
String line;
while((line=br.readLine())!=null) {
array.add(line);
}
//释放资源
br.close();
//遍历集合
for(int x=0; x<array.size(); x++) {
String s = array.get(x);
System.out.println(s);
}
}
}