IO(四)IO流之字符流与字符缓冲流(转)
java中字符流主要都是继承于Reader和Writer两个抽象类。用于对字符文本的读写操作
一、转换类流 复制代码 1 package com.iotest; 2 3 import java.io.FileInputStream; 4 import java.io.FileNotFoundException; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.InputStreamReader; 8 import java.io.OutputStreamWriter; 9 10 public class ConverseStreamDemo { 11 12 public static void main(String[] args) { 13 String s = "F:\\shar\\test\\test3.txt"; 14 try { 15 //将字节流转为字符流 16 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(s)); 17 osw.write("中国北京"); 18 System.out.println(osw.getEncoding()); 19 osw.close(); 20 osw = new OutputStreamWriter(new FileOutputStream(s,true),"GB2312"); 21 osw.write("中国北京"); 22 System.out.println(osw.getEncoding()); 23 osw.close(); 24 } catch (FileNotFoundException e) { 25 // TODO Auto-generated catch block 26 e.printStackTrace(); 27 } catch (IOException e) { 28 // TODO Auto-generated catch block 29 e.printStackTrace(); 30 } 31 try { 32 //将字节流转为字符流 33 InputStreamReader isr = new InputStreamReader(new FileInputStream(s),"GB2312"); 34 int c; 35 while((c=isr.read()) != -1){ 36 System.out.print((char)c); 37 } 38 System.out.println(); 39 isr.close(); 40 } catch (FileNotFoundException e) { 41 // TODO Auto-generated catch block 42 e.printStackTrace(); 43 } catch (IOException e) { 44 // TODO Auto-generated catch block 45 e.printStackTrace(); 46 } 47 } 48 49 } 复制代码 二、FileReader和FileWriter 复制代码 1 package com.iotest; 2 3 import java.io.FileNotFoundException; 4 import java.io.FileReader; 5 import java.io.FileWriter; 6 import java.io.IOException; 7 /* 8 * 使用flush()将流数据刷到目标里,这时流还存活着,还可以继续使用该流进行别的操作。 9 * close()虽然也有flush()的效果但是这时流已经死了,你如果想继续使用流的话就必须在此建立流 10 */ 11 public class MutiplicationTable { 12 13 public static void main(String[] args) throws IOException { 14 String s = "F:\\shar\\test\\test5.txt"; 15 FileWriter fw = new FileWriter(s); 16 FileReader fr = new FileReader(s); 17 for (int i = 1; i <= 9; i++) { 18 for (int j = 1; j <= i; j++) { 19 String str = i + "*" + j + "=" + i*j + " "; 20 fw.write(str); 21 } 22 fw.write("\r\n"); 23 /*flush是指强行将输出流中的数据写到文件里面去。如果写到这里的话就是一行一行的写入文件 24 *最好每写完一部分就刷新一次,如果最后刷新的话可能会造成数据的丢失 25 */ 26 fw.flush(); 27 } 28 //如果又不写flush()又不写close(),则不会写入任何内容到文本里。只是写到了缓冲区 29 //fw.flush(); 写到这里的话就是所有的内容一起写进文件 30 //fw.close(); close之前会调用flush() 31 //读字符输入流的数据 32 int c; 33 while ((c=fr.read())!=-1) { 34 System.out.print((char)c); 35 } 36 } 37 38 } 复制代码 三、BufferedReader和BufferedWriter 复制代码 1 package com.iotest; 2 3 import java.io.BufferedOutputStream; 4 import java.io.BufferedWriter; 5 import java.io.FileOutputStream; 6 import java.io.FileWriter; 7 import java.io.IOException; 8 9 public class PrimeNumber { 10 BufferedWriter bw = null; 11 String fileName = "F:\\shar\\test\\test7.txt"; 12 //判断是否是质数 13 public boolean isPrime(int n){ 14 for(int i=2;i<=n/2;i++){ 15 if(n%i == 0){ 16 return false; 17 } 18 } 19 return true; 20 } 21 void printPrime(int m) throws IOException{ 22 //将字节流转缓冲流 23 bw = new BufferedWriter(new FileWriter(fileName)); 24 int j = 0; 25 for (int i = 2; i < m; i++) { 26 if(isPrime(i)){ 27 j++; 28 String s = String.valueOf(i); 29 String s1 = s + " "; 30 bw.write(s1); //写入文本文件 31 if(j==10){ 32 j = 0; 33 bw.newLine(); //写入一个行分隔符 34 bw.flush(); //强制刷新 35 } 36 } 37 } 38 39 bw.close(); 40 } 41 public static void main(String[] args) throws IOException { 42 PrimeNumber pn = new PrimeNumber(); 43 pn.printPrime(100); 44 } 45 46 } 复制代码 四、PrintWriter 复制代码 1 package com.iotest; 2 3 import java.io.FileWriter; 4 import java.io.IOException; 5 import java.io.PrintWriter; 6 7 public class PrintWriterDemo { 8 9 public static void main(String[] args) throws IOException { 10 int A = 0; //千位 11 int B = 0; //百位 12 int C = 0; //十位 13 int num = 0; 14 String fileName = "F:\\shar\\test\\test8.txt"; 15 FileWriter fw = new FileWriter(fileName); //字符输出流 16 PrintWriter pw = new PrintWriter(fw); //将字节输出流转为PrintWriter 17 for (int i = 1000; i < 10000; i++) { 18 A = i/1000; 19 B = i/100 % 10; 20 C = i/10 % 10; 21 if(i%11==0 && A == B+C){ 22 pw.print(i+" "); 23 if(++num % 7 == 0){ 24 pw.println(); //写入回车换行 25 pw.flush(); //强制刷新流 26 } 27 } 28 } 29 fw.close(); 30 31 } 32 33 } 复制代码 五、标准IO 复制代码 1 package com.iotest; 2 3 import java.io.BufferedReader; 4 import java.io.FileWriter; 5 import java.io.IOException; 6 import java.io.InputStreamReader; 7 import java.io.PrintWriter; 8 import java.util.Scanner; 9 10 public class PackStardIO { 11 12 public static void main(String[] args) throws IOException { 13 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 14 PrintWriter o = new PrintWriter(System.out); //包装标准输出 15 String s; 16 while((s=br.readLine())!=null && s.length()!=0){ 17 o.println(s.toUpperCase()); 18 //o.flush(); //一定要强制刷新让其输出来,否则不会输出 19 } 20 } 21 22 } 复制代码 复制代码 1 package com.iotest; 2 3 import java.io.BufferedInputStream; 4 import java.io.BufferedOutputStream; 5 import java.io.BufferedReader; 6 import java.io.FileInputStream; 7 import java.io.FileNotFoundException; 8 import java.io.FileOutputStream; 9 import java.io.IOException; 10 import java.io.InputStreamReader; 11 import java.io.PrintStream; 12 13 public class StandardIORedirect { 14 15 public static void main(String[] args) throws IOException { 16 PrintStream console = System.out; 17 BufferedInputStream in = new BufferedInputStream(new FileInputStream("C:\\Documents and Settings\\01\\桌面\\Test\\src\\com\\iotest\\StandardIORedirect.java")); 18 PrintStream out = new PrintStream(new BufferedOutputStream(new FileOutputStream("F:\\shar\\test\\test9.txt"))); 19 System.setIn(in); //对标准输入流重定向 20 System.setOut(out); 21 System.setErr(out); 22 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 23 String s; 24 while((s=br.readLine())!=null){ //从BufferedReader中读取一行数据 25 System.out.println(s); 26 } 27 out.close(); 28 System.setOut(console); 29 } 30 31 } 复制代码 六、随即访问文件类 复制代码 1 package com.iotest; 2 3 import java.io.FileNotFoundException; 4 import java.io.IOException; 5 import java.io.RandomAccessFile; 6 7 public class RandomRW { 8 public static void main(String[] args) throws IOException { 9 RandomAccessFile raf = new RandomAccessFile("F:\\shar\\test\\test10.dat","rw"); 10 final int DOUBLE_SIZE = 8; 11 for (int i = 0; i < 10; i++) { 12 raf.writeDouble(i); 13 System.out.print(" " + (double)i); 14 } 15 System.out.println(); 16 raf.close(); 17 RandomAccessFile raf1 = new RandomAccessFile("F:\\shar\\test\\test10.dat","rw"); 18 raf1.seek(3*DOUBLE_SIZE); //找到某个位置 19 raf1.writeDouble(300); //往该位置插入数据 20 raf1.seek(5*DOUBLE_SIZE); 21 raf1.writeDouble(500); 22 raf1.close(); 23 RandomAccessFile raf2 = new RandomAccessFile("F:\\shar\\test\\test10.dat","r"); 24 for (int i = 0; i < 10; i++) { 25 System.out.print(" "+raf2.readDouble()); 26 } 27 raf2.close(); 28 } 29 30 } 复制代码