对于文件内容的操作主要分为两大类

分别是:字符流

字节流

其中,字符流有两个抽象类:Writer   Reader

其对应子类FileWriter和FileReader可实现文件的读写操作

BufferedWriter和BufferedReader能够提供缓冲区功能,用以提高效率

同样,字节流也有两个抽象类:InputStream   OutputStream

其对应子类有FileInputStream和FileOutputStream实现文件读写

BufferedInputStream和BufferedOutputStream提供缓冲区功能

初学者在学会使用字符流和字节流之后未免会产生疑问:什么时候该使用字符流,什么时候又该使用字节流呢?
其实仔细想想就应该知道,所谓字符流,肯定是用于操作类似文本文件或者带有字符文件的场合比较多
而字节流则是操作那些无法直接获取文本信息的二进制文件,比如图片,mp3,视频文件等
说白了在硬盘上都是以字节存储的,只不过字符流在操作文本上面更方便一点而已
此外,为什么要利用缓冲区呢?
我们知道,像迅雷等下载软件都有个缓存的功能,硬盘本身也有缓冲区
试想一下,如果一有数据,不论大小就开始读写,势必会给硬盘造成很大负担,它会感觉很不爽
人不也一样,一顿饭不让你一次吃完,每分钟喂一勺,你怎么想?
因此,采用缓冲区能够在读写大文件的时候有效提高效率

字符流 写入

package com.test;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class fileTest {
    
    public static void main(String[] args) {
        //创建要操作的文件路径和名称
        //其中,File.separator表示系统相关的分隔符,Linux下为:/  Windows下为:\\
        String path ="d:"+ File.separator +"love"+File.separator+ "file.txt" ;//d:\\love\\file.txt  love文件夹必须存在
        FileWriter w = null;
        try {
            //以path为路径创建一个新的FileWriter对象
            //如果需要追加数据,而不是覆盖,则使用FileWriter(path,true)构造方法
            w = new FileWriter(path);
             
            //将字符串写入到流中,\r\n表示换行想有好的
            //循环写入txt中 换行
            for (int i = 0; i < 5; i++) {
                String s = "我爱曼曼!!! \r\n";
                w.write(s);
            }
            System.out.println("完毕");
            //如果想马上看到写入效果,则需要调用w.flush()方法
            w.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //如果前面发生异常,那么是无法产生w对象的
            //因此要做出判断,以免发生空指针异常
            if(w != null) {
                try {
                    //关闭流资源,需要再次捕捉异常
                    w.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    }
 }
}

字节流写入

package com.test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamWirte {

public static void main(String[] args) {
        String path ="d:"+ File.separator + "file11.txt" ;
   
  FileOutputStream o = null;
   
  try {
      o = new FileOutputStream(path);
      String str = "Nerxious is a good boy\r\n";
      byte[] buf = str.getBytes();
      //也可以直接使用o.write("String".getBytes());
      //因为字符串就是一个对象,能直接调用方法
      o.write(buf);
       
  } catch (IOException e) {
      e.printStackTrace();
  } finally {
      if(o != null) {
          try {
              o.close();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
  }

}

}

字符流读取

package com.test;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class fileRead {

public static void main(String[] args) {
         String path ="d:\\dd.txt";

FileReader r = null;
   try {
       r = new FileReader(path);
        
       //方式一:读取单个字符的方式
       //每读取一次,向下移动一个字符单位
       /*int temp1 = r.read();
       System.out.println((char)temp1);
       int temp2 = r.read();
       System.out.println((char)temp2);*/
                    
       //方式二:循环读取
       //read()方法读到文件末尾会返回-1
       
       /*while (true) {
           int temp = r.read();
           if (temp == -1) {
               break;
           }
           System.out.print((char)temp);
       }*/
       
        
       //方式三:循环读取的简化操作
       //单个字符读取,当temp不等于-1的时候打印字符
       int temp = 0;
       while ((temp = r.read()) != -1) {
           System.out.print((char)temp);
       }
       
        
       //方式四:读入到字符数组
       /*
       char[] buf = new char[1024];
       int temp = r.read(buf);
       //将数组转化为字符串打印,后面参数的意思是
       //如果字符数组未满,转化成字符串打印后尾部也许会出现其他字符
       //因此,读取的字符有多少个,就转化多少为字符串
       System.out.println(new String(buf,0,temp));
       */
        
       //方式五:读入到字符数组的优化
       //由于有时候文件太大,无法确定需要定义的数组大小
       //因此一般定义数组长度为1024,采用循环的方式读入
       /*
       char[] buf = new char[1024];
       int temp = 0;
       while((temp = r.read(buf)) != -1) {
           System.out.print(new String(buf,0,temp));
       }
       */
        
   } catch (IOException e) {
       e.printStackTrace();
   } finally {
       if(r != null) {
           try {
               r.close();
           } catch (IOException e) {
               e.printStackTrace();
           }
       }
   }

}

}

字节流读取

package com.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class FileOutputStreamRead {

public static void main(String[] args) {
        String path ="d:\\dd.txt";
   
  FileInputStream i = null;
   
  try {
      i = new FileInputStream(path);
       
      //方式一:单个字符读取
      //需要注意的是,此处我用英文文本测试效果良好
      //但中文就悲剧了,不过下面两个方法效果良好
      /*int ch = 0;
      while((ch=i.read()) != -1){
          System.out.print((char)ch);
      }*/
       
      //方式二:数组循环读取
      
      byte[] buf = new byte[1024];
      int len = 0;
      while((len = i.read(buf)) != -1) {
          System.out.println(new String(buf,0,len));
      }
      
       
       
      //方式三:标准大小的数组读取
      /*
      //定一个一个刚好大小的数组
      //available()方法返回文件的字节数
      //但是,如果文件过大,内存溢出,那就悲剧了
      //所以,亲们要慎用!!!上面那个方法就不错
      byte[] buf = new byte[i.available()];
      i.read(buf);
      //因为数组大小刚好,所以转换为字符串时无需在构造函数中设置起始点
      System.out.println(new String(buf));
      */
       
  } catch (IOException e) {
      e.printStackTrace();
  } finally {
      if(i != null) {
          try {
              i.close();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
  }

}

}

package com.test;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class testCharIO {

public static void main(String[] args) {
        readTest();
    }
    //写入方法
    public static void writeTest(){
        //创建要操作的文件路径和名称
        //其中,File.separator表示系统相关的分隔符,Linux下为:/  Windows下为:\\
        /*String path = File.separator + "home" + File.separator + "siu" +
                File.separator + "work" + File.separator + "demo.txt";*/
        String path = "e:\\testt\\demo.txt";  //testt文件夹必须存在
        //由于IO操作会抛出异常,因此在try语句块的外部定义FileWriter的引用
        FileWriter w = null;
        try {
            //w = new FileWriter(path);
            w = new FileWriter(path,true);//循环写入 设置true
            //将字符串写入到流中,\r\n表示换行想有好的
            for (int i = 0; i < 3; i++) {
                 w.write("chenfujian is a good boy\r\n");
            }
            
            w.flush();
            System.out.println("完毕");
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(w!=null){
                try {
                    //关闭流资源,需要再次捕捉异常
                    w.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        
    }
    //读取方法
    public static void readTest(){
        String path = "e:\\testt\\demo.txt";  //testt文件夹必须存在
         FileReader r = null;
         try {
             r = new FileReader(path);
             /*int temp1 = r.read();
             System.out.println((char)temp1);*/
             
           //方式二:循环读取
                //read()方法读到文件末尾会返回-1
              
            while (true) {
                int temp = r.read();
                if (temp == -1) {
                    break;
                }
                System.out.print((char) temp);
            }
           
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                r.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            
        }
        
        
        
    }

}

package com.test;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class testByteIO {

public static void main(String[] args) {
        readTest();

}
    //写入
    public static void writeTest(){
        String path = "e:\\testt\\demo2.txt";  //testt文件夹必须存在
        FileOutputStream o = null;
        try {
            o = new FileOutputStream(path);
            String str = "Nerxious is a good boy\r\n";
            byte[] buf = str.getBytes();
            //也可以直接使用o.write("String".getBytes());
            //因为字符串就是一个对象,能直接调用方法
            o.write(buf);
            
            
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(o != null) {
                try {
                    o.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    //读取
    public static void readTest(){
        String path = "e:\\testt\\demo2.txt";  //testt文件夹必须存在
         FileInputStream i = null;
        try {
            i = new FileInputStream(path);
             byte[] buf = new byte[1024];
                int len = 0;
                while((len = i.read(buf)) != -1) {
                    System.out.println(new String(buf,0,len));
                }
            
        } catch (Exception e) {
             e.printStackTrace();
        }finally{
            if(i != null) {
                try {
                    i.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        
    }

}

参考博客:http://blog.csdn.net/yczz/article/details/38761237
http://www.cnblogs.com/nerxious/archive/2012/12/15/2818848.html

java io (一)的更多相关文章

  1. java.IO输入输出流:过滤流:buffer流和data流

    java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...

  2. Java:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...

  3. Java IO之字符流和文件

    前面的博文介绍了字节流,那字符流又是什么流?从字面意思上看,字节流是面向字节的流,字符流是针对unicode编码的字符流,字符的单位一般比字节大,字节可以处理任何数据类型,通常在处理文本文件内容时,字 ...

  4. java Io流向指定文件输入内容

    package com.hp.io; import java.io.*; public class BufferedWriterTest{ public static void main(String ...

  5. java Io文件输入输出流 复制文件

    package com.hp.io; import java.io.FileInputStream; import java.io.FileNotFoundException; import java ...

  6. java Io流更新文件内容

    package com.hp.io; import java.io.FileOutputStream; import java.io.IOException; public class FileOut ...

  7. java IO流详解

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  8. java.io.NotSerializableException: test.io.file.Student

    java.io.NotSerializableException: test.io.file.Student    at java.io.ObjectOutputStream.writeObject0 ...

  9. java.io.IOException: mark/reset not supported

    java.io.IOException: mark/reset not supported at java.io.InputStream.reset(InputStream.java:348) at ...

  10. Java IO流学习总结

    Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

随机推荐

  1. 从零开始,做一个NodeJS博客(二):实现首页-加载文章列表和详情

    标签: NodeJS 0 这个伪系列的第二篇,不过和之前的几篇是同一天写的.三分钟热度貌似还没过. 1 静态资源代理 上一篇,我们是通过判断请求的路径来直接返回结果的.简单粗暴,缺点明显:如果url后 ...

  2. Javascript数组算法和技巧总结

    Js-arrayMethod https://github.com/HerbertKarajan/Js-arrayMethod List unique an array 数组去重 random str ...

  3. Atitit.url 汉字中文路径  404 resin4 resin  解决  v2 q329

    Atitit.url 汉字中文路径  404 resin4 resin  解决  v2 q329 1. Pluginx机制1 2. Code1 3. 参考4 1. 原理 过滤器  ,,拦截jpg  w ...

  4. 【代码笔记】iOS-获得现在的时间

    一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ...

  5. OC中的私有变量和description

    .OC中的私有变量 在类的实现即.m @implementation中也可以声明成员变量,但是因为在其他文件中通常都只 是包含头文件而不会包含实现文件,所以在.m文件中声明的成员变量是@private ...

  6. View Focus的处理过程及ViewGroup的mFocused字段分析

    通过上篇的介绍,我们知道在对KeyEvent的处理中有非常重要的一环,那就是KeyEvent在focus view的path上自上而下的分发, 换句话说只有focus的view才有资格参与KeyEve ...

  7. UISegmentedControl(人物简介)

    效果图 当你点击上面人物名字的时候 ,就可以随意切换人物. 这个很有趣 , 你还可以试着添加音乐播放器 .以及一些别的来完善你想做的. 好吧 , 废话不多说 , 上代码. #import " ...

  8. php设计模式 观察者模式

    观察者模式的核心是把客户元素(观察者)从一个中心类(主体)中分离开来.当主体知道事件发生时,观察者需要被通知到.同时,我们并不希望将主体与观察者之间的关系进行硬编码.为了达到这个目的,我们可以允许观察 ...

  9. 创建用户故事地图(User Story Mapping)的8个步骤

    [小编]上周六了解了用户故事地图后,小编又查阅了一些资料,找到了以下这篇关于如何组织用户故事地图规划的文章,分享给大家.也希望大家如果有好的实践,也可以留言一起交流. 原文地址:http://winn ...

  10. mysql数据校验之字符集问题

    场景:主库DB:utf8字符集备库DB:gbk字符集 需求:校验主备数据是否一致,并且修复 校验过程:设置主库连接为utf8,设置备库连接为gbk,分别进行查询,将返回的的结果集按记录逐字段比较. 显 ...