IO流基础

本文详细介绍了Java中的IO流,包括概述、分类,重点讲解了FileWriter和FileReader类的使用,如写数据的方法、换行与追加操作。此外,还讨论了缓冲流BufferedWriter和BufferedReader,以及它们在文本文件复制中的应用和特殊功能,如newLine()和readLine()方法。
摘要由CSDN通过智能技术生成

一、O流的概述和分类
1.概述:
IO流:可以从文件中读取数据,也可以把数据存储到文件中。

常见应用:文件复制(U盘拷贝内容)、上传内容(微信图片、QQ空间图片)、下载文件(迅雷下载)。
2.分类:输入流(从文件中读取数据到Java程序)和输出流(从Java程序中将数据写入文件)
在这里插入图片描述
二、FileWriter类(输出流类,往文件中写数据)

FileWriter fw = new FileWriter("d:\\a.txt");     //创建输出流对象

fw.write("IO流你好")//调用输出流对象的写数据方法,写一个字符串数据

fw.flush();   //数据并没有直接写到内存中,而是写到了内存缓冲区,经过flush()方法进行刷新后即可

fw.close();    //释放资源,通知系统释放和该文件相关的资源

//while(true){}  用于测试释放资源,若不执行close(),此时若程序不结束,则该文件一直被占用,执行close()函数后,则资源释放,文件将不再被占用

创建输出流对象的做了哪些事情:A:调用系统资源创建了一个文件;B:创建输出流对象;C:把输出流对象指向该文件。

路径:相对路径,即相对于当前项目而言的根目录,若创建流对象时不指定;绝对路径,在计算机中的路径。

close()方法与flush()方法的区别:flush()方法只是刷新缓冲区,流对象还可以继续使用;而close()方法是在释放资源前刷新缓冲区,资源释放后,流对象关闭,不可以再用。

FileWriter类写数据的5种方法
1): void write(String str):写一个字符串数据;
2): void write(String str, int index, int len):写一个字符串中的一部分数据(从索引index开始,长度为len);
3): void write(int ch):写一个字符数据,这里写int类型的好处是即可以写char类型的数据,也可以写char类型对应的int型数据,如传递的参数可以是’a’,也可以是97,最后的输出都为a;
4): void write(char[] chs):写一个字符数组数据;
5): void write(char[] chs, int index, int len):写一个字符数组的一部分数据,从索引index开始写,长度为len。

FileWriter类写入时换行和追加写入
1)换行:Java虚拟机中,\n可以实现换行,但是在操作系统中的换行识别符号不一致;
     在Windows系统中:换行符为\r\n
     在Linux系统中:换行符为\n
     在MAC系统中:换行符为\r

for(int i = 0; i < 10; i++){
    fw.write("hello"+i);
    fw.write("\r\n");
}

2)追加:FileWriter的构造方法:FileWriter(String filename, Boolean append)
当append为true时,表示追加,为false或者只有filename一个参数,则代表决绝追加。

FileWriter fw = new FileWriter(“c.txt”, true);  //表示追加

三、FileReader类(输入流类,往程序中读取数据)
通过一次读写一个字符
注意:调用读数据方法,每次执行读取一个字符,并且文本中的空格和换行符也能被读取。

FileReader fr = new FileReader("fw.txt");
int ch;

while((ch = fr.read()) != -1){     //如果读到ch等于-1,则表示读到结尾了,跳出循环
    System.out.print((char)ch);   //不用执行换行打印,ch中也会读到换行符,可以输出对应格式,这里读取的是字符的数字表示,可将其转化为字符表示
}      

fr.close();   //释放资源

通过一次读写一个字符复制文本文件
数据源:writetxt.java - - - 读数据 - - - FileReader类 - - -
目的地:copy.txt - - - 写数据 - - - FileWriter类 - - -

FileReader fr = new FileReader("writetxt.java");   //创建输入流对象,从writetxt.java读取数据送到程序中的fr
FileWriter fw = new FileWriter("copy.txt");       //创建输出流对象,从程序往copy.txt文本中写数据

int ch;
while((ch = fr.read()) != -1) {   //不断读取数据
    fw.write(ch);    //不断写数据
}

fw.close();    //释放fr和fw资源,先后顺序无影响
fr.close();

通过一次读取一个字符数组
int read(char[] cbuf)方法,调用过后,cbuf将填入读取值,并返回读取长度len

FileReader fr = new FileReader("writetxt.java");

char[] chs = new char[5];  //这里的5最好换成1024极其整数倍
int len;
while((len = fr.read(chs)) != -1) {    
    System.out.print(new String(chs, 0, len));  //通过使用String类的构造方法将字符数组转化为字符串输出
}

fr.close();  //释放资源

通过一次读取一个字符数组复制文本文件

FileReader fr = new FileReader("writetxt.java");   //创建输入流对象,从writetxt.java读取数据送到程序中的fr
FileWriter fw = new FileWriter("copy.txt");       //创建输出流对象,从程序往copy.txt文本中写数据

char[] chs = new chs[1024];
int len;
while((len = fr.read(chs)) != -1) {   //不断读取数据并放入数组中
    fw.write(chs, 0, len);    //不断写数组数据
}

fw.close();    //释放fr和fw资源,先后顺序无影响
fr.close();

两种读取数据方式的区别
方式一:public int read() :首先定义一个fr对象,指向内存中的fr.txt文件,然后挨个字符读取并赋值到变量ch中。
方式二:public int read(char[] cbuf):定义一个数组,首先将读取到的5个字符放到数组中,第二次读取时将另外的5个或者小于5个的字符读取到数组中,并冲掉原来对应位置的数据。
注意:windows中.txt文件的换行符为/r/n.
在这里插入图片描述

四、缓冲流
1.缓冲流的基本使用
BufferedWriter(字符输出流):将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入;

BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));    //创建输出流缓冲对象
bw.write("hello");    //将字符串写到输出缓冲流中
bw.flush();    //刷新输出缓冲流
bw.close();    //释放资源

BufferedReader(字符输入流):从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和字符串的高效读取。

BufferedReader br = new BufferedReader(new FileReader("Demo.java"));    //创建输入流缓冲对象

int ch;
while((ch = br.read()) != -1) {    //每次按一个字符读取
    System.out.print((char)ch);
}

BufferedReader br = new BufferedReader(new FileReader("Demo.java"));    //创建输入流缓冲对象

char[] chs = new char[1024];
int len;
while((len = br.read(chs)) != -1) {    //每次按字符数组读取
    System.out.print(new String(chs, 0, len));
}

br.close();   //释放资源

2.缓冲流复制文本文件的两种方式
与上述的普通输入输出流方式的区别主要为:

BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));    //创建输出流缓冲对象
BufferedReader br = new BufferedReader(new FileReader("Demo.java"));    //创建输入流缓冲对象

/*普通方式
FileReader fr = new FileReader("writetxt.java");   //创建输入流对象,从writetxt.java读取数据送到程序中的fr
FileWriter fw = new FileWriter("copy.txt");       //创建输出流对象,从程序往copy.txt文本中写数据
*/

其余代码部分完全一致。

3.缓冲流的特殊功能
BufferedWriter(字符输出流)
void newLine():向缓冲流中写入一个换行符,这个换行符由系统(不同的系统写不同的换行符)决定。
BufferedReader(字符输入流)
String readLine():一次读取一行数据,但是不读取换行符,打印输出时要采用println()。

缓冲流的特殊功能复制文件:

BufferedReader br = new BufferedReader(new FileReader("Demo.java"));    //创建输入流缓冲对象
BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));    //创建输出流缓冲对象

String line;
while((line = br.readLine()) != null) {
    bw.write(line);
    bw.newLine();
    bw.flush();
}

br.close();   //释放资源
bw.close();

4.实现文本复制的5种方法:
1)普通流按照每次读写一个字符的方法;
2)普通流按照每次读写一个字符数组的方法;
3)缓冲流按照每次读写一个字符的方法;
4)缓冲流按照每次读写一个字符数组的方法;
5)缓冲流特殊功能函数,缓冲输入流每次读取一行数据,输出流将其写入文本文件,同时写入换行符。

5.将集合与文本文件之间读写:
1.将集合中数据写到文本文件中:

//创建集合对象
ArrayList<String> array = new ArrayList<String>();

//往集合中添加字符串元素
array.add("hello");
array.add("world");
array.add("add");

//创建输出缓冲流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("array.txt"));

//遍历集合,每遍历一个字符串元素,则将其看作数据写到文本文件中
for(int i=0; i < array.size(); i++){
    String s = array.get(i);
    bw.write(s);
    bw.newLine();
    bw.flush();
}

//释放资源
bw.close();

2.将文本文件中数据读取到集合中:

//创建输入缓冲流对象
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 i=0; i < array.size(); i++){
    String s = array.get(i);
    System.out.println(s);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值