Java IO(二)-字符流
【字符流】
【字符流继承体系简图】
【FileWriter】
import java.io.*;
class FileWriterDemo {
public static void main(String[] args) throws IOException {
// 创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的
// 文件而且该文件会被创建到指定目录下,如果该目录下已有同名文
// 件,则会将其覆盖
// 其实改不就是在明确数据要存放的目的地
FileWriter fw = new FileWriter("Demo.txt");
// 调用write方法,将字符串写入到流中
fw.write("hello java");
// 将流缓冲的数据刷新到目的地中
// fw.flush();
fw.write("hello world");
// 关闭此流,但会先刷新该流缓冲
fw.close();
}
}
文件续写:
//传递参数true,代表不覆盖已存在的文件,并在已有文件的末尾处进行数据续
//写,如果指定目录中没有目标文件,则创建文件
fw = newFileWriter("Demo.txt",true);
//在windows系统中\r\n表示换行,在Linux系统中\n表示换行
fw.write("\r\n你好!");
FileWriter-FileWriter(StringfileName, boolean append):
public FileWriter(String fileName, boolean append) throws IOException:
根据给定的文件名以及指示是否附加写入数据的 boolean值来构造
FileWriter对象。
fileName - 一个字符串,表示与系统有关的文件名。
append - 一个 boolean值,如果为 true,则将数据写入文件末尾处,而不
是写入文件开始处。
Writer-write:
public void write(char[] cbuf)throws IOException:
写入字符数组。
public abstract void write(char[] cbuf, int off, int len) throws IOException:
写入字符数组的某一部分。
off - 开始写入字符处的偏移量
len - 要写入的字符数
public void write(String str) throws IOException:
写入字符串。
public void write(String str, int off, int len) throws IOException:
写入字符串的某一部分。
off - 相对初始写入字符的偏移量
len - 要写入的字符数
Writer-flush:
public abstract void flush()throws IOException:
刷新该流的缓冲。如果该流已保存缓冲区中各种 write()方法的所有字符,
则立即将它们写入预期目标。然后,如果该目标是另一个字符或字节流,
则将其刷新。因此,一次 flush()调用将刷新 Writer和 OutputStream链
中的所有缓冲区。
Writer-close:
public abstract void close()throws IOException:
关闭此流,但要先刷新它。在关闭该流之后,再调用 write()或 flush()将
导致抛出 IOException。关闭以前关闭的流无效。
【文本文件读取】
方式一:
FileReader fr = null;
try {
// 创建一个文件输入流对象,并和指定文件相关联
// 要保证该文件是已经存在的,如果不存在则会发生
// FileNotFoundException异常
fr = new FileReader("Demo.txt");
int ch = 0;
// 调用输入流的read方法
// read():一次读一个字符,并且会自动向下读
// 若读到末尾,则返回-1
while ((ch = fr.read()) != -1)
System.out.println((char) ch);
} catch (IOException e) {
System.out.println(e.toString());
} finally {
try {
if (!(fr == null))
fr.close();
} catch (IOException e) {
System.out.println(e.toString());
}
方式二:
FileReader fr = null;
try {
fr = new FileReader("Demo.txt");
// 定义一个字符数组,用于存储读到的字符
// 该read(char[])返回的是读到的字符个数
// 若定义的字符数组长度比流中长度小,
// 则每次循环只能读到数组长度的数据
// 下次循环读到的数据会覆盖原数组中的数据
// 所以数组长度一般定义为1024
char[] buf = new char[1024];
int num = 0;
while ((num = fr.read(buf)) != -1)
// String(buf,0,num):获取buf中从0开始num个元素
System.out.println(new String(buf, 0, num));
} catch (IOException e) {
System.out.println(e.toString());
} finally {
try {
if (!(fr == null))
fr.close();
} catch (IOException e) {
System.out.println(e.toString());
}
}
【拷贝文本文件】
方式一:
//创建目的地
FileWriter fw = newFileWriter("systemdemo.txt");
//与源文件相关联
FileReader fr = newFileReader("SystemDemo.java");
int ch = 0;
while((ch = fr.read())!=-1)//每次读取一个字符
fw.write(ch);
方式二:
FileWriterfr = new FileReader("RuntimeDemo.java");
FileReader fw = newFileWriter("runtimedemo.txt");
char[] buf = new char[1024];
int len = 0;
while((len = fr.read(buf))!=-1)//每次读取一段字符
fw.write(buf,0,len);
【字符流缓冲区】
-
缓冲区的出现提高了对数据的读写效率
-
对应类:
-
BufferedWriter
-
BufferedReader
-
-
缓冲区要结合流才可以使用
-
在流的基础上对流的功能进行了加强
【BufferedWriter】
public class BufferedWriter extendsWriter:
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符
串的高效写入。可以指定缓冲区的大小,或者接受默认的大小。在大多数
情况下,默认值就足够大了。
例:
// 创建一个字符输出流对象
FileWriter fw = new FileWriter("buf.txt");
// 为了提高字符输出流效率,加入了缓冲区技术
// 只要将需要被提高效率的流对象作为参数传递给缓冲区的构造方法即可
BufferedWriter bfw = new BufferedWriter(fw);
for (int x = 0; x < 5; x++) {
bfw.write("hello java" + x);
// 写入一个行分隔符。
bfw.newLine();
bfw.flush();
}
public void newLine()throws IOException:
写入一个行分隔符。行分隔符字符串由系统属性line.separator定义,并且
不一定是单个新行 ('\n')符。该方法具有跨平台性。
【BufferedReader】
publicclass BufferedReader extends Reader:
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高
效读取。可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,
默认值就足够大了。
例:
// 创建一个输入流对象和文件相关联
FileReader fr = new FileReader("BufferedWriterDemo.java");
// 为了提高效率,加入了缓冲技术
// 将字符输入流对象作为参数传递给缓冲对象构造方法
BufferedReader bufr = new BufferedReader(fr);
String line = null;
// readLine():读取一个文本行
while ((line = bufr.readLine()) != null) {
System.out.println(line);
}
public StringreadLine()throwsIOException:
读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回
车 ('\r')或回车后直接跟着换行。
包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返
回 null
【LineNumberReader】
publicclass LineNumberReader extendsBufferedReader:
跟踪行号的缓冲字符输入流。默认情况下,行编号从 0开始。该行号
随数据读取在每个行结束符处递增,并且可以通过调用
setLineNumber(int)更改行号。但要注意的是,setLineNumber(int)不会
实际更改流中的当前位置;它只更改将由getLineNumber()返回的值。
-
public int getLineNumber():返回当前行号
-
public void setLineNumber(int lineNumber):设置当前行号
例:
FileReader fr = new FileReader("PersonDemo.java");
LineNumberReader lnr = new LineNumberReader(fr);
// 设置当前行号
lnr.setLineNumber(100);
String line = null;
while ((line = lnr.readLine()) != null)
// getLineNumber():获得当前行号
System.out.println(lnr.getLineNumber() + ":\t" + line);
//打印结果行号从101开始