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);
}
}
}
} } private static boolean remove(File file) {
File[] files = file.listFiles();
//先判断文件夹是否为空 为空返回false
if(files!=null){
for (File file2 : files) {
//底层文件夹中含有符合条件的文件 返回true
if(file2.isFile() && file2.getName().endsWith(".java")){
return true;
//判断是否是文件夹 //底层是否有java文件
}else if(file2.isDirectory() && remove(file2)){
return true;
}
}
}
return false;
}

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

第三步main()方法

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

字符流>>题目

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

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(); //换文档中第一行与最后一行交换
for (int i = 0; i<list.size()/2 ;i++) {
String string = list.get(i);  
        //只需要交换集合长度/2次
list.set(i, list.get(list.size()-1-i));
list.set(list.size()-1-i, string);
}
//遍历并且把字符串写到文件中
for (String string : list) {
bw.write(string);
bw.newLine();
}
      //关流
bw.close();
}

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

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

java基础IO流综合加习题的更多相关文章

  1. Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream)

    Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.对象的序 ...

  2. java基础-IO流对象之Properties集合

    java基础-IO流对象之Properties集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Properties集合的特点 Properties类表示了一个持久的属性集. ...

  3. Java基础-IO流对象之字节流(Stream)

    Java基础-IO流对象之字节流(Stream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在前面我分享的笔记中,我们一直都是在操作文件或者文件夹,并没有给文件中写任何数据.现 ...

  4. Java基础IO流(二)字节流小案例

    JAVA基础IO流(一)https://www.cnblogs.com/deepSleeping/p/9693601.html ①读取指定文件内容,按照16进制输出到控制台 其中,Integer.to ...

  5. Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream)

    Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我已经分享过很多的J ...

  6. Java基础-IO流对象之随机访问文件(RandomAccessFile)

    Java基础-IO流对象之随机访问文件(RandomAccessFile) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.RandomAccessFile简介 此类的实例支持对 ...

  7. Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream)

    Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.内存 ...

  8. Java基础-IO流对象之数据流(DataOutputStream与DataInputStream)

    Java基础-IO流对象之数据流(DataOutputStream与DataInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据流特点 操作基本数据类型 ...

  9. Java基础-IO流对象之打印流(PrintStream与PrintWriter)

    Java基础-IO流对象之打印流(PrintStream与PrintWriter) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.打印流的特性 打印对象有两个,即字节打印流(P ...

随机推荐

  1. 组件接口(API)设计指南[5]-最后的思考

    *阅读其它章节: http://blog.csdn.net/cuibo1123/article/details/39894477 最后的思考 我通过困难的学习以及多年的失误.写了这片篇关于创建组件和a ...

  2. IOS开发苹果官方Sample Code及下载地址

    IOS开发苹果官方Sample Code及下载地址 在线浏览地址:https://developer.apple.com/library/ios/navigation/#section=Resourc ...

  3. Android在包名称更改项目

    通常时引起包名称的变化R文件错误,有时原因不明Manifest混乱多个文本文件. 所以,我们现在感到最简单方便的包名称变更流程文件,如以下: 如果程序包命名com.pepper.util,我们将更改包 ...

  4. Mysql彻底卸载

    -----本文摘自:http://www.heiqu.com/show-64764-1.html 1.控制面板里的增加删除程序内进行删除 2.删除MySQL文件夹下的my.ini文件,如果备份好,可以 ...

  5. cygwin的安装使用

    Cygwin 是一个用于 Windows 的类 UNIX shell 环境. 它由两个组件组成:一个 UNIX API 库,它模拟 UNIX 操作系统提供的许多特性:以及 Bash shell 的改写 ...

  6. 松瀚SN8P2711 2722 ADC初始化程序及应用--汇编源码

    /* 松瀚 SN8P2711 2722 ADC初始化程序 及应用实例 */ INIT_ADC: MOV A, #0XB2 // 启动ADC电路 使能AIN通道 B0MOV ADM, A MOV A,# ...

  7. 【转】GIT和SVN之间的五个基本区别

    如果你在读这篇文章,说明你跟大多数开发者一样对GIT感兴趣,如果你还没有机会来试一试GIT,我想现在你就要了解它了. GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等.如果 ...

  8. Remote验证及其改进(附源码)

    Remote验证及其改进(附源码) 表单中的输入项,有些是固定的,不变的验证规则,比如字符长度,必填等.但有些是动态的,比如注册用户名是否存在这样的检查,这个需要访问服务器后台才能解决.这篇文章将会介 ...

  9. 【C#基础知识】静态构造函数,来源于一道面试题的理解

    看到园友的一道面试题,很好奇,测试了一下结果. public class A { public static int X=B.Y ; public A() { ++X; } } public clas ...

  10. jQuery LigerUI V1.2.2

    jQuery LigerUI V1.2.2 (包括API和全部源码) 发布 前言 这次版本主要对树进行了加载性能上面的优化,并解决了部分兼容性的问题,添加了几个功能点. 欢迎使用反馈. 相关链接 AP ...