文章目录
1. 概述
- IO流用来处理设备之间的数据传输
- Java对数据的操作是通过流的方式
- Java用于操作流的类都在IO包中
- 流按流向分为两种:输入流,输出流
IO流:
- 可以把数据储存到文件
- 也可以从文件中读取数据
2. FileWriter类的使用
FileWriter(String fileName)
:传递一个文件名称
步骤:
- A:创建输出流对象
- B:调用输出流对象的写数据的方法
- C:释放资源
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo {
public static void main(String[] args) throws IOException {
//创建输出流对象
FileWriter fw = new FileWriter("d:\\a.txt");
/*
* 创建输出流对象做了哪些事情:
* A:调用系统资源创建了一个文件
* B:创建输出流对象
* C:把输出流对象指向文件
*/
//调用输出流对象的写数据的方法
//写一个字符串数据
fw.write("IO流你好");
//数据没有直接写到文件,其实是写到了内存缓冲区
fw.flush();
//释放资源
//通知系统释放和该文件相关的资源
fw.close();
//while(true) {}
}
}
- 相对路径:相对当前项目而言的,在项目的根目录下(a.txt)
- 绝对路径:以盘符开始的路径(d:\a.txt)
close()
和flush()
方法的区别:
flush()
:刷新缓冲区。流对象还可以继续使用。close()
:先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。
3. FileWriter写数据的5个方法
void write(String str)
:写一个字符串数据void write(String str,int index,int len)
:写一个字符串中的一部分数据void write(int ch)
:写一个字符数据,这里写int类型的好处是既可以写char类型的数据,也可以写char对应的int类型的值。‘a’,97void write(char[] chs)
:写一个字符数组数据void write(char[] chs,int index,int len)
:写一个字符数组的一部分数据
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo3 {
public static void main(String[] args) throws IOException {
//创建输出流对象
FileWriter fw = new FileWriter("b.txt");
//void write(String str):写一个字符串数据
fw.write("abcde");
fw.write("\n\n");
//void write(String str,int index,int len):写一个字符串中的一部分数据
fw.write("abcde",0,5);
fw.write("abcde",1,3);
fw.write("\n\n");
//void write(int ch):写一个字符数据,这里写int类型的好处是既可以写char类型的数据,也可以写char对应的int类型的值。'a',97
fw.write('a');
fw.write(97);
fw.write("\n\n");
//void write(char[] chs):写一个字符数组数据
char[] chs = {'a','b','c','d','e'};
fw.write(chs);
fw.write("\n\n");
//void write(char[] chs,int index,int len):写一个字符数组的一部分数据
fw.write(chs,0,5);
fw.write(chs,2,3);
//释放资源
fw.close();
}
}
换行符:
- windows:
\r\n
- linux:
\n
- mac:
\r
追加写入:
FileWriter(String fileName, boolean append)
FileWriter fw = new FileWriter("c.txt",true); //表示追加写入,默认是false
4. FileReader读数据
从文件中读数据并显示到控制台
FileReader(String fileName)
:传递文件名称
输入流读文件的步骤:
- A:创建输入流对象
- B:调用输入流对象的读数据方法
- C:释放资源
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo {
public static void main(String[] args) throws IOException {
//创建输入流对象
// FileReader fr = new FileReader("fr.txt");
FileReader fr = new FileReader("FileWriterDemo.java");
//调用输入流对象的读数据方法
//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);
}
//释放资源
fr.close();
}
}
5. 利用FileReader和FileWriter复制文件
public class CopyFileDemo {
public static void main(String[] args) throws IOException {
//创建输入流对象
FileReader fr = new FileReader("FileWriterDemo.java");
//创建输出流对象
FileWriter fw = new FileWriter("Copy.java");
//读写数据
int ch;
while((ch=fr.read())!=-1) {
fw.write(ch);
}
//释放资源
fw.close();
fr.close();
}
}
6. FileReader一次读取一个字符数组
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo2 {
public static void main(String[] args) throws IOException {
//创建输入流对象
FileReader fr = new FileReader("FileWriterDemo.java");
char[] chs = new char[1024]; //这里可以是1024及其整数倍
int len;
//1:fr.read(chs)
//2:len=fr.read(chs)
//3:len != -1
while((len=fr.read(chs))!=-1) {
//System.out.println(new String(chs,0,len));
System.out.print(new String(chs,0,len));
}
//释放资源
fr.close();
}
}
对比:
7. 缓冲流 BufferedWriter、BufferedRead 的基本使用
BufferedWriter
:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。BufferedReader
:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.FileReader;
import java.io.IOException;
public class BufferedStreamDemo {
public static void main(String[] args) throws IOException {
//创建输出缓冲流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
bw.write("hello");
bw.flush();
bw.close();
//创建输入缓冲流对象
BufferedReader br = new BufferedReader(new FileReader("FileWriterDemo.java"));
/*
//一次读写一个字符
int ch;
while((ch=br.read())!=-1){
System.out.print((char)ch);
}
*/
//一次读写一个字符数组
char[] chs = new char[1024];
int len;
while((len=br.read(chs))!=-1) {
System.out.print(new String(chs,0,len));
}
//释放资源
br.close();
}
}
8. 高效地复制文本文件
-
读数据 –
FileReader
高效的读数据 –BufferedReader
-
写数据 –
FileWriter
高效的写数据 –BufferedWriter
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
pub
lic 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"));
//读写数据
/*
//一次读写一个字符
int ch;
while((ch=br.read())!=-1) {
bw.write(ch);
}
*/
//一次读写一个字符数组
char[] chs = new char[1024];
int len;
while((len=br.read(chs))!=-1) {
bw.write(chs,0,len);
}
//释放资源
bw.close();
br.close();
}
}
9. 缓冲流的特殊功能
- BufferedWriter
void newLine()
:写一个换行符,这个换行符由系统决定
- BufferedReader
String readLine()
:一次读取一行数据,但是不读取换行符
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedStreamDemo {
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new FileWriter("bw2.txt"));
for(int x=0; x<10; x++) {
bw.write("hello"+x);
//bw.write("\r\n");
bw.newLine();
bw.flush();
}
bw.close();
BufferedReader br = new BufferedReader(new FileReader("br.txt"));
String line = br.readLine();
System.out.println(line);
line = br.readLine();
System.out.println(line);
String line2;
//1:br.readLine()
//2:line=br.readLine()
//3:line != null
while((line2=br.readLine())!=null) {
System.out.println(line2);
}
br.close();
}
}
一次读取一行复制文本:
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();
}
}