zoukankan      html  css  js  c++  java
  • java基础IO流综合加习题

    1. IO流初学者在学习时都有一点迷糊,今天我们就讲讲IO流,希望通过讲解可以帮助大家
    2. IO流分为字节流,字符流,缓冲流.我们只要记住这三个就可以了.

         1*字节流有:字节输入流(FileInputStream),字节输出流(FileOutputStream).

         2*字符流有:字符输入流(FileReader),当让也有字符输出流(FileWriter);

      字节流>>字节输入流,无非就是读取文件,初学者可以这么认为,把文档的读取出来放在缓冲区里(假设有这个缓冲区)

              >>字节输出流,也就是从这个假设的缓冲区里把读取出来

      字符流>>也是一个道理.不过字符流只可以操作纯文本文件,他被开发出来就是用来操作文本文件的,什么是纯文本文件呢??

           纯文本文件也就是可以用记事本打开的文件.

           后期,我们用到字符流的地方,无非就是操作这些纯文本文件,读取文件类容,在控制台打印啊,或者手写一个字符串录入到文档中等;

      一:通过习题我们来认识字节流:

        今天就和大家分享一下字节流拷贝文件.将会用上java基础阶段字节流的所有方法

        /*

         *键盘输入一个文件夹地址,将其中的文件拷贝到另一个文件夹下.只拷贝.java文件

         *分析:1.拿到这个题,我们还是大问题变成小问题解决

         *       (1)键盘输入>>>要判断是否是一个正确的文件夹路径>>我们可以把输入的字符串封装到File中用exists()判断是否存在返回值boolean类型

         *       (2)拿到正确的文件夹地址.我们开始选择用什么流拷贝呢,刚才我也说了字符流适合操作纯文本文件,所以我们遇到非纯文本的适合直接选择字节流

         *       (2_1)有人会问,那缓冲流呢??别急,其实缓冲流是服务字节流,字符流的,你可以认为他就一个8缸的汽车发动机,让汽车变飞机的快感,说道这里你也应该明白

         *     缓冲流是干嘛的吧,也就是在字节字符流读取写入文件的时候速度加快用的,其实底层是一个缓冲区,8*1024个字节.

         *   (3)拷贝文件夹的时候,文件夹中不可能只有文件也有子文件夹,我们这里要用到递归,天哪,好麻烦啊,一会我们做代码你会发现,其实也就那样

         *     (4)那文件夹中又有文件夹又有文件,那我们怎么分辨呢?  File给我提供了判断的方法:isFile()判断文件.isDirectory()判断文件夹

         *   (5)那获取到他们要讲他们先放在那里呢?把这些文件夹和文件放在数组里?可是没有这个方法啊,这个File给我提供了专门的数组File[]

         */

        来吧>开始做题

        第一步:键盘输入>>>要判断是否是一个正确的文件夹路径

        

    复制代码
        private static File getScanner() {
          //键盘输入 Scanner sc
    = new Scanner(System.in); System.out.println("请输入文件夹的路径:"); while(true){ String string = sc.nextLine();
              //封装键盘输入的文件地址 File file
    = new File(string);
              //判断文件夹地址是否存在
    if(!file.exists()){ System.out.println("你输入的文件路径不存在,请重新输入:");
              //判断是否为文件地址 }
    else if(file.isFile()){ System.out.println("你输入的是文件,不是文件夹,请重新输入:"); }else{
              //最后返回文件夹地址
    return file; } } }
    复制代码

      第二步:拷贝

    复制代码
        private static void copy(File src, File dest) throws IOException {
            //拿到刚才输入的两个文件夹地址  源文件地址为src  要接收的文件夹的地址为dest
            //把源文件夹中的文件,字文件夹存放到File数组中src.listFiles();方法获取
            File[] files = src.listFiles();
            //判断数组是否为空
            if(files!=null){
                //遍历数组
                for (File file : files) {
                     //如果是文件   并且以java结尾                     geName()是拿到文件夹或者文件的名字字符串
                    if(file.isFile() && file.getName().endsWith(".java")){
                        //符合条件的复制
                        //缓冲流来了啊  记得加速的                 后面跟上我们的字节流,别装上了发动机不要车了啊  
                        //字节输入流   对于初学者来说:可以认为读取文件到缓冲区
                        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
                        //字节输出流   把缓冲区的内容拿出来给另外一个对象                                                                                 这里我们讲一下为什么在new File(这里存放的是文件地址)
                        //                                                                  要接收的文件夹的地址为dest  加上 文件的地址
                        //                                                                              E:\dest    \xxx.java 拼接成一个完整的文件地址
                        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(dest,file.getName())));
                        //这里建一个字节数组    其实也是让文件拷贝的更加快一点
                        byte[] by = new byte[1024*8];
                        //索引  拷贝结束了,没有了  数组就返回-1;
                        int len=0;
                        while((len=bis.read(by))!=-1){
                            //往里面写
                            bos.write(by, 0, len);
                        }
                        //关流
                        bos.close();
                        bis.close();
                    }else if(file.isDirectory()){
                        //建立一个remove()方法  判读文件夹中可包含java文件 不包含文件夹不复制过来
                        if(remove(file)){
                            File newfile = new File(dest,file.getName());
                            if(!newfile.exists()){
                                //建立文件夹  文件夹中的文件夹
                                newfile.mkdirs();
                            }
                            copy(file, newfile);
                        }
                    }
                }
            }
    
    }
    
    </span><span style="color: #0000ff">private</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">boolean</span><span style="color: #000000"> remove(File file) {
        File[] files </span>=<span style="color: #000000"> file.listFiles();
        </span><span style="color: #008000">//</span><span style="color: #008000">先判断文件夹是否为空  为空返回false</span>
        <span style="color: #0000ff">if</span>(files!=<span style="color: #0000ff">null</span><span style="color: #000000">){
            </span><span style="color: #0000ff">for</span><span style="color: #000000"> (File file2 : files) {
                </span><span style="color: #008000">//</span><span style="color: #008000">底层文件夹中含有符合条件的文件  返回true</span>
                <span style="color: #0000ff">if</span>(file2.isFile() &amp;&amp; file2.getName().endsWith(".java"<span style="color: #000000">)){
                    </span><span style="color: #0000ff">return</span> <span style="color: #0000ff">true</span><span style="color: #000000">;
                    </span><span style="color: #008000">//</span><span style="color: #008000">判断是否是文件夹                                  </span><span style="color: #008000">//</span><span style="color: #008000">底层是否有java文件</span>
                }<span style="color: #0000ff">else</span> <span style="color: #0000ff">if</span>(file2.isDirectory() &amp;&amp;<span style="color: #000000"> remove(file2)){
                    </span><span style="color: #0000ff">return</span> <span style="color: #0000ff">true</span><span style="color: #000000">;
                }
            }
        }
        </span><span style="color: #0000ff">return</span> <span style="color: #0000ff">false</span><span style="color: #000000">;
    }<br><br></span></pre>
    
    复制代码

    上面的代码可能一时理解起来比较难消化,时间原因,下次我更新一个比较详细的

     第三步main()方法

    public static void main(String[] args) throws IOException {
            File src = getScanner();
            File dest = getScanner();
            copy(src,dest);
    
    }</span></pre>
    

    字符流>>题目

    /*
     * 文档中第一行与最后一行交换
     *      第二行与倒数第二行交换
     *
     */

    复制代码
    public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new FileReader("abc\b.txt"));
            BufferedWriter bw = new BufferedWriter(new FileWriter("abc\c.txt"));
            ArrayList<String> list = new ArrayList<>();
          //字节流我们说了用len!=-1做索引
          //文档有一个方法可以一行一行的读取,当然可以想在字节流那样读取 String line
    =null; while((line=br.readLine())!=null){ list.add(line); } br.close();
        </span><span style="color: #008000">//</span><span style="color: #008000">换文档中第一行与最后一行交换</span>
        <span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> i = 0; i&lt;list.size()/2 ;i++<span style="color: #000000">) {
            String string </span>=<span style="color: #000000"> list.get(i);  <br>        //只需要交换集合长度/2次<br>
            list.set(i, list.get(list.size()</span>-1-<span style="color: #000000">i));
            list.set(list.size()</span>-1-<span style="color: #000000">i, string);
        }
        //遍历并且把字符串写到文件中
        </span><span style="color: #0000ff">for</span><span style="color: #000000"> (String string : list) {
            bw.write(string);
            bw.newLine();
        }<br>      //关流
        bw.close();
    }</span></pre>
    
    复制代码

    今天就说这么多了,回头看我自己写的........我发初学IO的应该不知道我在说啥.下次一定来一个详细的,说真的IO流要细说,有的说的,不过大家记住IO在初级阶段无非就

    是操作文件夹文件,拷贝删除,写,读.字符流只读只写拷贝自己流,不要忘记缓冲流这个加速器.谢谢大家

  • 相关阅读:
    2020.10.23 19级training 补题报告
    2020.10.17 天梯赛练习 补题报告
    2020.10.16 19级training 补题报告
    2020.10.9 19级training 补题报告
    2020.10.10 天梯赛练习 补题报告
    2020.10.3 天梯赛练习 补题报告
    2020.10.2 19级training 补题报告
    第十届山东省ACM省赛复现补题报告
    VVDI Key Tool Plus Adds VW Passat 2015 Key via OBD
    Xhorse VVDI Prog Software V5.0.3 Adds Many MCUs
  • 原文地址:https://www.cnblogs.com/jpfss/p/9493096.html
Copyright © 2011-2022 走看看