OutputStreamWriter、InputStreamReader类
终于总结到字符的输入输出流了,太漫长了.....
在字符输入输出流中,顶级父类是Reader和Writer,是按照字符进行读写的,这两个流都是高级流,在使用之后必须关闭,不然写入不进去文件中。
在这个类中涉及到字符集的选择上,字符集主要是GBK和UTF-8。
在GBK中,中文一个字占两个字节,在UTF-8中,一个字占三个字节,所以写入和读取采取的字符集应该相同,不然会导致读取乱码。(不指定字符集时系统使用默认的字符集,其中windows下是GBK,Linux中是UTF-8)。
写入文件的简单操作
public class TestWriter {
public static void main(String[] args) throws IOException {
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("C:\\keshe\\writer.txt"),"GBK");
osw.write(65);
osw.write("早上好");
osw.write("困了".toCharArray());
osw.close();
}
}
读出文件的简单操作
public class TestReader {
public static void main(String[] args) throws IOException {
InputStreamReader isr = new InputStreamReader(new FileInputStream("C:\\keshe\\writer.txt"),"GBK");
char[] chs = new char[1024];
/*
* 从文件中尝试读取chs.length个字符
* 返回值是实际读到的字符
*/
int len = isr.read(chs);
String str = new String(chs,0,len);
System.out.println(str);
isr.close();
}
}
PrintWriter和BufferedReader类
这两个类是缓冲字符输入输出流,BufferedWriter类也存在,但是由于性能没有PrintWriter好,支持的功能也没有人家多,所以在这里使用PrintWriter类。这两个类都是高级流。
在复制音频或者视频时,一般不采取这两个类,因为他们复制出的结果比原结果的字节数多,占用空间。
FileOutputStream("",true); //表示追加写
PrintWriter(FileOutputStream file,true); //表示自动刷新
写入的简单操作
public class TestPrintWriter {
public static void main(String[] args) throws IOException {
PrintWriter pw = new PrintWriter(new FileOutputStream("C:\\keshe\\printwriter.txt",true),true);
pw.println("fjdog");
pw.print("djfd");
pw.close();
}
}
其中println和print的区别是:println中调用了一个刷新缓冲区函数,如果在构造方法中选择的是true的话,则会自动刷新缓冲区,print没有这个功能。同时println也会自动换行。
读出的简单操作
public class TestBufferedReader {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("C:\\keshe\\printwriter.txt")));
System.out.println(br.readLine());
br.close();
}
}
每次都读一行。