FileWriter fw=new FileWriter("d:\\demo.txt");
(2)调用Writer方法,将字符写入流中。
fw.write("abc");
(3)刷新流对象中的缓冲器数据。将数据刷新到目的地(文件)。在流关闭之前,流一直存在,可以反复写入数据,但每次写入后,都需要进行刷新操作。
fw.flush();
(4)关闭流资源(必须有的步骤)。但关闭之前会刷新一次内部缓冲区的数据,将数据刷新懂啊目的地(文件)。
fw.close();
3、
flush与close的区别:
FileWriter(String file,boolean append)://根据给定的文件名以及指示是否附加写入数据的boolean值来构造FileWriter对象。如果append为true,则将数据写入文件末尾处。
FileWriter fw=new FileWriter("demo.txt",true);//传递一个ture参数,代表不覆盖已有文件,并在已有文件的末尾处进行数据续写。若没有文件,则创建。
程序示例:
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo {
public static void main(String[] args) throws IOException {
//创建一个FileWriter对象,该对象一被初始化就必须要有被操作的文件。
//而且该文件会被创建到指定目录下,如果该目录已有同名文件,将被覆盖
FileWriter fw=new FileWriter("demo.txt");
fw.write("aaaa");
fw.flush();
fw.close();
}
}
1、 缓冲区的出现:提高了流的读写效率,所以在缓冲区创建前,要先创建流对象。即先将流对象初始化到构造函数中。
2、 缓冲技术原理:此对象中封装了数组,将数据存入,再一次性取出。
3、 写入流缓冲区BufferedWriter的步骤:
(1)创建一个字符写入流对象。
FileWriter fw=newFileWriter("buf.txt");
(2)为了提高字符写入流效率。加入缓冲技术。只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可。
BufferedWriter bufw =new BufferedWriter(fw);
(3)调用write方法写入数据到指定文件
bufw.write("adfg");
记住,只要用到缓冲区,就要记得刷新。(关闭流同样会刷新,但为了排除意外事故,保证数据存在,建议写入一次就刷新一次)
bufw.flush();
(4)其实关闭缓冲区,就是在关闭缓冲区中的流对象。
bufw.close();
小知识:BufferedWriter缓冲区中提供了一个跨平台的换行符:newLine();可以在不同操作系统上调用,用作数据换行。
程序示例:
/*
缓冲区的出现是为了提高流的操作效率而出现的
所以在创建缓冲区之前,必须先有流对象
*/
import java.io.*;
public class BufferedWriterDemo {
public static void main(String[] args) throws IOException {
//创建一个字符写入流对象
FileWriter fw=new FileWriter("buf.txt");
//为了提高字符写入流效率,加入了缓冲技术,只需要将需要被提高效率的流对象传递给缓冲区的构造函数即可。
BufferedWriter bw=new BufferedWriter(fw);
bw.write("abac");
bw.newLine();
bw.write("abac");
//其实关闭缓冲区就是在关闭缓冲区中的流对象。
bw.close();
}
}
2.4 OutputStreamWriter
OutputStreamWriter: 是字符通向字节流的桥梁。本身是字符流。都是有参构造函数。主要操作在控制台。
为获取最高效率,可将OutputStreamWriter 包装到BufferedWriter 中,避免频繁调用转换器。
例:BufferedWriter out=new BuffereWriter(new OutputStreamWriter(System.out));
程序示例:
/*
读取键盘录入
System.out:对应的是标准的输出设备,控制台
System.in:对应的是标准输入设备,键盘
需求:
通过键盘录入数据
当录入一行数据后,就将该数据进行打印
如果录入的数据时over,那么停止打印。
*/
import java.io.*;
public class ReadIn {
public static void main(String[] args) throws IOException {
InputStream in=System.in;
InputStreamReader isr=new InputStreamReader(in);
BufferedReader br=new BufferedReader(isr);
BufferedWriter out=new BuffereadWriter(new OutputStreamWriter(System.out);
String line=null;
while((line=br.readLine())!=null){
if("over".equals(line))
break;
out.wirte(line.toUpperCase());
out.newLine();out.flush();
}
br.close();out.close();
}
}
2.5 Reader
1、 Reader: 用于读取字符流的抽象类。子类必须实现的方法只有read(char[] , int , int )和close()。
2、 已知直接子类:BufferedReader、CharArrayReader、FilterReader、InputStreamReader、PipedReader、StringReader。
3、 方法
read(); //读取的是单个字符
boolean ready(); //判断是否准备读取此流。
void reset(); //重置该流
long skip(long n);//跳过字符,返回实际跳过的字符数;若n 为负数,发生异常IllegalArgumentException
void mark(); //标记流中的当前位置
boolean markSupported(); //判断此流是否支持mark()操作
2.6 FileReader
1、 FileReader: 用来读取字符文件的便捷类。此类构造方法假定默认字符编码和默认字节缓冲区大小适当。
2、 方法
close(); //关闭该流并释放与之关联的所有资源。
int read(); //读取。
3、 步骤:
(1)创建一个文件读取流对象,与指定名称的文件相关联。必须保证该文件存在,若不存在则发生异常FileNotFoundException。
FileReader fr=new FileReader(“demo.txt”);
(2)调用读取流对象的read()方法。
fr.read();
fr.read(buf);//存入缓冲区buf;
一次只读取一个字符,而且会自动往下读。 如果已达到流末尾,则返回-1.
(3)关闭资源。
fr.close();
程序示例:
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;
public class FileReaderDemo {
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("demo.txt");
char[] buf=new char[1024];
int num=0;
while((num=fr.read(buf))!=-1)
sop(num+"..."+new String(buf,0,num));
fr.close();
// int ch;
// while((ch=fr.read())!=-1){
// sop((char)ch);
// }
}
public static void sop(Object obj){
System.out.println(obj);
}
}
2.7 BufferedReader(缓冲区)
1、 BufferedReader : 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
2、 方法
String readLine(); //读取一个文本行。该缓冲区提供了一个一次读一行的方法 readLine,方便于对文本数据的获取。当返回null 时,表示读到文件末尾(即:若内容不含任何行终止符,已达到流末尾,则返回null)。readLine 方法返回的时候只返回回车符之前的数据内容。并不返回回车符。
readLine()原理:无论是读一行,或者读取多个字符。其实最终都是在硬盘上一个一个读取。所以最终使用的还是read 方法一次读一个方法。
3、 步骤:
(1)创建一个读取流对象和文件相关联。
FileReader fr=new FileReader(“buf.txt”);
(2)为了提高效率,加入缓冲技术。将字符读取流对象作为参数传递给缓冲对象函数的构造函数。
BufferedReader bufr=new BufferedReader(fr);
(3)读取缓冲区。
String line=null; //记录读取的数据
while((line=bufr.readLine())!=null) //按行读取文本内容
{
System.out.println(line);
}
(4)关闭缓冲区资源
bufr.close();
程序示例:
import java.io.*;
/*
字符读取流缓冲区
该缓冲区提供了一个一次读一行的方法readline,方便于对数据的读取
当返回null时,表示读到文件末尾
readLine方法返回的时候只返回回车符之前的数据内容,并不返回回车符
*/
public class BufferedReaderDemo {
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("buf.txt");
BufferedReader br=new BufferedReader(fr);
String line=null;
while((line=br.readLine())!=null)
System.out.println(line);
br.close();
}
}
2.8 LineNumberReader(BufferedReader 子类)
1、 LineNumberReader: 是BufferedReader 的子类。跟踪行号缓冲字符输入流。默认情况下,行编号从0 开始。该行号随数据读取在每个行结束符处递增,并可以通过调用
setLineNumber(int)更改行号,但并不会实际更改流中的当前位置;它只更改将由getLineNumber()返回的值。
2、 方法
setLineNumber(int); //设置当前行号,可以设置行号的起点
getLineNumber(); //获取当前行号
程序示例:
import java.io.*;
//练习:模拟一个带行号的缓冲区对象
public class LineNumberReaderDemo {
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("FileReaderDemo_1.java");
LineNumberReader lnr=new LineNumberReader(fr);
String line=null;
// lnr.setLineNumber(5);
while((line=lnr.readLine())!=null){
System.out.println(lnr.getLineNumber()+":"+line);
}
lnr.close();
}
}
2.9 InputStreamReader
1、 InputStreamReader : 是字节流通向字符流的桥梁。本身是字符流。使用指定的charset读取字节并将其解码为字符。它使用的字符集可以由名称指定或显示给定,或者接受平台默认的字符集。为提高效率,可以在BufferedReader 内包装InputStreamReader。
2、 构造方法:
InputStreamReader(InputStream out,String charsetName);//创建使用字符集的InputStreamReader,主要作用:转换指定的字节,查指定的码表。InputStream out 为指定字节流。String charsetName 为指定编码表。
3、 键盘录入最常见写法
BufferedReader in = new BufferedRead(new InputStreamReader(System.in));
程序示例:
/*
读取键盘录入
System.out:对应的是标准的输出设备,控制台
System.in:对应的是标准输入设备,键盘
需求:
通过键盘录入数据
当录入一行数据后,就将该数据进行打印
如果录入的数据时over,那么停止打印。
*/
import java.io.*;
public class ReadIn {
public static void main(String[] args) throws IOException {
InputStream in=System.in;
InputStreamReader isr=new InputStreamReader(in);
BufferedReader br=new BufferedReader(isr);
String line=null;
while((line=br.readLine())!=null){
if("over".equals(line))
break;
System.out.println(line.toUpperCase());
}
br.close();
}
}