Java IO 最好的总结

1、IO解决问题: 解决设备与设备之间 的数据传输问题。 比如: 硬盘--->内存 内存----->硬盘

2、流对象的分类:

字节流:

输入字节流:
---------| InputStream 所有输入字节流的基类。 抽象类,输入字节流的顶层类。
------------| FileInputStream 读取文件的输入字节流。
------------| BufferedInputStream 缓冲输入字节流。 该类内部其实就是维护了一个8kb字节数组而已。 该类出现的目的是为了提高读取文件数据的效率。

输出字节流:
---------| OutputStream 所有输出字节流的基类。 抽象类,输出字节流的顶层类。
------------| FileOutputStream 向文件输出数据 的输出字节流。
------------| BufferedOutputStream 缓冲输出字节流。 该类出现的目的是为了提高向文件写数据的效率。 该类内部其实也是维护了一个8kb的字节数组而已

什么情况使用字节流读取到数据不需要经过编码或者解码的情况下这时候使用字节流。比如:图片数据

字符流:

——————————————————

| 字符流 = 字节流 + 编码(解码)   |

------------------------------------

输入字符流
--------| Reader 所有输入字符流的基类。 抽象类。
-----------| FileReader 读取文件字符的输入字符流。
-----------| BufferedReader 缓冲输入字符流。 该类出现的目的是为了提高读取文件字符的效率并且拓展了功能(readLine()),它内部 其实就是维护了一个8192个长度的字符数组

输出字符流
-------| Writer 所有输出字符流的基类。 抽象类。
------------| FileWriter 向文件输出字符数据的输出字符流。
---------------| BufferedWriter 缓冲输出字符流。该类出现的目的是为了提高写文件字符的效率并且拓展了功能(newLine())。

什么情况下使用字符流:如果读写的都是字符数据,这时候我们就使用字符流


转换流:

输入字节流的转换流: InputSrteamReader

类的声明:public class InputStreamReaderextends Reader,继承了Reader,其对象是Reader类型,可以用Reader的方法操作对象。

构造方法如下,可以传入一个字节流对象,然后根据需要指定编码集,解决乱码问题:

 

InputStreamReader(InputStream in)
          创建一个使用默认字符集的 InputStreamReader。
InputStreamReader(InputStream in, Charset cs)
          创建使用给定字符集的 InputStreamReader。
InputStreamReader(InputStream in, CharsetDecoder dec)
          创建使用给定字符集解码器的 InputStreamReader。
InputStreamReader(InputStream in, String charsetName)
          创建使用指定字符集的 InputStreamReader。

输出字节流的转换流:  OutputStreamWriter

转换流的作用
1. 可以把对应的字节流转换成字符流使用。
2. 可以指定码表进行读写文件的数据。


FileReader, FileWriter这两个类默认是使用的是gbk编码 表。不能由你来指定码表读写文件数据。若需要指定编码,则需要转换流。

代码:


 1 import java.io.FileInputStream;
 2 import java.io.FileOutputStream;
 3 import java.io.FileReader;
 4 import java.io.FileWriter;
 5 import java.io.IOException;
 6 import java.io.InputStream;
 7 import java.io.InputStreamReader;
 8 import java.io.OutputStream;
 9 import java.io.OutputStreamWriter;
10 
11 public class IOTranferTest{
12     public static void main(String[] args)throws Exception{
13     writeFile();
14     readFile();
15     }
16     
17     public static void readFile()throws Exception{
18         FileReader fileReader = new FileReader("F:\\a.txt");  //默认使用的是gbk码表
19         int content = 0; 
20         while((content = fileReader.read())!=-1){
21             System.out.print((char)content);
22         }
23         
24         //关闭资源
25         fileReader.close();
26     }
27     
28         
29     
30     public static void writeFile() throws IOException{
31         //建立了文件与程序的数据 通道
32         FileOutputStream fileOutputStream = new FileOutputStream("F:\\a.txt");
33         //创建一个输出字节流的转换流并且指定码表进行写数据
34         OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream,"utf-8");
35         outputStreamWriter.write("大家好");  //中文在utf-8码表中占三个字节。
36         
37         //关闭资源
38         outputStreamWriter.close();
39         }
40 
41 }
以下代码 写入时是UTF-8 读取时是用默认的GBK编码 所以读取时出现乱码

 

posted @ 2016-01-01 21:18  心灵召唤  阅读(214)  评论(0)    收藏  举报