Java 学习笔记- I/O - Character Stream
所有Character Stream的类都继承类Reader 或 Writer。
对于Character Stream的类来说,其行为上类似于对Byte Stream的封装,在真正进行物理I/O操作是也是通过Byte Stream 与Character Stream之间的互相转换来实现的。
常用的Character Stream 类有 :
FileReader,FileWriter常用的构造方法 FileReader(String fileName),FileWriter(String fileName), 或者FileReader(File file),FileWriter(File file). 常用方法为 read() 和write(int c)
FileReader,FileWriter分别继承类InputStreamReader 和OutputStreamWriter 而这两个父类的构造方法的参数分别为字节流类型的InputStream 和OutputStream,所以也可以说Character Stream 是对Byte Stream的封装。
代码示例:
package io.characterstream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
* IO Stream:
*
* 2.Character Stream. All Character Stream classes are descended from Reader and Writer. Java Platform stores character
* values using Unicode convention。 Character Stream I/O automatically translates this internal format to and from the
* local character set.
*
* @author PENGGR
*
*/
public class CopyCharacters {
public static void main(String[] args) {
FileReader inputStream = null;
FileWriter outputStream = null;
try {
inputStream = new FileReader("D:\\360云盘\\javase\\src\\io\\xanadu.txt");
outputStream = new FileWriter("D:\\360云盘\\javase\\src\\io\\characterStreamOut.txt");
int c;
while ((c = inputStream.read()) != -1) {
outputStream.write(c);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
此外,类BufferedReader,BufferedWriter是常用的Character Stream的Buffer,其构造方法为BufferedReader(Reader in ),BufferedWriter(Writer out) 常用方法为 readLine() write(String l).
代码示例:
package io.characterstream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class CopyLines {
public static void main(String[] args) {
BufferedReader inputStream = null;
// PrintWriter outputStream = null;
BufferedWriter bout = null;
try {
inputStream = new BufferedReader(new FileReader("D:\\360云盘\\javase\\src\\io\\xanadu.txt"));
bout = new BufferedWriter(new FileWriter("D:\\360云盘\\javase\\src\\io\\characterLineOut.txt"));
// outputStream = new PrintWriter(new FileWriter("D:\\360云盘\\javase\\src\\io\\characterLineOut.txt"));
String l;
while ((l = inputStream.readLine()) != null) {
// outputStream.write(l);
// outputStream.println(l);
System.out.println(l);
bout.write(l + "\n");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
// if (outputStream != null) {
// outputStream.close();
// }
if (bout != null) {
bout.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
此外,如果这段代码finally 里面的bout 对象没有被close,那么写入的文件中是看不到任何内容的,除非调用了flush方法把 字符流从内存写入到文件中。 此处想说的是character stream是在输出流关闭的时候或者缓存了足够大的容量的时候才把内容写到文件上,但是Byte stream 是实时写入文件的,所以,character stream的真正IO操作相对少一些,效率高一些。