黑马程序员:Java基础总结
字符流Reader&Writer
字符流
该缓冲区中提供了一个跨平台的换行符。
newLine();
字符流两个基类:
Reader Writer
Reader Writer
类 Writer 方法
//创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件。
//而且该文件会被创建到指定目录下。如果该目录下已有同名文件,将被覆盖。
//其实该步就是在明确数据要存放的目的地。
FileWriter fw =
new
FileWriter(
"demo.txt"
);
//调用write方法,将字符串写入到流中。
fw .write(
"abcde"
);
//刷新流对象中的缓冲中的数据。
//将数据刷到目的地中。
//fw. flush();
//关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据。
//将数据刷到目的地中。
//和flush区别:flush刷新后,流可以继续使用,close刷新后,会将流关闭。
fw. close();
类 FileWriter
FileWriter(String fileName, boolean append) 根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。 |
FileWriter(File file, boolean append) 根据给定的 File 对象构造一个 FileWriter 对象。 |
//传递一个true参数,代表不覆盖已有的文件。并在已有文件的末尾处进行数据续写。
FileWriter fw =
new
FileWriter(
"demo.txt"
,
true
);
fw.write(
"nihao\r\nxiexie"
);
fw.close()
类 BufferedWriter
BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的缓冲字符输出流。 |
缓冲区的出现是为了提高流的操作效率而出现的。
所以在创建缓冲区之前,必须要先有流对象。
所以在创建缓冲区之前,必须要先有流对象。
该缓冲区中提供了一个跨平台的换行符。
newLine();
void | newLine() 写入一个行分隔符。 |
BufferedReader bufr =
null
;
BufferedWriter bufw =
null
;
try
{
bufr =
new
BufferedReader(
new
FileReader(
"BufferedWriterDemo.java"
));
bufw =
new
BufferedWriter(
new
FileWriter(
"bufWriter_Copy.txt"
));
String line =
null
;
while
((line=bufr.readLine())!=
null
)
{
bufw.write(line);
bufw.newLine();
bufw.flush();
}
}
类 Reader 方法
类 FileReader
构造同FileWriter,方法同Reader,
FileWriter fw =
null
;
FileReader fr =
null
;
try
{
fw =
new
FileWriter(
"SystemDemo_copy.txt"
);
fr =
new
FileReader(
"SystemDemo.java"
);
char
[] buf =
new
char
[1024];//提高效率
int
len = 0;
while
((len=fr.read(buf))!=-1)
{
fw.write(buf,0,len);
}
}
类 BufferedReader
BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。 |
字符读取流缓冲区:
该缓冲区提供了一个一次读一行的方法 readLine,方便于对文本数据的获取。
当返回null时,表示读到文件末尾。
readLine方法返回的时候只返回回车符之前的数据内容。并不返回回车符。 (windows中回车是\r\n)
该缓冲区提供了一个一次读一行的方法 readLine,方便于对文本数据的获取。
当返回null时,表示读到文件末尾。
readLine方法返回的时候只返回回车符之前的数据内容。并不返回回车符。 (windows中回车是\r\n)
String line =
null
;
while
((line=bufr.readLine())!=
null
)
{
System.out.print(line);
}
类 LineNumberReader extends BufferedReader
特有方法:
int | getLineNumber() 获得当前行号。 |
void | setLineNumber(int lineNumber) 设置当前行号。 |
默认情况下,行编号从 0 开始。该行号随数据读取在每个
行结束符处递增,并且可以通过调用
setLineNumber(int)
更改行号。但要注意的是,
setLineNumber(int)
不会实际更改流中的当前位置;它只更改将由
getLineNumber() 返回的值。
下面模拟了这一过程
import
java.io.*;
class
MyLineNumberReader {
private
Reader
r
;
private
int
lineNumber
;
MyLineNumberReader(Reader r) {
this
.
r
= r;
}
public
String myReadLine()
throws
IOException {
lineNumber
++;
StringBuilder sb =
new
StringBuilder();
int
ch = 0;
while
((ch =
r
.read()) != -1) {
if
(ch ==
'\r'
)
continue
;
if
(ch ==
'\n'
)
return
sb.toString();
else
sb.append((
char
) ch);
}
if
(sb.length() != 0)
return
sb.toString();
return
null
;
}
public
void
setLineNumber(
int
lineNumber) {
this
.
lineNumber
= lineNumber;
}
public
int
getLineNumber() {
return
lineNumber
;
}
public
void
myClose()
throws
IOException {
r
.close();
}
}
public
class
Ts {
public
static
void
main(String[] args)
throws
IOException {
FileReader fr =
new
FileReader(
"copyTextByBuf.java"
);
MyLineNumberReader mylnr =
new
MyLineNumberReader(fr);
String line =
null
;
mylnr.setLineNumber(100);
while
((line = mylnr.myReadLine()) !=
null
) {
System.
out
.println(mylnr.getLineNumber() +
"::"
+ line);
}
mylnr.myClose();
}
}