当前位置 博文首页 > 白徽的博客:谈话之间 java I/O 字节流 灰飞烟灭

    白徽的博客:谈话之间 java I/O 字节流 灰飞烟灭

    作者:[db:作者] 时间:2021-07-30 20:57

    二狗与我的学习日常

    在学习 java I/O 流的时候二狗问我。
    老大,我们是不是应该先熟悉一下 I/O流 的相关类呀?否则这直接就去接触,互相认不出怎么搞?

    哟呼,二狗不错呀!很有见解。对,学习就像把妹一样,你一不知道人家性格,爱好是什么样的,直接冲过去说句我爱你。对方会喜欢你的概率就像彗星撞地球一般啊。
    给,你先看一下,I/O流的机构图吧–I/O类结构图

    二狗看了半天后说道:老大,这看了一下,我就只知道了 I/O流 分为了 字节流 和 字符流 别的没看明白。

    这样就不错了,我先考考你。电脑文件里面的东西是什么形式的呀?

    这我就很清楚了!字节的形式!嘿嘿

    不错,那我再问你。那么电脑显示在屏幕上的是什么形式?

    这。。应该不是字节形式。可能是字符型。
    二狗有些不确定的到。

    嗯,不错。是的电脑里面的文件使用的字节形式。而显示的时候却需要转化成字符型!毕竟电脑里面存的东西是二进制的。你总不能直接把二进制给别人看吧。

    嗯嗯,对对。必须得转化。否则我直接给我女盆友看,她不得怪我弄坏了电脑。

    你说什么?我没怎么听清二狗咕哝了什么。

    没什么,老大,我们知道了需要转化。也知道电脑 I/O流 分为 字节 和 字符流 那这又有什么用呢?

    这用处就是敲门砖啊!你看既然文件时字节形的,那么我们打开的时候也应该是字节形式的打开。就好像你女。。。咳咳,就好像你的保险箱,只有你自己能打开。别人就不行一样。打开的方法要符合它的形式。否则就没法打开又或者直接把里面的文件给毁了。

    哦哦,这样我就懂了。那到底应该怎么打开呢?

    咋在打开之前是不是应该需要有个变量。类型是不是应该是 字节输入输出流 也就是 InputStream 和 OutputStream 类型。那么如何打开就是个问题了。

    嗯,咋们应该用字节的方式打开。嗯?这里不有个 FileInputStream 和 FileOutputStream 子类吗?是不是使用他们打开?

    嗯,对。二狗,最近进步很大呀

    那是。二狗得意一笑。

    那么我们已经搞清楚了这些。现在去接触肯定能把到妹。。。呸,是能打出代码。

    直接放代码:
    边打边学
    可能引起你的恐惧的代码那里已经标记好。最下面已经给你解释好了那段标记的代码。恐惧了就看一下解释。激励一下自己。

    
    //做法一:使用InputStream接口的 int read()方法,一次读一个字节        
    //package cn.edu.dlnu;
    import java.io.*; 
    public class IOStreamTest { 
         public static void main(String[] args) throws IOException { 
         			//第一个害怕点
              	   InputStream input=null;
                   OutputStream  output=null;  
                   input= new FileInputStream("计科136.jpg");
                   output =  new FileOutputStream("dest.jpg");   
                
                    int i=0;
                    while(true){ 
              	             int b=input.read();  
            	             if (b==-1) break;
            	             i++;
                             output.write(b); 
                     }  
                     System.out.println("处理完毕!"+"  共读写了"+i+"个字节"); 
                     input.close();
                     output.close(); 
                  
           }  
    } 
    
    
    /**
    //做法一的改进版本,规范格式    
    package cn.edu.dlnu; 
    import java.io.*; 
    public class IOStreamTest { 
         public static void main(String[] args) throws IOException {  
              InputStream input= new FileInputStream("src.txt");
              OutputStream  output =  new FileOutputStream("dest.txt"); 
              int b=-1;  
              while((b=input.read())!=-1){ 
                  output.write(b); 
              }
              input.close();
              output.close(); 
         }  
    }
    */
    
    /**
    //做法二:使用InputStream接口的 int read(byte[])方法,一次读若干字节    
    package cn.edu.dlnu; 
    import java.io.*; 
    public class IOStreamTest { 
         public static void main(String[] args) throws IOException {  
              InputStream input= new FileInputStream("src.txt");
              OutputStream  output =  new FileOutputStream("dest.txt");  
              //恐惧点2
    		  byte[] b=new byte[7];
              while(true){
              	  int length=input.read(b); 
            	  if (length==-1) break;
                  output.write(b,0,length);   // 为啥写length?     
              }
              input.close();
              output.close(); 
         }  
    }
    */ 
    
    /**
    //做法二的改进版本,规范格式         
    package cn.edu.dlnu; 
    import java.io.*; 
    public class IOStreamTest { 
         public static void main(String[] args) throws IOException {  
           InputStream input= new FileInputStream("src.txt"); 
          OutputStream  output =  new FileOutputStream("dest.txt");   
       
    		  byte[] b=new byte[7];
    		  int length=-1; 
              while((length=input.read(b))!=-1 ){  
                  output.write(b,0,length);   // 为啥写length?      
              }  
              input.close();
              output.close();  
         }  
    } 
    
    
     /**
    //读写文件更多的细节,对此有兴趣的学生,可关注 哈~~    
    package cn.edu.dlnu; 
    import java.io.*; 
    public class IOStreamTest { 
         public static void main(String[] args) throws IOException {  
              InputStream input= new FileInputStream("src.txt");
              OutputStream  output =  new FileOutputStream("dest.txt");   
    		  byte[] b=new byte[7];
    		  int length=-1;
    		  int count=0;  //统计字节总数
              while((length=input.read(b))!=-1 ){  
                  output.write(b,0,length);   // 为啥写length?      
                  //按src.txt文本编码格式,以字节形式输出文本     
    		       for(int i=count; i<length+count;i++) {
    		        	System.out.printf("b[%d]=%x ",i,(byte)b[i-count]);
    		       } 
                   System.out.print("\n");	
    			   count +=length;
              } 
              System.out.printf(" The length of file: %dbyte\n", count);	  
              input.close();
              output.close();  
         }  
    } 
     */
     
    

    恐惧1

    这一段

    			   InputStream input=null;
                   OutputStream  output=null;  
                   input= new FileInputStream("计科136.jpg");
                   output =  new FileOutputStream("dest.jpg");   
    

    不要怕。第一和第二行是声明一个变量,类型名字叫InputStream 和 OutputStream。然后给他赋值为空。第三行和第四行是给他new一个对象。因为是初学者,你可以认为这只不过是个开了文件而已,毕竟最后都不是关了吗!参数只不过是用来打开文件的钥匙。
    如果出现这种

    Exception in thread "main" java.io.FileNotFoundException: 计科136.jpg (系统找不到指定的文件。)
    	at java.io.FileInputStream.open0(Native Method)
    	at java.io.FileInputStream.open(Unknown Source)
    	at java.io.FileInputStream.<init>(Unknown Source)
    	at java.io.FileInputStream.<init>(Unknown Source)
    	at one.Test1.main(Test1.java:9)
    

    是因为你没有写相对地址。什么叫相对地址?就是全部的地址。举个例子:你住在内蒙古赤峰市XX区XX单元XX号。
    上代码,酱紫:

    input = new FileInputStream("D:\\JAVA\\Java\\IOStream\\src\\one\\计科136.jpg");
    output = new FileOutputStream("D:\\JAVA\\Java\\IOStream\\src\\one\\dest.jpg");
    

    恐惧2

    为什么会有这个:

    byte[] b=new byte[7];
    while(true) {
    			int lenght = input.read(b);
    			if(lenght == -1)break;
    			output.write(b,0,lenght);
    		}
    

    数组的长度必须是7吗?
    不是的,举个例子:我们以前搬砖一个一个的搬。感觉好麻烦。那么我们创造一个推车(数组)吧。里面放砖头(数据),那么这个推车(数组)一定要是只能放7个砖头(数据)吗?
    一定不是的。你想要放多少,你自己定。只不过你需要知道这里面有几个砖头(数据),所以有了这段代码:

    int lenght = input.read(b);
    

    为什么要知道有多少呢?因为取砖头(数据)时候需要知道,所以在下面使用了这个有多少砖头(数据)的数量:

    output.write(b,0,lenght);
    
    cs