File类与常用IO流第五章——IO字符流
字符流,只能操作文本文件,不能操作图片、视频等非文本文件
-
字符输入流 java.io.Reader
-

-
字符输入流中一些共性的成员方法
-
int read():读取单个字符并返回。
-
int read(char[] cbuf):一次读取多个字符,将这些字符存入数组。
-
void close():关闭该流并释放与之关联的所有资源。
-
文件字符输入流 FileRead extends InputStreamReader extends Reader
-
构造方法:
-
FileReader(File file):
-
FileReader(String fileName)
-
构造方法的参数:
-
File file :给定从中读取数据的文件
-
String fileName :给定从中读取数据的文件的名称
-
构造方法的作用:
-
创建一个FileReader对象
-
会把FileReader对象指向要读取的文件
-
文件字符输入流的使用步骤:
-
创建FileReader对象,构造方法中传递要读取的数据源;
-
使用FileReader 对象中的方法 read 读取文件;
-
释放资源。
-
使用 int read() 读取单个字
1 public static void main(String[] args) throws IOException { 2 FileReader fr=new FileReader("E:\\GZM\\abc.txt"); 3 int len=0; 4 while((len=fr.read())!=-1){ 5 System.out.print((char)len); 6 } 7 fr.close(); 8 }
-
使用这个方法经常会出现乱码问题,原因是系统自带的默认格式与文件存储的格式并不一定一致。但是FileReader 在读取文件的时候并不能指定特定的编码格式。解决方法1是将目标文件存储时更改格式。解决方法2是那就在FileInputStream外面嵌套InputStream 来代替FileReader,之后指定编码格式即可,简单来说读取文件用下面的代码即可
InputStreamReader fr = new InputStreamReader( new FileInputStream("D:\\temple\\高温买卖.txt"),"UTF-8");
-
为了提高读取的效率,使用 int read(char[] cbuf) 一次读取多个字符,并存入字符数组
-
String(char[] value) 分配一个新的String,使其表示字符数组参数中当前包含的字符序列
1 public static void main(String[] args) throws IOException { 2 FileReader fr=new FileReader("E:\\GZM\\abc.txt"); 3 int len=0; //读取到的有效字符个数 4 char[] cs=new char[1024]; //读取到的字符数组 5 while((len=fr.read(cs))!=-1){ 6 System.out.print(new String(cs)); 7 } 8 fr.close(); 9 }
-
运行后发现后续的字符数组影响了新创建的字符串。
-
使用 int read(char[] cbuf) 一次读取多个字符,并存入字符数组
-
String(char[] value,int offset, int count)分配一个新的 String,它包含取自字符数组参数一个子数组的字符。后续对字符数组的修改不会影响新创建的字符串。
1 int len=0; 2 char[] cs=new char[1024]; 3 while((len=fr.read(cs))!=-1){ 4 System.out.print(new String(cs,0,len)); 5 } 6 fr.close();
-
运行结果很满意。
-
-
字符输出流 java.io.Writer
-

-
构造方法:
-
Write():创建一个新的字符流write,其关键部分将同步write自身。
-
Write(Object lock):创建一个新的字符流wirte,其关键部分将同步给定的对象。
-
lock:用于同步针对此流的操作的对象。为了提高效率,字符流对象可以使用其自身以外的对象来保护关键部分。因此,子类应使用此字段中的对象,而不是 this 或者同步的方法。【这个暂时不懂,可能与多线程的读写锁有关】
-
一些共性的成员方法:
-
void write(int c):写入单个字符。
-
void wirte(char[] cbuf):写入字符数组。
-
abstract void write(char[] cbuf,int off,int len):写入字符数组的某一部分。
-
void write(String str):写入字符串。
-
void write(String str,int off,int len)。写入字符串的某一部分。
-
abstract void close():关闭此流,但要先刷新它。
-
abstract void flush():刷新该流的缓冲。
-
flush 与 close 的区别:因为内置缓冲区的原因,如果不关闭输出流,无法写入字符到文件中。但是关闭的流对象,是无法继续写入数据的。如果我们既想要写出数据,又想继续使用流,就需要flush方法:
-
flush:刷新缓冲区,流对象可以继续使用。
-
close:先刷新缓冲区,然后通知系统释放资源。流对象不能再被使用了。关闭流之后继续使用会异常:IOException:Stream closed 流已经关闭异常。
-
-
文件字符输出流 java.io.FileWriter extends OutputStreamWriter extends Writer
-
构造方法:
-
FileWrite(File file):根据给定的File对象构造一个FileWrite对象。
-
FileWrite(String fileName):根据给定的文件名构造一个FileWrite对象。
-
FileWrite(File file,boolean append)
-
FileWrite(String fileName,booean append)
-
构造方法的参数:
-
File file:一个文件对象
-
String fileName:文件的路径
-
boolean append:是否需要覆盖原文件
-
true:不会覆盖原文件中的数据,而是续写。
-
false:覆盖原文件的数据。
-
构造方法的作用:
-
会创建一个FileWrite对象;
-
会根据构造方法中绑定的文件\文件的路径,创建文件;
-
会把FileWrite对象指向创建好的文件。
-
字符输出流的使用步骤:
-
创建一个FileWrite对象,构造方法中绑定要写入数据的目的地;
-
使用FileWrite中的方法 write ,把数据写入到内存缓冲区中(字符转为为字节);
-
使用FileWrite中的方法 flush ,把内存缓冲区的中数据,刷新到文件中;
-
释放资源(会把内存缓冲区中的数据刷新到文件中,所以第3步可以不用写。
-
-
文件字符输出流的写入方法演示
-
写入单个字符:void write(int c)
1 FileWriter fw=new FileWriter("E:\\temp\\abc.txt"); 2 fw.write(117); //'u' 3 //fw.flush(); 4 fw.close();
-
写入字符数组:void write(char[] cbuf)
1 FileWriter fw=new FileWriter("E:\\temp\\AAA.txt"); 2 char[] cs=new char[]{'I',' ','L','o','v','e',' ','J','a','v','a'}; fw.write(cs); 3 //fw.flush(); 4 fw.close();
-
写入字符数组的某一部分:abstract void write(char[] cbuf,int off,int len)
1 FileWriter fw=new FileWriter("E:\\temp\\BBB.txt"); 2 char[] cs=new char[]{'I',' ','L','o','v','e',' ','J','a','v','a'}; fw.write(cs,3,7); 3 //fw.flush(); 4 fw.close();
-
写入字符串:void write(String str)
1 FileWriter fw=new FileWriter("E:\\temp\\CCC.txt"); 2 fw.write("I LOVE C TOO"); 3 //fw.flush(); 4 fw.close();
-
写入字符串的某一部分:void write(String str,int off,int len)
1 FileWriter fw=new FileWriter("E:\\temp\\CCC.txt"); 2 fw.write("I LOVE C TOO",3,9); 3 //fw.flush(); 4 fw.close();
-
文件字符输出流的换行:
-
windows:\r\n
-
Linux:/n
-
max:/r
本文来自博客园,作者:水啾2,转载请注明原文链接:https://www.cnblogs.com/shuijiu/p/15020803.html

浙公网安备 33010602011771号