操作流的步骤(重点) File类本身是与文件操作有关,但是如果要想操作内容则必须使用字节流或字符流完成,但是不管是使用何种的输入输出流,其基本的操作原理是一样的(以文件流为准): 一、使用File类找到一个文件对象,得到IO操作的源或目标 二、通过字节流或字符流的子类创建对象,(得到IO操作的通道) 三、进行读或写的操作,(IO操作) 四、关闭输入/输出,(打完收工,注意节约资源,关掉) 由于流的操作属于资源操作,所以在操作的最后一定要关闭以释放资源。 其实上面的流操作步骤可以联系生活中的例子:比如想把水井里的水弄到家里的大水缸去,怎么搞呢? 1.找到水井在哪里;2.找根管子一头接在水井里,一头接在家里的大水缸里;3.打开管子上的龙头,放水;4.水放满了,关掉水龙头. 计算机访问外部设备,要比直接访问内存慢得多,若我们每一次write方法调用都是直接写到外部设备(比如磁盘上的一个文件),CPU就要花费更多的时间去等待外部设备;我们可以开辟一个内存缓冲区,程序每一次的write方法都是写到这个内存缓冲区中,只有这个缓冲区装满了之后,系统才将这个缓冲区的内容一次集中写到外部设备. 我的总结: 好处:1.有效提高了CPU的使用率;2.write方法并没有马上真正写入到外部设备,我们还有机会回滚部分写入的数据; Eg:
- //构建输入流,读进来,输出到控制台!
-
- import java.io.FileInputStream;
- import java.io.InputStream;
-
- public class Demo4 {
- public static void main(String[] args) throws Exception {
- //第一步:创建源!
- String filename = "6.4";//这个文件是在工作空间里面,没有后缀名!
- //第二步:创建管道!
- InputStream ips = new FileInputStream(filename);
- //第三步:操作!
- byte []buff = new byte[1024];
- int len;//定义缓冲区
- while((len = ips.read(buff)) != -1){
- System.out.println(new String(buff,0,buff.length));//输出到控制台!此时的输出流就是打印流!
- System.out.println("==========================================");//打印下,看哪里在1024。1024的地方被隔开了
- }
- //第四步:关闭资源(字符流必须关闭资源,因为它中间有缓冲区!对于字节流可以不用关闭,但是还是建议写上,习惯!)
- ips.close();
- }
- }
复制代码
输出:就将文件6.4中的数据打印到了控制台! 字节流和字符流 二者仅仅是操作单位不一样。 InputStream和Reader是所有输入流的基类,他们都是抽象类,本身不能创建实例,但是他们是所有输入流的模板。 一般来说处理字符或字符串时使用字符流,处理字节或二进制对象时应使用字节流; 备注:字符流必须关闭资源,因为它中间有缓冲区!而字节流不需要!但是一般都会(最后)关闭资源! 字节流 字节流主要是操作byte(字节)的类型数据: 字节输出流:OutputStream 字节输入流:InputStream 字符流 Java中的字符是Unicode编码,是双字节的,1个字符 等于 2个字节; 使用字节来处理字符文本就不太方便了,此时可以考虑使用字符流; 字符流主要是操作char的类型数据: 字符输出流:Writer 字符输入流:Reader 字节流和字符流的区别 字节流和字符流在使用上的代码结构都是非常类似的,但是其内部本身也是有区别的,因为在进行字符流操作的时候会使用到缓冲区(内存中),而字节流操作的时候是不会使用到缓冲区的。 在输出的时候,OutputStream类即使最后没有关闭内容也可以输出。但是如果是Writer的话,则如果不关闭,最后一条内容是无法输出的,因为所有的内容都是保存在了缓冲区之中,每当调用了close()方法就意味着清空缓冲区了。那么可以证明字符流确实使用了缓冲区: 字节流:程序 → 文件 字符流:程序 → 缓冲区(内存中) → 文件 如果现在字符流即使不关闭也可以完成输出的话,则必须强制性清空缓冲区: 方法:public void flush() throws IOException 我的总结: 两者相比,肯定使用字节流更加的方便,而且在程序中像图片、MP3等都是采用字节的方式的保存,那么肯定字节流会比字符流使用的更广泛。 但是需要说明的是,但是如果要是想操作中文的话,字符流肯定是最好使的。(字节流的话可能会出现乱码(一个汉字分成了两份)!) Eg:
- //字符流读出来,这时候就不会出现乱码的情况,在进行文字操作的时候最好使用字符流!
-
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileReader;
- import java.io.IOException;
- import java.io.Reader;
-
- public class Demo6 {
- public static void main(String[] args) {
- File src = new File("6.4");
- read(src);
- }
- public static void read(File src){
- Reader r = null;
- try {
- r = new FileReader(src);
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- }
- char []c = new char[1024];
- int len;
- try {
- while((len = r.read(c)) != -1){
- System.out.println(new String(c,0,c.length));//打印到控制台
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- try {
- r.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
复制代码
|