• IO


    IO数据操作的两大体系

    1.字符流操作:适合纯文本数据操作

      源:Reader

      目的:Writer

    2.字节流操作:适合所有,常文本以外

      源:InputStream

      目的:OutputStream

    转换流:字符流是从字节流中分出来针对文本文件处理的,如果没有字符流,就不需要转换,可见,转换流应该属于字符流体系

      源:InputStreamReader

      目的:OutputStreamWriter

    应用

     1.文本文件复制

      思路:

        源:InputStream Reader

        文本?是!=>Reader

        设备:硬盘,文件,=>FileReader

        需要缓冲吗?需要!=>BufferedReader

        目的:OutputStream Writer

        文本?是!=>Writer

        设备:硬盘,文件,=>FileWriter

        需要缓冲吗?需要!=>BufferedWriter

      Demo:不带缓冲与带缓冲  

     1 package io;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.BufferedWriter;
     5 import java.io.FileReader;
     6 import java.io.FileWriter;
     7 import java.io.IOException;
     8 
     9 /**
    10  * 将E:\Test\1.txt复制到E:Test1.txt
    11  * 
    12  */
    13 public class CopyTxt {
    14 
    15     public static void main(String[] args) throws IOException {
    16         noBufferedCopy();//不带缓冲
    17 //        bufferedCopy();//带缓冲
    18     }
    19     public static void  noBufferedCopy()throws IOException{
    20         FileReader fr = new FileReader("E:\Test\1.txt");
    21         FileWriter fw = new FileWriter("E:\Test1.txt");
    22         char[] buf = new char[1024];
    23         int num = 0;
    24         while ((num = fr.read(buf)) != -1) {
    25             // 两种方式都可以
    26             // fw.write(new String(buf,0,num));
    27             fw.write(buf, 0, num);
    28         }
    29         fr.close();
    30         fw.close();
    31         
    32     }
    33     public static void  bufferedCopy()throws IOException{
    34 //        缓冲包装
    35         BufferedReader bufr=new BufferedReader(new FileReader("E:\Test\1.txt"));
    36         BufferedWriter bufw=new BufferedWriter(new FileWriter("E:\Test1.txt"));
    37 //        包装之后可以一行一行的读文本,且有缓冲效果,内部用数组封装,有效减少磁头的不停切换从而有保护存储介质的作用
    38         String line=null;
    39         while((line=bufr.readLine())!=null){
    40             bufw.write(line);
    41         }
    42         bufr.close();
    43         bufw.close();
    44     }
    45 
    46 }
    文本文件复制

      

    扩展:BufferedReader和BufferedWriter体现了一个java的设计模式=======装饰设计模式

      原理:

      设计模板:

     2.文本复制指定编码

      思路:  

       源:文本Reader=>FileReader × 不能指定编码=>父类InputStreamReader缓冲?BufferedReader
      目的:文本Writer=>FileWriter × 不能指定编码=>父类OutputStreamWriter缓冲?BufferedWriter

    1     /**     *默认、指定GBK、指定UTF-8      */    public static void charSetCopy() throws IOException {        // 源:文本Reader=>FileReader × 不能指定编码=>父类InputStreamReader        // 目的:文本Writer=>FileWriter × 不能指定编码=>父类OutputStreamWriter        InputStreamReader isr = new InputStreamReader(new FileInputStream(                "E:\Test\1.txt"), "GBK");        OutputStreamWriter osw1 = new OutputStreamWriter(new FileOutputStream(                "E:\11.txt"));        OutputStreamWriter osw2 = new OutputStreamWriter(new FileOutputStream(                "E:\12.txt"), "GBK");        OutputStreamWriter osw3 = new OutputStreamWriter(new FileOutputStream(                "E:\13.txt"), "UTF-8");        BufferedReader bufr = new BufferedReader(isr);        BufferedWriter bufw1 = new BufferedWriter(osw1);        BufferedWriter bufw2 = new BufferedWriter(osw2);        BufferedWriter bufw3 = new BufferedWriter(osw3);        String line = null;        while ((line = bufr.readLine()) != null) {////写            bufw1.write(line);            bufw1.newLine();            bufw1.flush();            bufw2.write(line);            bufw2.newLine();            bufw2.flush();            bufw3.write(line);            bufw3.newLine();            bufw3.flush();        }        bufr.close();        bufw1.close();        bufw2.close();        bufw3.close();    }
    指定编码

     3.图片及视频复制

      思路:

      源:InputStream,Reader?=>InputStream=>FileInputStream?BufferedInputStream

      目的:OutputStream,Writer?=>OutputStream=>FileOutputStream?BufferedOutputStream

      Demo:

     1 package io;
     2 
     3 import java.io.BufferedInputStream;
     4 import java.io.BufferedOutputStream;
     5 import java.io.FileInputStream;
     6 import java.io.FileOutputStream;
     7 import java.io.IOException;
     8 
     9 /**
    10  * 将E盘1.avi复制到E盘2.avi
    11  * 
    12  */
    13 public class CopyMedia {
    14 
    15     public static void main(String[] args) throws IOException {
    16         long start = System.currentTimeMillis();
    17         // copy();
    18         noBufferedCopy();
    19         long end = System.currentTimeMillis();
    20         System.out.println("time:" + (end - start) + "ms");
    21     }
    22 
    23     public static void copy() throws IOException {
    24         // 源:InputStream=>FileInputStream=>BUfferedInputStream
    25         BufferedInputStream bufin = new BufferedInputStream(
    26                 new FileInputStream("E:\1.avi"));
    27         // 目的:OutputStream=>FileOutputStream=>BufferedOutputStream
    28         BufferedOutputStream bufout = new BufferedOutputStream(
    29                 new FileOutputStream("E:\2.avi"));
    30 
    31         byte[] buf = new byte[8192];
    32         int len = 0;
    33 
    34         // 读写
    35         while ((len = bufin.read(buf)) != -1) {
    36             bufout.write(buf, 0, len);
    37         }
    38 
    39         bufin.close();
    40         bufout.close();
    41 
    42     }
    43 
    44     public static void noBufferedCopy() throws IOException {
    45         FileInputStream fis = new FileInputStream("E:\1.avi");
    46         FileOutputStream fos = new FileOutputStream("E:\2.avi");
    47 
    48         byte[] buf = new byte[8192];
    49         int len;
    50 
    51         while ((len = fis.read(buf)) != -1) {
    52             fos.write(buf, 0, len);
    53         }
    54 
    55         fis.close();
    56         fos.close();
    57     }
    58 
    59 }
    视频复制

     4.键盘与控制台操作

      以字节流的形式直接读键盘录入的数据到控制台

        源:InputStream Reader?System.in是字节=>InputStream

        目的:System.out=>OutputStream

      以字符流形式将键盘录入的数据输出到控制台:

        源:System.in=>InputStream(字节)?文本=>InputStreamReader?包装=>BufferedReader

        目的:System.out=>OutputStream(字节)?文本=>OutputStreamWriter?包装=>BufferedWriter

      将硬盘文本文件读到控制台

        源:Reader=>FileReader=>BufferedReader

        目的:System.Out=>OutputStream文本=>OutputStreamWriter=>BufferedWriter

      将录入的数据以指定的编码存入到文件
        源:System.in=>InputStream?文本=>InputStreamReader=>BufferedReader
        目的:Writer=>FileWriter?编码=>OutputStreamWriter=>BufferedWriter

      1 package io;
      2 
      3 import java.io.*;
      4 import java.util.*;
      5 import java.text.*;
      6 
      7 class KeyBoard
      8 {
      9     public static void main(String[] args)throws Exception 
     10     {
     11 //        readIn();//将键盘录入的数据输出到控制台
     12 //        readIn_2();//将硬盘文件读到控制台
     13 //        readIn_3();//以字节流的形式直接读键盘录入的数据到控制台
     14 //        readIn_4();//将录入的数据以指定的编码存入到文件
     15 
     16         /*********************************************
     17         特别说明:默认System.in对应源键盘,System.out对应控制台
     18         通过System类的System.setIn(InputStream in)可以改变源,
     19                             如System.setIn(new FileInputStream("1.txt"));
     20         通过System.setOut(PrintStream out)可以改变目的,
     21                             如System.setOut(new PrintStream("2.txt"));
     22 
     23         所以:将需求1改为将键盘录入的数据保存到2.txt,只需要添加一句话 
     24                             System.setOut(new PrintStream("2.txt"));
     25         *********************************************/
     26 
     27     }
     28 /*    需求1:将键盘录入的数据输出到控制台
     29 
     30     源:InputStream Reader
     31     文本?是!Reader
     32     设备:键盘,System.in字节流
     33     =>字节流转换成字符流InputStreamReader
     34     InputStreamReader isr=new InputStreamReader(System.in);
     35     需要缓冲吗?需要
     36     BufferedReader bufr=new BufferedReader(isr);
     37 
     38     目的:OutputStream Writer
     39     文本?是的=>FileWriter
     40     设备:控制台,System.out,字节流
     41     =>需要将字节流转换成字符流=>OutputStreamWriter
     42     OutputStreamWriter osw=new OutputStreamWriter(System.out);
     43     需要缓冲吗?需要
     44     BufferedWriter bufw=new BufferedWriter(osw);
     45 
     46 
     47 
     48 */
     49     public static void readIn()throws IOException{
     50 //        源:
     51         BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
     52 
     53 //        目的
     54         BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.out));
     55 
     56         String line=null;
     57         while((line=bufr.readLine())!=null){
     58             if("over".equals(line))
     59                 break;
     60             bufw.write(line);
     61             bufw.newLine();
     62             bufw.flush();
     63         }
     64         bufr.close();
     65         bufw.close();
     66     }
     67 /*
     68 需求2:将文本读入控制台
     69     源:Reader
     70     设备:硬盘,文件,FileReader
     71     缓冲:BufferedReader bufr=new BufferedReader(new FileReader("KeyBoard.java"));
     72 
     73     目的:Writer
     74     设备:控制台,System.out,字节流,需要转换
     75     OutputStreamWriter osw=new OutputStreamWriter(System.out);
     76 
     77 
     78 */
     79 
     80     public static void readIn_2()throws IOException{
     81 //        源:
     82         BufferedReader bufr=new BufferedReader(new FileReader("KeyBoard.java"));
     83 //        目的:
     84         BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.out));
     85 
     86         String line=null;
     87         while((line=bufr.readLine())!=null){
     88             bufw.write(line);
     89             bufw.newLine();
     90             bufw.flush();
     91         }
     92         bufr.close();
     93         bufw.close();
     94     }
     95 /*
     96 需求3:直接以字节流的形式,输出键盘录入的内容
     97 
     98     源:InputStream
     99     设备:键盘,System.in
    100 
    101     目的:OutputStream
    102     设备:控制塔,System.out
    103 */
    104     public static void readIn_3()throws IOException{
    105         InputStream in=System.in;
    106         OutputStream out=System.out;
    107         int len=0;
    108         while((len=in.read())!=-1){
    109             out.write(len);
    110             out.flush();
    111         }
    112         in.close();
    113         out.close();
    114     }
    115 
    116 /*
    117 需求4:将录入的数据,以指定的编码格式存入到文件中
    118     源:InputStream Reader
    119     文本?Reader
    120     设备:键盘,System.in,字节流=>转换
    121     InputStreamReader isr=new InputStreamReader(System.in);
    122     缓冲:
    123     BufferedReader bufr=new BufferedReader(isr);
    124 
    125     目的:OutputStream Writer
    126     文本?Writer
    127     设备:硬盘,文件,FileWriter
    128     指定编码=>FileWriter做不到,找其父类=>OutputStreamWriter
    129     构造方法:OutputStreamWriter(OutputSream out , String charsetName)
    130     OutputStream+文件=>FileOutputStream
    131     OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("F:\1.txt"),"UTF-8");
    132     需要缓冲技术吗?
    133     BufferedWriter bufw=new BufferedWriter(osw);
    134 */
    135     public static void readIn_4()throws IOException{
    136 //        源:
    137         BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
    138 //        目的:(这里可以测试出默认,BGK,UTF-8的区别,UTF-8存放中文是字节更大)
    139         BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("F:\1.txt"),"UTF-8"));
    140 
    141         String line=null;
    142         while((line=bufr.readLine())!=null){
    143             if("over".equals(line))
    144                 break;
    145             bufw.write(line);
    146             bufw.newLine();
    147             bufw.flush();
    148         }
    149         bufr.close();
    150         bufw.close();
    151     }
    152 
    153 }
    键盘与控制台

     5.System类与PrintStream

    需求:通过System.getProperties()获取虚拟机加载的信息,通过Map或PrintStream的list(PrintStream p)方法列出Key与Value,尝试将信息保留至文件。

     1 package io;
     2 
     3 import java.io.*;
     4 import java.util.Map.Entry;
     5 import java.util.Properties;
     6 
     7 public class SystemDemo {
     8 
     9     public static void main(String[] args)throws IOException {
    10 //        mapShow();//通过HashTable遍历
    11         ioShow();
    12     }
    13     public static void mapShow(){
    14         Properties pro=System.getProperties();
    15         for(Entry<Object,Object> e:pro.entrySet()){//增强for循环相当于写了Set集合的迭代器
    16             String key=(String) e.getKey();
    17             String value=(String) e.getKey();
    18             
    19             System.out.println(key+"="+value);
    20         }
    21     }
    22     
    23     public static void ioShow()throws IOException{
    24         System.setOut(new PrintStream("E:\1.txt"));//System类可以指定源和目的
    25         Properties pro=System.getProperties();
    26         pro.list(System.out);
    27     }
    28 
    29 }
    系统类与打印流

     File类

     流主要是对数据的处理,关于处理文件和文件系统,描述文本本身属性,要用File。

    构造函数


    public class FileDemo {
         public static void main(String[] args){
             //构造函数File(String pathname)
             File f1 =new File("c:\abc\1.txt");
             //File(String parent,String child)
             File f2 =new File("c:\abc","2.txt");
             //File(File parent,String child)
             File f3 =new File("c:"+File.separator+"abc");//separator 跨平台分隔符
             File f4 =new File(f3,"3.txt");
             System.out.println(f1);//c:abc1.txt
    
         }
    
     }
    构造

    创建方法

    1.boolean createNewFile() 不存在返回true 存在返回false
    2.boolean mkdir() 创建目录
    3.boolean mkdirs() 创建多级目录

    删除方法

    1.boolean delete()
    2.boolean deleteOnExit() 方法一可能删除失败,如删除的目标文件正在被使用;文件使用完成后删除

     1 import java.io.File;
     2 import java.io.IOException;
     3  
     4 
     5 public class FileDemo2 {
     6     public static void main(String[] args){
     7         File f =new File("d:\1.txt");
     8         try {
     9             System.out.println(f.createNewFile());//当文件存在时返回false
    10             System.out.println(f.delete());//当文件不存在时返回false
    11         } catch (IOException e) {
    12             e.printStackTrace();
    13         }
    14     }
    15 }
    删除

    判断方法

    1.boolean canExecute()判断文件是否可执行
    2.boolean canRead()判断文件是否可读
    3.boolean canWrite() 判断文件是否可写
    4.boolean exists() 判断文件是否存在
    5.boolean isDirectory()
    6.boolean isFile()
    7.boolean isHidden()
    8.boolean isAbsolute()判断是否是绝对路径 文件不存在也能判断

    获取方法

    1.String getName()
    2.String getPath()
    3.String getAbsolutePath()
    4.String getParent()//如果没有父目录返回null
    5.long lastModified()//获取最后一次修改的时间
    6.long length()
    7.boolean renameTo(File f)
    8.File[] liseRoots()//获取机器盘符
    9.String[] list()
    10.String[] list(FilenameFilter filter)
    列出磁盘下的文件和文件夹:ListFiles()注意空指针异常:如E:System Volume Information

    当读到系统文件时,可能会报空指针异常而停止程序,需要做一定的判断处理

     1     public static void showAll_2(File f){
     2         //如果是文件,执行XX操作
     3         if(f.isFile()){
     4             if(f.toString().endsWith(".rar"))
     5             System.out.println(f);
     6         }
     7         //如果是文件夹,继续遍历
     8         else if(f.isDirectory()){
     9             File[] files=f.listFiles();
    10             if(files==null)
    11                 System.out.println("这里是空的!!!!!!!-------------"+f.getAbsolutePath());
    12             //files不为空才遍历----论重要性!!
    13             else if(files!=null)
    14                 for(File fChild:files)
    15                     showAll_2(fChild);
    16         }
    17     }
    递归遍历.rar文件

    文件过滤

    1.实现FilenameFilter接口;

    2.实现boolean accept(File dir,String name);   //dir表示文件的当前目录,name表示文件名;

     1 import java.io.File;
     2  import java.io.FilenameFilter;
     3  public class FileDemo4 {
     4      public static void main(String[] args){
     5          File[] files =File.listRoots();
     6          for(File file:files){
     7              System.out.println(file);
     8              if(file.length()>0){
     9                  String[] filenames =file.list(new FilenameFilter(){
    10                      //file 过滤目录 name 文件名
    11                      public boolean accept(File file,String filename){
    12                          return filename.endsWith(".mp3");
    13                      }
    14                  });
    15                  for(String filename:filenames){
    16                      System.out.println(filename);
    17                  }
    18              }
    19          }
    20      }
    21 
    22  }
    FilenameFileter


  • 相关阅读:
    回眸
    随想
    小序,良感
    润思
    网络爬虫的 “ 黑洞 ”
    Python——文件操作详解
    RandomAccessFile详解
    JSON数据解析及gson.jar包
    BigInteger详解
    Java爬虫——B站弹幕爬取
  • 原文地址:https://www.cnblogs.com/erhai/p/4779165.html
Copyright © 2020-2023  润新知