怎么从一个文件中往程序中读入数据:
- 创建文件输入流对象,并和指定名称的文件相关联;
- 使用对象的read等方法读入数据;
- 关闭流对象。
例:
import java.io.IO.*;
public class FileReaderDemo {
public static void main(String[] args) {
FileReader reader = null;
// 由于IO流在操作数据时会抛出异常,我们应该捕获并进行相应的操作
try {
// 创建一个文件读取流对象,并和指定名称的文件相关联,如果文件不存在系統会抛出
// FileNotFoundException异常
reader = new FileReader("demo.txt");
/*
int ch = -1;
// read()一次读一个字符,当数据读完时会返回-1
while ((ch = reader.read()) != -1) {
// 每读入一个字符就在控制台打印一个字符
System.out.println("ch=" + (char) ch);
}
*/
// 定义一个字符数组,用于存储读到字符
char[] chArr = new char[1024];
// 用于存储读入char数组中字符的个数
int len = -1;
while ((len = reader.read(chArr)) != -1) {
// 打印读入数组中的所有字符组成的字符串
System.out.println(new String(chArr, 0, len));
}
// 在关闭流资源前可以先刷新一下,把流中的数据刷入目的地
// 仅使用此方法时并不关闭流资源
// reader.flush();
} catch (FileNotFoundException e) {
System.out.println("文件读取失败");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 关闭流资源
reader.close();
} catch (IOException e) {
System.out.println("关闭流资源失败");
}
}
}
}
怎么从程序往一个文件中写入数据:
- 创建文件输出流对象;
- 使用对象的write等方法写入数据;
- 关闭流对象。
示例:
import java.io.*;
public class FileWriterDemo {
public static void main(String[] args) {
FileWriter writer = null;
try {
// 创建一个输出流对象,会在指定目录下创建此文件
// 如果该目录下有同名文件,将会被覆盖。
writer = new FileWriter("demo.txt");
// 如果存在此文件,想要在内容后面续写,传入FileWriter构造方法的第二个参数为true即可
// writer = new FileWriter("demo.txt",true);
// 可以直接写入字符串
writer.write("afdhdj");
// 刷新流对象中的缓冲的数据,流仍然存在
// writer.flush();
} catch (IOException e) {
System.out.println("写入资源失败");
} finally {
try {
if (writer != null) {
// 关闭流资源
writer.close();
}
} catch (IOException e) {
System.out.println("关闭流资源失败");
}
}
}
}
字符流的缓冲区
字符流的缓冲区就是对字符流的一种处理流BufferedReader和BufferedWriter,处理流对象中封装了数组。
将数据存入,再一次性取出。其实处理流就是运用了设计模式中的装饰模式,对已有对象的功能进行增强。所以处理流必须要有要增强功能的流对象,即构造方法中需要传入相应的输入或输出流对象。
缓冲区的出现提高了流的读写效率
例,使用处理流来拷贝文件,提高效率。:
import java.io.IOException;
public class CopyByBuffer {
public static void main(String[] args) {
// 声明输入输出流对象
FileWriter writer = null;
FileReader reader = null;
// 声明处理流对象
BufferedWriter bufWriter = null;
BufferedReader bufReader = null;
try {
// 创建输出流对象,并指定目标文件
writer = new FileWriter("d:\\demo.txt");
// 创建输入流对象,并与要操作的文件相关联
reader = new FileReader("c:\\demo.txt");
// 创建处理流对象,并把要增强功能的输出流对象传入
bufWriter = new BufferedWriter(writer);
bufReader = new BufferedReader(reader);
// 读入内存中的数据
String line = null;
// 每次从流中读一行到line中
while ((line = bufReader.readLine()) != null) {
// 将内存中的数据写入流中
bufWriter.write(line);
// 换行
bufWriter.newLine();
// 将流中的数据刷新到指定文件中
bufWriter.flush();
}
} catch (IOException e) {
System.out.println("文件读写失败");
} finally {
// 关闭流资源
if (bufWriter != null) {
try {
bufWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bufReader != null) {
try {
bufReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
注意:
- 缓冲流要结合流才可以使用,它只是在流的基础上对流的功能进行了增强;
- 缓冲流提供了一个跨平台的行分隔符:newLine();
- BufferedReader提供了一个一次读取一行的方法readLine();方便于对文本数据的读取;
- readLine读取的数据不包含任何行终止符,当返回null时,表示读到文件末尾;
- 关闭缓冲流对象即是关闭了它处理的流对象资源,因为缓冲流其实就是在内存中创建一个缓冲的区域,先把数据存入缓冲区,再进行多个字符的读写以提高文本数据的读写效率,当使用close的时候,实际上在方法的内部关闭的是构造方法时传入的流对象,而readLine()方法实现的最终原理也是从硬盘一个一个的读入缓冲流对象封装的字符数组,当读到行终止符时以字符串的形式返回读到的数据。