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在初级阶段无非就

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

  • 相关阅读:
    HanLP《自然语言处理入门》笔记--5.感知机模型与序列标注
    Netty系列-netty的Future 和 Promise
    Netty系列-netty的初体验
    CentOS7 源码编译安装Nginx
    linux 源码编译安装MySQL
    Linux CentOS7
    Linux CentOS7 搭建ntp时间同步服务器
    CentOS7-7搭建ftp服务器
    CentOS7-7 搭建dhcp服务器
    python批量扫描脚本
  • 原文地址:https://www.cnblogs.com/jpfss/p/9493096.html
Copyright © 2011-2022 走看看