IO流

流的概念

流是一个抽象、动态的概念,是一连串连续动态的数据集合。

对于输入流而言,数据源就像水箱,流(stream)就像水管中流动着的水流,程序就是我们最终的用户。我们通过流(A Stream)将数据源(Source)中的数据(information)输送到程序(Program)中。

对于输出流而言,目标数据源就是目的地(dest),我们通过流(A Stream)将程序(Program)中的数据(information)输送到目的数据源(dest)中。

 

 图10-2 流与源数据源和目标数据源之间的关系

菜鸟雷区

输入/输出流的划分是相对程序而言的,并不是相对数据源。

理解:

输入流 = 读

输出流 = 写

2.2字节流和字符流怎么选择?(字符流只可以处理文本,处理其他类型有问题)

如果是文本文件通常使用字符流,而像视频,图片,音频等文件都是二进制数据使用字节流。当然文本文件也可以使用字节流来操作,字节流更通用。

注:如果只是复制纯文本文件不做显示操作,哪个流都可以,如果要显示纯文本就用字符流。

实验1:

下面是使用字节流复制文件,中文都是没问题的。所以文件复制字节流是万能的。

 

解读:FileInputStream.read()方法当没有参数时,返回的temp是字符 对应的ascii码值,可强转至char。

当有参数时,返回的是字节数,传入的数组是返回的数据。

//字节流复制所有文件都是没问题的(包括文本文件、中文)
   @Test
   public void ttuui(){
       int temp = 0;
       try (FileInputStream fi = new FileInputStream("d:/a.txt");
       FileOutputStream fo = new FileOutputStream("d:/g.txt")
      )
      {
           while ((temp=fi.read())!=-1){
               fo.write(temp);
          }
      }catch (Exception e){
           e.printStackTrace();
      }
  }

实验2:


 //字节流读取中文文本显示乱码
   @Test
   public void ttuui3(){
       int temp = 0;
       try (FileInputStream fi = new FileInputStream("d:/a.txt");
      )
      {
           System.out.println("=====================");
           while ((temp=fi.read())!=-1){
               System.out.println((char)temp);
          }
      }catch (Exception e){
           e.printStackTrace();
      }
  }

 

 

 

实验3:


//字符流读取中文正常
   @Test
   public void ttuui2(){
       int temp = 0;
       try (FileReader fr = new FileReader("d:/a.txt")
      )
      {
           System.out.println("=====================");
           while ((temp=fr.read())!=-1){
               System.out.println((char)temp);
          }
      }catch (Exception e){
           e.printStackTrace();
      }
  }

 

 

 

3.1缓冲字节流

 //缓冲字节流复制 
   @Test
   public void tts14() {
       Long start = System.currentTimeMillis();
       int temp = 0;
       try(FileInputStream fin = new FileInputStream("d:/霸主[BD中英双字].mp4");
           FileOutputStream fos = new FileOutputStream("d:/霸主[BD中英双字]2.mp4");
           BufferedInputStream bufferedInputStream = new BufferedInputStream(fin);
           BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fos);
      ){
           while ((temp = bufferedInputStream.read())!=-1){
               bufferedOutputStream.write(temp);
          }
      }catch (Exception e){
           e.printStackTrace();
      }
       Long tt = System.currentTimeMillis() - start;
       System.out.println("总耗时:"+tt);

  }

3.2缓冲字符流


//缓冲字符流
   @Test
   public void tte(){
       String stt = null;
       try(
               FileReader fileReader = new FileReader("d:/a.txt");
               FileWriter fileWriter = new FileWriter("d:/b.txt");
               BufferedReader bufferedReader = new BufferedReader(fileReader);
               BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
              )
      {
           while ((stt = bufferedReader.readLine())!=null){
               bufferedWriter.write(stt);
               bufferedWriter.newLine();
          }
      }catch (Exception e){
           e.printStackTrace();
      }
  }

3.3缓存数组


//字节流复制文件加数组提高效率
   @Test
   public void tts2() {
       Long start = System.currentTimeMillis();
       byte[] buffer = new byte[1024];
       try(FileInputStream fin = new FileInputStream("d:/霸主[BD中英双字].mp4");
           FileOutputStream fos = new FileOutputStream("d:/霸主[BD中英双字]3.mp4");){
           int temp = 0;
           while ((temp = fin.read(buffer))!=-1){
               //temp是读取的字节数,buffer是读取的字节值
               fos.write(buffer,0,temp);
          }
      }catch (Exception e){
           e.printStackTrace();
      }
       Long tt = System.currentTimeMillis() - start;
       System.out.println("总耗时:"+tt);
  }

//字符流读取文件加数组提高效率
   @Test
   public void tts3() {
       try(FileReader fileReader = new FileReader("d:/a.txt");
       FileWriter fileWriter = new FileWriter("d:/c.txt"))
      {
           char[] str = new char[1024];
           int temp = 0;
           while ((temp = fileReader.read(str))!=-1){
               fileWriter.write(str,0,temp);
          }
      }catch (Exception e){
           e.printStackTrace();
      }
  }

 

posted @ 2022-05-05 10:32  花田007  阅读(40)  评论(0编辑  收藏  举报