IO流的概述和分类:
流可分为两大类,字节流和字符流,且他们都有输入流(从屏幕、硬盘或是其他数据源读取数据放入内存中)和输出流(用来向屏幕、硬盘等目的地输出内容),字节流就是一个字节一个字节的读取或是输出(字节都是8位,0到255之间的整数),而字符流是按照文本的那种字符来读取和输出,就是直接读取数字、字母或是中文字等这些我们能够直接识别的字符;至于缓冲流,是指当输出的时候带 有缓冲功能的流(BufferOutputStream),没有缓冲功能的流当其输出时是直接存入目的地,如果有缓冲功能,则会将输出的内容先放置在内存中,等到有一定数据量的时候,或是流关闭、或调用flush()方法时,才会将相应的内容保存到硬盘或是其它目的地中
之所以有字符流缓冲区,是因为把字符流都作为缓冲处理能提高字符流的读写效率,如果没有缓存,例如FileReader对象,每次调用read()方法进行读操作时,都会直接去文件中读取字节,转换成字符并返回,这样频繁的读取文件效率很低。缓冲区实现原理就是将数组进行封装。缓冲的字符流的出现提高了对流的操作效率,缓冲的存在是为了增强流的功能,因此在建立缓冲的字符流对象时,要先有流对象的存在
图片转载于: https://blog.youkuaiyun.com/qq_39588027/article/details/80243282
一、什么是IO流
IO流:IO流用来处理设备之间的数据传输,可以把数据存储到文件,也可以从文件中读取数据。
常见应用:文件复制、上传文件、下载文件等。
###二、FileWriter(输出流)
1.往文件中写数据:写数据------输出流------FileWriter
2.方法:FileWriter(String filename):传递一个文件名称
3.输出流写数据的步骤:
A.创建输出流对象
B.调用输出流对象的写数据方法
C.释放资源
练习之写一个字符串到a.txt文件中
public class FileWriterTest {
public static void main(String[] args) throws IOException {
//创建输出流对象
FileWriter fw=new FileWriter("d:\\a.txt");//绝对路径
//FileWriter fw=new FileWriter("a.txt");//相对当前项目的路径
/* 创建输出流对象做了哪些事情:
* A:调用系统资源创建了一个文件
* B:创建输出流对象
* C:把输出流对象指向文件
*/
//调用输出流对象的写数据方法
fw.write("hello");
//刷新,数据没有直接写到文件,而是写到了内存缓冲区
fw.flush();
//先刷新,再释放资源,其实是通知系统释放和该文件相关的资源
fw.close();
}
}
三、FileWriter写数据的方法
void write(String str);//写一个字符串数据
void write(String str,int index,int len);//写一个字符串中的一部分数据
void write(int ch);//写一个字符数据,既可以写char类型的数据,也可以char对应的int类型。‘a’-‘z’=97–122,‘A’-‘Z’=65–90.
void write(char[] chs);//写一个字符数组数据
void write(char[] chs,int index,int len);//写一个字符数组的一部分数据
四、FileWriter之换行和追加
windows:\r\n
linux:\n
mac:\r
true表示追加,默认是false。
五、FileReader读数据
1.从文件中读数据
读数据--------输入流-------FileReader
2.方法:FileReaderr(String filename):传递一个文件名称
3.输入流读数据的步骤:
A.创建输入流对象
B.调用输入流对象的读数据方法
C.释放资源
练习之 从a.txt文件中读数据到控制台
public class FileReaderDemo1 {
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("a.txt");
//方法一:一次读取一个字符
/*int ch;
//所有数据全部读取完的标志是-1
while((ch=fr.read())!=-1) {//1.fr.read() 2.ch=fr.read() 3.ch!=-1
//System.out.println(ch);//这样输出的是int型,并且ln本身就有换行的意思。
System.out.print((char)ch);*/
//方法二:一次读取一个数组
char[] ch=new char[1024];
int len;
while((len=fr.read(ch))!=-1){
System.out.print(new String(ch,0,len));
}
fr.flush();
fr.close();
}
}
练习之复制文本文件
文件复制:
数据源:读数据-------FileReader
目的地:写数据-------FileWriter
public class CopyFileDemo {
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("b.txt");
FileWriter fw=new FileWriter("a.txt");
//一次读取一个字符
/*int ch;
while((ch=fr.read())!=-1) {
fw.write(ch); */
//一次读取一个字符数组
char[] ch=new char[1024];
int len;
while((len=fr.read(ch))!=-1)
fw.write(ch);
fw.flush();
fw.close();
}
}
六、字符缓冲流BufferedWriter、BufferedReader:
1.
BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符,数组和字符串的高效写入。
BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
2.读写数据的方式
public class BufferedStreamDemo {
public static void main(String[] args) throws IOException {
//创建输出缓冲流
//BufferedWriter bw=new BufferedWriter(new FileWriter("a.txt"));
// bw.write("hello");
// bw.flush();
// bw.close();
//创建输入缓冲流
BufferedReader br=new BufferedReader(new FileReader("a.txt"));
//一次读一个字符的情况
// int ch;
// while((ch=br.read())!=-1) {
// System.out.print((char)ch);
// }
// //释放资源
// br.close();
//一次读一个字符数组的情况]
char[] chs=new char[1024];
int len;
while((len=br.read(chs))!=-1) {
System.out.print(new String(chs,0,len));
}
br.close();
}
}
3.字符缓冲流复制文本文件的俩种方式
分析:
读数据-----FileReader-----高效读取数据------BufferedReader
写数据------FileWriter------高效的写数据-------BufferedWriter
public class CopyFileDemo {
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new FileReader("b.txt"));
BufferedWriter bw=new BufferedWriter(new FileWriter("a.txt"));
//缓冲流复制文本文件的2种方式
//一次读取一个字符串
/*int ch;
while((ch=br.read())!=-1) {
//System.out.println((char)ch);
bw.write((char)ch);
}*/
//一次读取一个数组
char[] chs =new char[1024];
int len;
while((len=br.read(chs))!=-1){
bw.write(chs,0,len);
}
bw.close();
}
}
4.字符缓冲流的特殊功能
BufferedWriter:
void newLine();写一个换行符,这个换行符由系统决定。
BufferedReader:
String readLine();一次读取一行数据,但不读取换行符。
七、复制文本文件的5中方式
public class thestyleofcopy {
public static void main(String[] args) throws IOException {
String srcFileName="a.txt";
String destFileName="b.txt";
//method1(srcFileName,destFileName);//基本流一次读写一个字符
//method2(srcFileName,destFileName);//基本流一次读写一个字符数组
//method3(srcFileName,destFileName);//缓冲流一次读写一个字符
//method4(srcFileName,destFileName);//缓冲流一次读写一个字符数组
method5(srcFileName,destFileName);//缓冲流的特殊功能,一次读写一个字符串
}
private static void method5(String srcFileName, String destFileName) throws IOException {
BufferedReader br=new BufferedReader(new FileReader(srcFileName));
BufferedWriter bw=new BufferedWriter(new FileWriter(destFileName));
//一次读写一个字符串
String line;
while((line=br.readLine())!=null) {
bw.write(line);
bw.newLine();
bw.flush();
}
br.close();
bw.close();
}
/*
private static void method4(String srcFileName, String destFileName) throws IOException {
BufferedReader br=new BufferedReader(new FileReader(srcFileName));
BufferedWriter bw=new BufferedWriter(new FileWriter(destFileName));
//一次读写一个字符数组
char[] chs=new char[1024];
int len;
while((len=br.read(chs))!=-1) {
bw.write(chs,0,len);
bw.flush();
}
br.close();
bw.close();
}
private static void method3(String srcFileName, String destFileName) throws IOException {
BufferedReader br=new BufferedReader(new FileReader(srcFileName));
BufferedWriter bw=new BufferedWriter(new FileWriter(destFileName));
//一次读写一个字符
int ch;
while((ch=br.read())!=-1) {
bw.write(ch);
bw.flush();
}
br.close();
bw.close();
}
private static void method2(String srcFileName, String destFileName) throws IOException {
FileReader fr=new FileReader(srcFileName);
FileWriter fw=new FileWriter(destFileName);
//一次读写一个字符数组
char[] chs=new char[1024];
int len;
while((len=fr.read(chs))!=-1) {
fw.write(chs,0,len);
fw.flush();
}
fr.close();
fw.close();
}
/*
private static void method1(String srcFileName, String destFileName) throws IOException {
FileReader fr=new FileReader(srcFileName);
FileWriter fw=new FileWriter(destFileName);
//一次读写一个字符
int ch;
while((ch=fr.read())!=-1) {
fw.write(ch);
fw.flush();
}
fr.close();
fw.close();
}*/
}
八、把ArrayList集合中的字符串数据存储到文本文件
分析:
A创建集合对象
B往集合中添加字符串元素
C创建输出流对象
D遍历集合,得到每一个字符串元素,然后把字符串元素作为数据写进文本文件
public class ArrayToText {
public static void main(String[] args) throws IOException {
ArrayList<String> array=new ArrayList<String>();
array.add("hello");
array.add("你好");
BufferedWriter bw=new BufferedWriter(new FileWriter("c.txt"));
for(int i=0;i<array.size();i++) {
String s=array.get(i);
bw.write(s);
bw.flush();
}
bw.close();
}
}
九、把文本文件中的数据读取到集合
/*
* 把文本文件中的数据读取到集合
* 1.创建读输入缓冲流2.创建集合对象3.读取数据,每次读取一行当做一个元素写到集合中4.释放资源5.遍历集合
*/
public class TextToArray {
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new FileReader("c.txt"));
ArrayList<String> array=new ArrayList<String>();
String line;
while((line=br.readLine())!=null) {
array.add(line);
}
br.close();
for(int i=0;i<array.size();i++)
{
String s=array.get(i);
System.out.println(s);
}
}
}