二、字符流
- 字符流简介:
-
字符流中的对象融合了编码表,也就是系统默认的编码表。我们的系统一般都是utf-8编码。
-
字符流只用来处理文本数据,字节流用来处理媒体数据。
-
数据最常见的表现方式是文件,字符流用于操作文件的子类一般是FileReader和FileWriter。
2.字符流读写:
注意事项: -
写入文件后必须要用flush()刷新。
-
用完流后记得要关闭流
-
使用流对象要抛出IO异常
-
定义文件路径时,可以用“/”或者“\”。
-
在创建一个文件时,如果目录下有同名文件将被覆盖。
-
在读取文件时,必须保证该文件已存在,否则出异常
示例1:在硬盘上创建一个文件,并写入一些文字数据
[java] view plain copy
- class FireWriterDemo {
-
public static void main(String[] args) throws IOException { //需要对IO异常进行处理
-
//创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件。
-
//而且该文件会被创建到指定目录下。如果该目录有同名文件,那么该文件将被覆盖。
-
FileWriter fw = new FileWriter("F:\\1.txt");//目的是明确数据要存放的目的地。
-
//调用write的方法将字符串写到流中
-
fw.write("hello world!");
-
//刷新流对象缓冲中的数据,将数据刷到目的地中
-
fw.flush();
-
//关闭流资源,但是关闭之前会刷新一次内部缓冲中的数据。当我们结束输入时候,必须close();
-
fw.write("first_test");
-
fw.close();
-
//flush和close的区别:flush刷新后可以继续输入,close刷新后不能继续输入。
-
}
- }
示例2:FileReader的reade()方法.
要求:用单个字符和字符数组进行分别读取
[java] view plain copy
- class FileReaderDemo {
-
public static void main(String[] args) {
-
characters();
-
}
- /字符数组进行读取****/
-
private static void characters() {
-
try {
-
FileReader fr = new FileReader("Demo.txt");
-
char [] buf = new char[6];
-
//将Denmo中的文件读取到buf数组中。
-
int num = 0;
-
while((num = fr.read(buf))!=-1) {
-
//String(char[] value , int offest,int count) 分配一个新的String,包含从offest开始的count个字符
-
sop(new String(buf,0,num));
-
} I love you
-
sop('\n');
-
fr.close();
-
}
-
catch (IOException e) {
-
sop(e.toString());
-
}
-
}
- /单个字母读取********/
-
private static void singleReader() {
-
try {
-
//创建一个文件读取流对象,和指定名称的文件关联。
-
//要保证文件已经存在,否则会发生异常:FileNotFoundException
-
FileReader fr = new FileReader("Demo.txt");
-
//如何调用读取流对象的read方法?
-
//read()方法,一次读取一个字符,并且自动往下读。如果到达末尾则返回-1
-
int ch = 0;
-
while ((ch=fr.read())!=-1) {
-
sop((char)ch);
-
}
-
sop('\n');
-
fr.close();
-
/*int ch = fr.read();
-
sop("ch=" + (char)ch);
-
int ch2 = fr.read();
-
sop("ch2=" + (char)ch2);
-
//使用结束注意关闭流
-
fr.close(); */
-
}
-
catch (IOException e) {
-
sop(e.toString());
-
}
-
}
- /Println**/
-
private static void sop(Object obj) {
-
System.out.print(obj);
-
}
- }
示例3:对已有文件的数据进行续写
[java] view plain copy
- import java.io.*;
- class FileWriterDemo3 {
-
public static void main(String[] args) {
-
try {
-
//传递一个参数,代表不覆盖已有的数据。并在已有数据的末尾进行数据续写
-
FileWriter fw = new FileWriter("F:\\java_Demo\\day9_24\\demo.txt",true);
-
fw.write(" is charactor table?");
-
fw.close();
-
}
-
catch (IOException e) {
-
sop(e.toString());
-
}
-
}
- /Println**/
-
private static void sop(Object obj)
-
{
-
System.out.println(obj);
-
}
- }
练习:
将F盘的一个文件复制到E盘。
思考:
其实就是将F盘下的文件数据存储到D盘的一个文件中。
步骤:
1.在D盘创建一个文件,存储F盘中文件的数据。
2.定义读取流和F:盘文件关联。
3.通过不断读写完成数据存储。
4.关闭资源。
源码:
[java] view plain copy
- import java.io.*;
- import java.util.Scanner;
- class CopyText {
-
public static void main(String[] args) throws IOException {
-
sop("请输入要拷贝的文件的路径:");
-
Scanner in = new Scanner(System.in);
-
String source = in.next();
-
sop("请输入需要拷贝到那个位置的路径以及生成的文件名:");
-
String destination = in.next();
-
in.close();
-
CopyTextDemo(source,destination);
-
}
- /文件Copy****/
-
private static void CopyTextDemo(String source,String destination) {
-
try {
-
FileWriter fw = new FileWriter(destination);
-
FileReader fr = new FileReader(source);
-
char [] buf = new char[1024];
-
//将Denmo中的文件读取到buf数组中。
-
int num = 0;
-
while((num = fr.read(buf))!=-1) {
-
//String(char[] value , int offest,int count) 分配一个新的String,包含从offest开始的count个字符
-
fw.write(new String(buf,0,num));
-
}
-
fr.close();
-
fw.close();
-
}
-
catch (IOException e) {
-
sop(e.toString());
-
}
-
}
- /Println**/
-
private static void sop(Object obj) {
-
System.out.println(obj);
-
}
- }