Java-----读、写文件的几种方法

来源:互联网 发布:新人网络男主播技巧 编辑:程序博客网 时间:2024/05/16 18:50

Java中经常要读文件和写文件,之前总是看懂了过了几天后又忘记,故现在记录一下,比较之间的区别,加深印象。

读文件主要有以下的4种方法:

1、按字节读取文件内容
2、按字符读取文件内容
3、按行读取文件内容

4、随机读取文件内容

主要用到的类有:

InputStream  、FileInputStream、InputStreamReader、BufferedReader、RandomAccessFile

代码如下:

public class ReadFromFile {    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();            return;        }        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) {                }            }        }    }       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下,\r\n这两个字符在一起时,表示一个换行。                // 但如果这两个字符分开显示时,会换两次行。                // 因此,屏蔽掉\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) {                }            }        }    }       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 e1) {                }            }        }    }    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) {                }            }        }    }       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);    }}5、将内容追加到文件尾部public class AppendToFile {       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();        }    }       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);    }}



写文件主要用到的是以下的类:

FileWritter,BufferedWriter ,FileOutputStream

一,FileWritter写入文件
  FileWritter, 字符流写入字符到文件。默认情况下,它会使用新的内容取代所有现有的内容,然而,当指定一个true (布尔)值作为FileWritter构造函数的第二个参数,它会保留现有的内容,并追加新内容在文件的末尾。
  1. 替换所有现有的内容与新的内容。
  new FileWriter(file);

       2. 保留现有的内容和附加在该文件的末尾的新内容。
  代码如下
  new FileWriter(file,true);
  追加文件示例
  一个文本文件,命名为“javaio-appendfile.txt”,并包含以下内容。
  ABC Hello追加新内容 new FileWriter(file,true)
  代码如下

public class AppendToFileExample{  public static void main( String[] args ){     try{           String data = " This content will append to the end of the file";           File file =new File("javaio-appendfile.txt");           //if file doesnt exists, then create it           if(!file.exists()){                file.createNewFile();            }           //true = append file           FileWriter fileWritter = new FileWriter(file.getName(),true);           BufferedWriter bufferWritter = new BufferedWriter(fileWritter);           bufferWritter.write(data);           bufferWritter.close();           System.out.println("Done");     }catch(IOException e){          e.printStackTrace();     }  }}
结果,现在,文本文件“javaio-appendfile.txt”内容更新如下:
  ABC Hello This content will append to the end of the file

二,BufferedWriter写入文件
  缓冲字符(BufferedWriter )是一个字符流类来处理字符数据。不同于字节流(数据转换成字节),你可以直接写字符串,数组或字符数据保存到文件。
  代码如下

public class WriteToFileExample {  public static void main(String[] args) {      try {          String content = "This is the content to write into file";          File file = new File("/users/mkyong/filename.txt");         // if file doesnt exists, then create it         if (!file.exists()) {             file.createNewFile();         }         FileWriter fw = new FileWriter(file.getAbsoluteFile());         BufferedWriter bw = new BufferedWriter(fw);         bw.write(content);         bw.close();         System.out.println("Done");      } catch (IOException e) {           e.printStackTrace();      }  } }
三,FileOutputStream写入文件
  文件输出流是一种用于处理原始二进制数据的字节流类。为了将数据写入到文件中,必须将数据转换为字节,并保存到文件。请参阅下面的完整的例子。
  代码如下

public class WriteFileExample {  public static void main(String[] args) {      FileOutputStream fop = null;      File file;      String content = "This is the text content";      try {          file = new File("c:/newfile.txt");          fop = new FileOutputStream(file);         // if file doesnt exists, then create it         if (!file.exists()) {              file.createNewFile();         }         // get the content in bytes         byte[] contentInBytes = content.getBytes();         fop.write(contentInBytes);         fop.flush();         fop.close();         System.out.println("Done");     } catch (IOException e) {         e.printStackTrace();     } finally {         try {             if (fop != null) {                 fop.close();             }         } catch (IOException e) {               e.printStackTrace();         }     }  }}
 下面比较一下写文件的三种方法的速度快慢

(以下为转载)

代码如下

import java.io.File;   import java.io.FileOutputStream;   import java.io.*;   public class FileTest {       public FileTest() {       }       public static void main(String[] args) {           FileOutputStream out = null;           FileOutputStream outSTr = null;           BufferedOutputStream Buff=null;           FileWriter fw = null;           int count=1000;//写文件行数           try {               out = new FileOutputStream(new File(“C:/add.txt”));               long begin = System.currentTimeMillis();               for (int i = 0; i < count; i++) {                   out.write(“测试java 文件操作\r\n”.getBytes());               }               out.close();               long end = System.currentTimeMillis();               System.out.println(“FileOutputStream执行耗时:” + (end - begin) + ” 豪秒”);               outSTr = new FileOutputStream(new File(“C:/add0.txt”));                Buff=new BufferedOutputStream(outSTr);               long begin0 = System.currentTimeMillis();               for (int i = 0; i < count; i++) {                   Buff.write(“测试java 文件操作\r\n”.getBytes());               }               Buff.flush();               Buff.close();               long end0 = System.currentTimeMillis();               System.out.println(“BufferedOutputStream执行耗时:” + (end0 - begin0) + ” 豪秒”);               fw = new FileWriter(“C:/add2.txt”);               long begin3 = System.currentTimeMillis();               for (int i = 0; i < count; i++) {                   fw.write(“测试java 文件操作\r\n”);               }                           fw.close();               long end3 = System.currentTimeMillis();               System.out.println(“FileWriter执行耗时:” + (end3 - begin3) + ” 豪秒”);           } catch (Exception e) {               e.printStackTrace();           }           finally {               try {                   fw.close();                   Buff.close();                   outSTr.close();                   out.close();               } catch (Exception e) {                   e.printStackTrace();               }           }       }   }
以下结果经过多次执行,取常出现的数据,由于只是简单比较,不做详细统计。

    当count=1000的,即写文件1000行的时候,写出的文件大小为18.5KB:   

    FileOutputStream执行耗时:46 豪秒   
    BufferedOutputStream执行耗时:31 豪秒   
    FileWriter执行耗时:15 豪秒   
      
      
    2.当count=10000的,即写文件10000行的时候,写出的文件大小为185KB:   
    FileOutputStream执行耗时:188 豪秒   
    BufferedOutputStream执行耗时:32 豪秒   
    FileWriter执行耗时:16 豪秒   
      
        
      
    3.当count=100000的,即写文件100000行的时候,写出的文件大小为1856KB:   
    FileOutputStream执行耗时:1266 豪秒   
    BufferedOutputStream执行耗时:125 豪秒   
    FileWriter执行耗时:93 豪秒   
      
        
      
    4.当count=1000000的,即写文件1000000行的时候,写出的文件大小为18555KB:   
    FileOutputStream执行耗时:12063 豪秒   
    BufferedOutputStream执行耗时:1484 豪秒   
    FileWriter执行耗时:969 豪秒

(感觉这种测试方法并不准确,测试方法不独立,缓存因素或许有影响。)

0 0