使用Java操作文本文件的方法详解


       
最初java是不支持对文本文件的处理的,为了弥补这个缺憾而引入了Reader和Writer两个类,这两个类都是抽象类,Writer中 write(char[] ch,int off,int length),flush()和close()方法为抽象方法,Reader中read(char[] ch,int off,int length)和close()方法是抽象方法。子类应该分别实现他们。
  当我们读写文本文件的时候,采用Reader是非常方便的,比如FileReader,InputStreamReader和BufferedReader。其中最重要的类是InputStreamReader,它是字节转换为字符的桥梁。你可以在构造器重指定编码的方式,如果不指定的话将采用底层操作系统的默认编码方式,例如GBK等。当使用FileReader读取文件的时候。
  

FileReader fr = new FileReader("ming.txt");
int ch = 0;
while((ch = fr.read())!=-1 )
{
System.out.print((char)ch);
}

其中read()方法返回的是读取得下个字符。当然你也可以使用read(char[] ch,int off,int length)这和处理二进制文件的时候类似,不多说了。如果使用InputStreamReader来读取文件的时候

while((ch = isr.read())!=-1)
{
System.out.print((char)ch);
}

这和FileReader并没有什么区别,事实上在FileReader中的方法都是从InputStreamReader中继承过来的。read()方法是比较好费时间的,如果为了提高效率 我们可以使用BufferedReader对Reader进行包装,这样可以提高读取得速度,我们可以一行一行的读取文本,使用readLine()方法。

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("ming.txt")));
String data = null;
while((data = br.readLine())!=null)
{
System.out.println(data);
}

当你明白了如何用Reader来读取文本文件的时候那么用Writer写文件同样非常简单。有一点需要注意,当你写文件的时候,为了提高效率,写入的数据会先放入缓冲区,然后写入文件。因此有时候你需要主动调用flush()方法。与上面对应的写文件的方法为:

FileWriter fw = new FileWriter("hello.txt");
String s = "hello world";
fw.write(s,0,s.length());
fw.flush();
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("hello2.txt"));
osw.write(s,0,s.length());
osw.flush();
PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("hello3.txt")),true);
pw.println(s);

不要忘记用完后关闭流!下面是个小例子,帮助新手理解。其实有的时候java的IO系统是需要我们多记记的,不然哪天就生疏了。

import java.io.*;
public class TestFile2
{
public static void main(String[] args) throws IOException
{
FileReader fr = new FileReader("ming.txt");
char[] buffer = new char[1024];
int ch = 0;
while((ch = fr.read())!=-1 )
{
System.out.print((char)ch);
}
    InputStreamReader isr = new InputStreamReader(new FileInputStream("ming.txt"));
    while((ch = isr.read())!=-1)
    {
      System.out.print((char)ch);
    }
    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("ming.txt")));
    String data = null;
    while((data = br.readLine())!=null)
    {
      System.out.println(data);
    }
    FileWriter fw = new FileWriter("hello.txt");
    String s = "hello world";
    fw.write(s,0,s.length());
    fw.flush();
    OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("hello2.txt"));
    osw.write(s,0,s.length());
    osw.flush();
    PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("hello3.txt")),true);
    pw.println(s);
    fr.close();
    isr.close();
    br.close();
    fw.close();
    osw.close();
    pw.close();
  }
}

Java中多种方式读文件
一、多种方式读文件内容。
1、按字节读取文件内容
2、按字符读取文件内容
3、按行读取文件内容
4、随机读取文件内容

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.io.Reader;
public class ReadFromFile {
  /**
  * 以字节为单位读取文件,常用于读二进制文件,如图片、声音、影像等文件。
  * @param fileName 文件的名
  */
  public static void readFileByBytes(String fileName){
    File file = new File(fileName);
    InputStream in = null;
    try {
      System.out.println("以字节为单位读取文件内容,一次读一个字节:");
      // 一次读一个字节
      in = new FileInputStream(file);
      int tempbyte;
      while((tempbyte=in.read()) != -1){
        System.out.write(tempbyte);
      }
      in.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
    try {
      System.out.println("以字节为单位读取文件内容,一次读多个字节:");
      //一次读多个字节
      byte[] tempbytes = new byte[100];
      int byteread = 0;
      in = new FileInputStream(fileName);
      ReadFromFile.showAvailableBytes(in);
      //读入多个字节到字节数组中,byteread为一次读入的字节数
      while ((byteread = in.read(tempbytes)) != -1){
        System.out.write(tempbytes, 0, byteread);
      }
    } catch (Exception e1) {
      e1.printStackTrace();
    } finally {
      if (in != null){
        try {
          in.close();
        } catch (IOException e1) {
        }
      }
    }
  }
  /**
  * 以字符为单位读取文件,常用于读文本,数字等类型的文件
  * @param fileName 文件名
  */
  public static void readFileByChars(String fileName){
    File file = new File(fileName);
    Reader reader = null;
    try {
      System.out.println("以字符为单位读取文件内容,一次读一个字节:");
      // 一次读一个字符
      reader = new InputStreamReader(new FileInputStream(file));
      int tempchar;
      while ((tempchar = reader.read()) != -1){
        //对于windows下,rn这两个字符在一起时,表示一个换行。
        //但如果这两个字符分开显示时,会换两次行。
        //因此,屏蔽掉r,或者屏蔽n。否则,将会多出很多空行。
        if (((char)tempchar) != 'r'){
          System.out.print((char)tempchar);
        }
      }
      reader.close();
    } catch (Exception e) {
      e.printStackTrace();
    }

    try {
      System.out.println("以字符为单位读取文件内容,一次读多个字节:");
      //一次读多个字符
      char[] tempchars = new char[30];
      int charread = 0;
      reader = new InputStreamReader(new FileInputStream(fileName));
      //读入多个字符到字符数组中,charread为一次读取字符数
      while ((charread = reader.read(tempchars))!=-1){
        //同样屏蔽掉r不显示
        if ((charread == tempchars.length)&&(tempchars[tempchars.length-1] != 'r')){
          System.out.print(tempchars);
        }else{
          for (int i=0; i<charread; i++){
            if(tempchars[i] == 'r'){
              continue;
            }else{
              System.out.print(tempchars[i]);
            }
          }
        }
      }
    } catch (Exception e1) {
      e1.printStackTrace();
    }finally {
      if (reader != null){
        try {
          reader.close();
        } catch (IOException e1) {
        }
      }
    }
  }
  /**
  * 以行为单位读取文件,常用于读面向行的格式化文件
  * @param fileName 文件名
  */
  public static void readFileByLines(String fileName){
    File file = new File(fileName);
    BufferedReader reader = null;
    try {
      System.out.println("以行为单位读取文件内容,一次读一整行:");
      reader = new BufferedReader(new FileReader(file));
      String tempString = null;
      int line = 1;
      //一次读入一行,直到读入null为文件结束
      while ((tempString = reader.readLine()) != null){
        //显示行号
        System.out.println("line " + line + ": " + tempString);
        line++;
      }
      reader.close();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (reader != null){
        try {
          reader.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
  }
  /**
  * 随机读取文件内容
  * @param fileName 文件名
  */
  public static void readFileByRandomAccess(String fileName){
    RandomAccessFile randomFile = null;
    try {
      System.out.println("随机读取一段文件内容:");
      // 打开一个随机访问文件流,按只读方式
      randomFile = new RandomAccessFile(fileName, "r");
      // 文件长度,字节数
      long fileLength = randomFile.length();
      // 读文件的起始位置
      int beginIndex = (fileLength > 4) ? 4 : 0;
      //将读文件的开始位置移到beginIndex位置。
      randomFile.seek(beginIndex);
      byte[] bytes = new byte[10];
      int byteread = 0;
      //一次读10个字节,如果文件内容不足10个字节,则读剩下的字节。
      //将一次读取的字节数赋给byteread
      while ((byteread = randomFile.read(bytes)) != -1){
        System.out.write(bytes, 0, byteread);
      }
    } catch (IOException e){
      e.printStackTrace();
    } finally {
      if (randomFile != null){
        try {
          randomFile.close();
        } catch (IOException e1) {
        }
      }
    }
  }
  /**
  * 显示输入流中还剩的字节数
  * @param in
  */
  private static void showAvailableBytes(InputStream in){
    try {
      System.out.println("当前字节输入流中的字节数为:" + in.available());
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  public static void main(String[] args) {
    String fileName = "C:/temp/newTemp.txt";
    ReadFromFile.readFileByBytes(fileName);
    ReadFromFile.readFileByChars(fileName);
    ReadFromFile.readFileByLines(fileName);
    ReadFromFile.readFileByRandomAccess(fileName);
  }
} 二、将内容追加到文件尾部
import java.io.FileWriter;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* 将内容追加到文件尾部
*/
public class AppendToFile {
/**
* A方法追加文件:使用RandomAccessFile
* @param fileName 文件名
* @param content 追加的内容
*/
  public static void appendMethodA(String fileName,String content){
    try {
      // 打开一个随机访问文件流,按读写方式
      RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw");
      // 文件长度,字节数
      long fileLength = randomFile.length();
      //将写文件指针移到文件尾。
      randomFile.seek(fileLength);
      randomFile.writeBytes(content);
      randomFile.close();
    } catch (IOException e){
      e.printStackTrace();
    }
  }

/**
* B方法追加文件:使用FileWriter
* @param fileName
* @param content
*/
  public static void appendMethodB(String fileName, String content){
    try {
      //打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件
      FileWriter writer = new FileWriter(fileName, true);
      writer.write(content);
      writer.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  public static void main(String[] args) {
    String fileName = "C:/temp/newTemp.txt";
    String content = "new append!";
    //按方法A追加文件
    AppendToFile.appendMethodA(fileName, content);
    AppendToFile.appendMethodA(fileName, "append end. n");
    //显示文件内容
    ReadFromFile.readFileByLines(fileName);
    //按方法B追加文件
    AppendToFile.appendMethodB(fileName, content);
    AppendToFile.appendMethodB(fileName, "append end. n");
    //显示文件内容
    ReadFromFile.readFileByLines(fileName);
  }
}

最新文章

  1. java swing 双人五子棋源代码
  2. Eclipse使用指定JDK,无需配置Path变量
  3. Entity Framework做IN查询
  4. android 中 listview 设置自动匹配高度
  5. 微信Api
  6. .NET中 MEF应用于IOC
  7. HTML5表单增强
  8. NYOJ--1236--挑战密室(第八届河南省程序设计大赛)
  9. 第4阶段——制作根文件系统之编译配置安装busybox(3)
  10. DOM常用外部插入方法与区别
  11. 【spring实战第五版遇到的坑】3.1中的例子报错
  12. [C程序设计基础]快速排序
  13. Android之官方导航栏之Toolbar(Toolbar+DrawerLayout+ViewPager+PagerSlidingTabStrip)
  14. Collection中的List,Set的toString()方法
  15. Android 关于操作栏 ActionBar 的设计原则【转载+整理】
  16. hihocoder 1866 XOR
  17. LightOj 1422 Halloween Costumes(区间DP)
  18. sqoop2-1.99.5-cdh5.5.4.tar.gz的部署搭建
  19. 【转】Linux中文件的可读,可写,可执行权限的解读以及chmod,chown,chgrp命令的用法
  20. webview综述

热门文章

  1. 洛谷 P3808 【模板】AC自动机(简单版)洛谷 P3796 【模板】AC自动机(加强版)
  2. Latex排版工具的使用(二) 分类: Latex 2014-06-14 23:01 389人阅读 评论(0) 收藏
  3. 随机L系统分形树 分类: 计算机图形学 2014-06-01 23:27 376人阅读 评论(0) 收藏
  4. 204 Count Primes 计数质数
  5. Snort里如何将读取的包记录存到指定的目录下(图文详解)
  6. 构建一个.net的干货类库,以便于快速的开发 - 验证码
  7. Android学习笔记(十) Activity的生命周期
  8. 让TortoiseGit记住帐号密码方法
  9. uoj #15. 【NOIP2014】生活大爆炸版石头剪刀布
  10. 洛谷 P1339 [USACO09OCT]热浪Heat Wave (堆优化dijkstra)