类型 | 字符流 | 字节流 |
---|---|---|
File(文件) | FileReader FileWriter | FileInputStream FileOutputStream |
Memory Array | CharArrayReader CharArrayWriter | ByteArrayInputStream ByteArrayOutputStream |
Memory String | StringReader StringWriter | -- |
Pipe(管道) | PipeReader PipeWriter | PipedInputStream PipedOutputStream |
FileWriter示例:
public static void main(String[] args) {
FileWriter fw = null;
try {
fw = new FileWriter("d:\\1.txt");//在D盘下寻找1.txt文件,如果没有则新建一个
for(int c=0;c<=50;c++){
fw.write(c);//将打印前50个字符
}
fw.close();//关闭连接
} catch (IOException e1) {
e1.printStackTrace();
System.out.println("文件写入错误");
System.exit(-1);
}
}
这时打印出来的是Unicode编码的前50个编码打印到1.txt中。
FileReader示例:
public class TestFileReader {
public static void main(String[] args) {
FileReader fr = null;
int c = 0;
try {
fr = new FileReader("d:\\FileReader.java");
int ln = 0;
while ((c = fr.read()) != -1) {
System.out.print((char)c);//强制转换成char型
}
fr.close();
} catch (FileNotFoundException e) {
System.out.println("找不到指定文件");
} catch (IOException e) {
System.out.println("文件读取错误");
}
}
这时的程序中的中文就能正常打印了。
总结:节点流是将文件中的信息直接不加以任何改变的读取或者输出出来, 字节流是将文件中的信息一个字节一个字节的读取或者是写入,这时要注意像中文等文字在编码中是占据了两个字节的位置,这时候字节流不能将文件中的一部分信息准确的读取或者写入,这时候就要采用字节流了。
处理类型 | 字符流 | 字节流 |
Buffering | BufferedReader BufferedWriter | Bufferedlnputstream Bufferedoutputstream |
Filtering | FilterReader FilterWriter | Fllterlnputstream FilterOutputstream |
Converting between bytesand character | InputStreamWriter OutputStreamWriter | |
Object Serialization | Objectlnputstream ObjectOutputstream | |
Data conversion | Datalnputstream DataOutputstream | |
Counting | LineNumberReader | LineNumberInputStream |
Peeking ahead | PusbackReader | PushbackInputStream |
Printing | PrintWriter | PrintStream |
处理流得一种-----缓冲流:
缓冲流要"套接"在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,同时增加了一些新的方法。
缓冲流BufferedInputStream示例:
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("d:\\World.java");//以字节的方式读取文件中的内容
BufferedInputStream bis = new BufferedInputStream(fis);//将fis放入缓冲区里
int c = 0;
System.out.println(bis.read());
System.out.println(bis.read());
bis.mark(100);//从第100个开始读
for(int i=0;i<=10 && (c=bis.read())!=-1;i++){
System.out.print((char)c+" ");//如果不加强制转换将打印数字
}
System.out.println();
bis.reset();回到第100的标记点上
for(int i=0;i<=10 && (c=bis.read())!=-1;i++){
System.out.print((char)c+" ");//如果不加强制转换将打印数字
}
bis.close();//关闭连接
} catch (IOException e) {e.printStackTrace();}
}
缓冲流BufferedWriter,BufferedReader示例:
public static void main(String[] args) {
try {
BufferedWriter bw = new BufferedWriter(new FileWriter("d:\\1.txt"));//new出的FileWriter时就准备往里面写数据了,但是感觉这样直接使用不是很方便,于是在外面加上一个处理流BufferedWriter。这个加上的处理流是带缓冲区的。
BufferedReader br = new BufferedReader(new FileReader("d:\\1.txt"));
String s = null;
for(int i=1;i<=100;i++){
s = String.valueOf(Math.random());//产生一个随机数,然后把这个随机数转换为字符串
bw.write(s);
bw.newLine();//往文件里加入一个换行符,意义是每写一个字符串之后就加入一个换行符
}
bw.flush();//将缓冲的文件全部放入文件里面去
while((s=br.readLine())!=null){//br.readLine()将一行中的内容当作字符串传递出来
System.out.println(s);
}
bw.close();
br.close();//关闭两个连接
} catch (IOException e) { e.printStackTrace();}
}