字符流的读写相关

来源:互联网 发布:python搭建web服务器 编辑:程序博客网 时间:2024/06/09 21:15


字符流是什么* 字符流是可以直接读写字符的IO流* 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写出.    

类 FileReader

java.lang.Object——java.io.Reader————java.io.InputStreamReader——————java.io.FileReader所有已实现的接口: Closeable, Readable public class FileReader extends InputStreamReader用于读取字符流

public FileReader(String fileName) throws FileNotFoundException在给定从中读取数据的文件名的情况下创建一个新 FileReader。

public FileReader(File file) throws FileNotFoundException在给定从中读取数据的 File 的情况下创建一个新 FileReader。 

FileReader没有自己特有的方法,都是从自己的父类继承的
FileReader类的read()方法可以按照字符大小读取.通过项目默认的码表一次读取一个字符
 

 类 FileWriter

java.lang.Object ——java.io.Writer————java.io.OutputStreamWriter——————java.io.FileWriter所有已实现的接口: Closeable, Flushable, Appendable public class FileWriterextends OutputStreamWriter用于写入字符流如果所涉及的文件已经打开,则此类中的构造方法将失败。 

public FileWriter(String fileName) throws IOException根据给定的文件名构造一个 FileWriter 对象。 

public FileWriter(String fileName, boolean append) throws IOException根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。 参数:fileName - 一个字符串,表示与系统有关的文件名。append - 一个 boolean 值,如果为 true,则将数据写入文件末尾处,而不是写入文件开始处。 

public FileWriter(File file) throws IOException根据给定的 File 对象构造一个 FileWriter 对象。 
 
public FileWriter(File file, boolean append) throws IOException
根据给定的 File 对象构造一个 FileWriter 对象。如果第二个参数为 true,则将字节写入文件末尾处,而不是写入文件开始处。


FileWriter类没有自己特有的方法,都是从自己的父类继承的的
FileWriter类 write()方法可以自动把字符转为字节写出

public class a {/** * @param args * @throws IOException  */public static void main(String[] args) throws IOException {FileReader fr = new FileReader("xxx.txt");int x = fr.read();System.out.println(x);//22909char c = (char)x;System.out.println(c);//好fr.close();FileReader fr1 = new FileReader("xxx.txt");int c1;while((c1 = fr1.read()) != -1) {//通过项目默认的码表一次读取一个字符System.out.print((char)c1);}fr1.close();FileWriter fw = new FileWriter("yyy.txt");fw.write("大家好!!!");fw.write(97);//大家好!!!afw.close();}}


什么情况下使用字符流

字符流也可以拷贝文本文件, 但不推荐使用. 因为读取时会把字节转为字符, 写出时还要把字符转回字节,转换效率低程序需要读取一段文本, 或者需要写出一段文本(只读或只写)的时候可以使用字符流* 读取的时候是按照字符的大小读取的,不会出现半个中文* 写出的时候可以直接将字符串写出,不用转换为字节数组  字符流是否可以拷贝非纯文本的文件 不可以拷贝非纯文本的文件因为在读的时候会将字节转换为字符,在转换过程中,在码表中可能找不到对应的字符,就会用?代替,写出的时候会将字符转换成字节写出去 如果是?,直接写出,这样写出之后的文件就乱了,看不了了 

拷贝实例

public static void main(String[] args) throws IOException {FileReader fr = new FileReader("xxx.txt");FileWriter fw = new FileWriter("zzz.txt");int c;while((c = fr.read()) != -1) {fw.write(c);}fr.close();//fw.close();注释掉则不能写出//Writer类中有一个2k(1024个字符)的小缓冲区,如果不关流,就会将内容写到缓冲区里,关流会将缓冲区内容刷新,再关闭
自定义字符数组的拷贝

public static void main(String[] args) throws IOException {// 自定义字符数组的拷贝FileReader fr1 = new FileReader("xxx.txt");FileWriter fw1 = new FileWriter("m.txt");char[] arr1 = new char[1024];//1024整数倍int len;while((len = fr1.read(arr1)) != -1) {//将文件上的数据读取到字符数组中fw1.write(arr1,0,len);//将字符数组中的数据写到文件上//从arr[0]开始,写len个fw1.write(arr1,1,len);//从arr[1]开始,写len个,字符流和字节流大多都类似,可以相互理解}fr1.close();fw1.close();}


类 BufferedReader

java.lang.Object——java.io.Reader————java.io.BufferedReader所有已实现的接口: Closeable, Readable 直接已知子类: LineNumberReader public class BufferedRead erextends Reader从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取

类 BufferedWriter

java.lang.Object——java.io.Writer————java.io.BufferedWriter所有已实现的接口: Closeable, Flushable, Appendable public class BufferedWriterextends Writer将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 

public BufferedWriter(Writer out)创建一个使用默认大小输出缓冲区的缓冲字符输出流。 
public BufferedWriter(Writer out, int sz)创建一个使用给定大小输出缓冲区的新缓冲字符输出流。 

public void newLine() throws IOException写入一个行分隔符。
newLine()可以输出一个跨平台的换行符号"\r\n"newLine()与\r\n的区别 * newLine()是跨平台的方法 * \r\n只支持的是windows系统

 


read()方法 读取字符时会一次读取若干字符到缓冲区, 然后逐个返回给程序, 降低读取文件的次数, 提高效率write()方法 写出字符时会先写到缓冲区, 缓冲区写满时才会写到文件, 降低写文件的次数, 提高效率(缓冲区大小为8*1024个字符)readLine()方法可以读取一行字符(不包含换行符号)

public class d {/** * @param args * @throws IOException  */public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new FileReader("xxx.txt"));BufferedWriter bw = new BufferedWriter(new FileWriter("bbb.txt"));int ch;while((ch = br.read()) != -1) {//read一次,会先将缓冲区读满,从缓冲去中一个一个的返给临时变量chbw.write(ch);//write一次,是将数据装到字符数组,装满后再一起写出去}br.close();//关流bw.close();  BufferedReader br1 = new BufferedReader(new FileReader("bbb.txt"));String line;while((line = br1.readLine()) != null) {System.out.println(line);//System.out.print(line);}br1.close();BufferedReader br2 = new BufferedReader(new FileReader("zzz.txt"));BufferedWriter bw2 = new BufferedWriter(new FileWriter("aaa.txt"));String line1;while((line1 = br2.readLine()) != null) {bw2.write(line1);//没有回车换行bw2.newLine();//写出回车换行符 ok,跨平台//bw2.write("\r\n");//只支持windows系统}br2.close();bw2.close();}}


类 LineNumberReader

java.lang.Object——java.io.Reader————java.io.BufferedReader——————java.io.LineNumberReader所有已实现的接口: Closeable, Readable public class LineNumberRead erextends BufferedReader跟踪行号的缓冲字符输入流

 LineNumberReader是BufferedReader的子类, 具有相同的功能, 并且可以统计行号
     * 调用getLineNumber()方法可以获取当前行号* 调用setLineNumber()方法可以设置当前行号* read()一次!= null,则LineNumber++一次,当前行号将加 1。


public class f {/** * @param args * @throws IOException  */public static void main(String[] args) throws IOException {LineNumberReader lnr = new LineNumberReader(new FileReader("zzz.txt"));String line;//lnr.setLineNumber(100);//设置行号,从101开始while((line = lnr.readLine()) != null) {//System.out.println(lnr.getLineNumber() + ":" + line);//获取行号,从1开始}lnr.close();}}


使用指定的码表读写字符

FileReader是使用默认码表读取文件, 如果需要使用指定码表读取, 那么可以使用InputStreamReader(字节流,编码表)

类 InputStreamReader

java.lang.Object——java.io.Reader————java.io.InputStreamReader所有已实现的接口: Closeable, Readable 直接已知子类: FileReader InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。


public InputStreamReader(InputStream in, Charset cs)创建使用给定字符集的 InputStreamReader。

FileWriter是使用默认码表写出文件, 如果需要使用指定码表写出, 那么可以使用OutputStreamWriter(字节流,编码表)


public class h {/** * @param args * @throws IOException  */public static void main(String[] args) throws IOException {//用默认编码表读写,出现乱码FileReader fr = new FileReader("utf.txt");//你好FileWriter fw = new FileWriter("gbk.txt");//浣犲ソint c;while((c = fr.read()) != -1) {fw.write(c);}fr.close();fw.close();InputStreamReader isr = new InputStreamReader(new FileInputStream("utf.txt"), "uTf-8");//指定码表读字符OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("gbk.txt"), "gbk");//指定码表写字符//编码表可以大写可以小写也可以大小写int c1;while((c1 = isr.read()) != -1) {osw.write(c1);//你好}isr.close();osw.close();//更高效BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("utf.txt"), "utf-8"));BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("gbk.txt"), "gbk"));int c2;while((c2 = br.read()) != -1) {bw.write(c2);}br.close();bw.close();}}



小问题eclipse在选择编码选项中没有GBK格式的,我重下了好几次都没有,我是win7,但在在XP下有GBK编码选项解决并不是说不可以选就没有的,你可以自己填写上去的,我填的是GBK,此时Eclipse会自动记录的。当然,现在都不推荐使用GBK编码了,因为不利于系统迁移,数据库转型,扩展性等。尤其是数据库以后转编码是最麻烦的,我建议还是使用UTF-8吧,几乎所有系统都支持,而且方便日后国际化。


0 0
原创粉丝点击