zoukankan      html  css  js  c++  java
  • Java入门:读写文本文件

    文本文件的读写是学习java必须掌握的一项基本技术,因为在项目中时常会涉及到文本文件的读写。

    一.使用FileWriter写文件

    1.FileWriter类

    【功能】

    FileWriter类专门用来写字符到文本文件中。

    【构造方法】

    1) public FileWriter(String fileName):此构造方法的参数是文件名。文件名可以是相对路径,也可以绝对路径。此构造方法构造的对象,往文件写数据时,会擦除文件内原始内容,从头开始写数据。

    2) public FileWriter(String fileName, boolean append):此构造方法要求两个参数,第一个单数fileName表示文件名,第二个参数append为true表示所写的新字符追加到文件原始内容之后,为fasle表示擦除文件的原始内容,从新开始写数据。

    另外三个构造方法分别是:

    3)FileWriter(File file):根据给定的 File 对象构造一个 FileWriter 对象。

    4)FileWriter(File file, boolean append):根据给定的 File 对象构造一个 FileWriter 对象。

    5)FileWriter(FileDescriptor fd):构造与某个文件描述符相关联的 FileWriter 对象。

    【注意】

    1)FileWriter类只能用来写字符流到文件中,如果要写原始字节到文件,需要使用FileOutputStream类。

    2)FileWriter类将字符串按照默认的字符编码格式进行编码写到文件,缓冲区也是默认大小。如果要指定编码方式和缓冲区大小,需要使用FileOutputStream类。

    3)文件是否可用或是否可以被创建取决于底层平台。特别是某些平台一次只允许一个 FileWriter(或其他文件写入对象)打开文件进行写入。在这种情况下,如果所涉及的文件已经打开,则此类中的构造方法将失败。

    2.使用FileWriter向文本文件中写数据

     1 import java.io.FileWriter;
     2 import java.io.IOException;
     3 
     4 public class AppMain {
     5     public static void main(String[] args) {
     6         writeTest1();
     7     }
     8 
     9     public static void writeTest1(){        
    10         try {
    11             FileWriter fw = new FileWriter("E:/test.txt");
    12             fw.write("Mike Mike@163.com");            
    13             fw.write("John John@163.com");            
    14             fw.close();
    15         } catch (IOException e) {
    16             e.printStackTrace();
    17         }
    18     }
    19 }

    第11句:创建一个FileWriter对象fw,此对象与文件“E: est.txt"关联。此构造方法创建的fw对象,写文件时会覆盖原有内容。如果要在原有文件上追加内容而不删除原有内容,应调用FileWriter的构造方法FileWriter(String fileName,boolean append),

    第12句:向文件中写入一个字符串“Mike Mike@163.com”

    第13句:向文件中写入一个字符串“John John@163.com”

    第14句:关闭fw对象。文件作为一种资源,打开后要关闭,否则会长期占据文件资源,会导致意料不到的问题。

    writeTest1()方法执行完毕后,打开E: est.txt文件,内容显示如下:

    可见,所有内容写到了同一行内。如果需要换行的话,请继续往下看。

    2.使用FileWriter向文件逐行写文本

     每次写一行,其实就是在行尾添加一个换行符。不同操作系统,换行符不一样。每行结尾是 回车+换行(CR+LF),即“ ”;Unix系统里,每行结尾只有 换行CR,即“ ”;Mac系统里,每行结尾是 回车CR 即' '。为了统一解决此问题,可以使用System.getProperty("line.separator")方法得到当前系统的换行符号。

     1 package com.ww.filedemo;
     2 
     3 import java.io.FileWriter;
     4 import java.io.IOException;
     5  6 
     7 public class AppMain {
     8     public static void main(String[] args) {
     9         writeTest1();
    10         writeTestByLine();
    11     }
    12 
    13     /**
    14      * 写文本到文件中
    15      */
    16     public static void writeTest1() {
    17         try {
    18             FileWriter fw = new FileWriter("E:/test1.txt");
    19             fw.write("Mike Mike@163.com");
    20             fw.write("John John@163.com");
    21             fw.close();
    22         } catch (IOException e) {
    23             e.printStackTrace();
    24         }
    25     }
    26 
    27     /**
    28      * 逐行写文本到文件中
    29      */
    30     public static void writeTestByLine() {
    31         // 方法一:获取系统的分行符号,在每次写入文本后,再写入一次分行符号
    32         String str = System.getProperty("line.separator");
    33         try {
    34             FileWriter fw = new FileWriter("E:/test2.txt");
    35             fw.write("Mike Mike@163.com");
    36             fw.write(str);//增加换行符
    37             fw.write("John John@163.com");
    38             fw.write(str);//增加换行符
    39             fw.write("Jane Jane@163.com");
    40             fw.close();
    41         } catch (IOException e) {
    42             e.printStackTrace();
    43         }
    44     }
    45 }

    二、使用BufferedWriter类写文本文件

    【功能】

    将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

    【主要方法】

    void write(char ch);//写入单个字符。
    void write(char []cbuf,int off,int len)//写入字符数据的某一部分。
    void write(String s,int off,int len)//写入字符串的某一部分。
    void newLine()//写入一个行分隔符。
    void flush();//刷新该流中的缓冲。将缓冲数据写到目的文件中去。
    void close();//关闭此流,再关闭前会先刷新他。

    【构造方法】

    1) public BufferedWriter(Writer out):创建一个默认缓冲区大小的字符输出流对象。参数out是一个输出流对象,如FileWriter对象。

    2)public BufferedWriter(Writer out, int sz) :创建一个指定缓冲区大小的字符输出流对象。参数out是一个输出流对象,如FileWriter对象。参数sz表示缓冲区大小,正整数。

    【例子】

     1      /**
     2      * 使用BufferWriter泪写文本文件
     3      */
     4     public static void bufferedWriterTest(){
     5         try{
     6             BufferedWriter bw = new BufferedWriter(new FileWriter("E:/test3.txt"));
     7             bw.write("第一行");
     8             bw.newLine();
     9             bw.write("第二行");
    10             bw.newLine();
    11             bw.write("第三行");
    12             bw.close();
    13         }catch(IOException e){
    14             e.printStackTrace();
    15         }
    16     }

    【注意】

    1)可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。

    2)该类提供了 newLine() 方法,它使用平台自己的行分隔符概念,此概念由系统属性 line.separator 定义。并非所有平台都使用新行符 (' ') 来终止各行。因此调用此方法来终止每个输出行要优于直接写入新行符。

    3)通常FileWriter 将其输出立即发送到底层字符或字节流,对于频繁输出内容的情况,会导致开销较高。这种情况下用 BufferedWriter 包装靠小较高的 FileWriters会提高性能。例如, PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out"))); 将缓冲 PrintWriter 对文件的输出。如果没有缓冲,则每次调用out. print() 方法会导致将字符转换为字节,然后立即写入到文件,而这是极其低效的。

     三.单字节读取文本

    java中很多关于文件读取的工作。
    操作也很平凡。
    所以java的文件读取是很重要的一部分。
    首先是单字节的读取工作。
    见源代码:

     1 package ReadFile;
     2 
     3 import java.io.FileReader;
     4 import java.io.IOException;
     5 
     6 public class readFile {
     7     public static void readfile(String file){
     8         try{
     9             FileReader fr = new FileReader(file);
    10             int ch = 0;
    11             while((ch=fr.read())!=-1){//fr.read()读取一个字节,判断此字节的值为-1表示读到文件末尾了。
    12                 System.out.println((char)ch);
    13             }
    14         }catch(IOException e){
    15             e.printStackTrace();
    16         }
    17     }
    18     public static void main(String[] args) {
    19         readfile("e:\dd.txt");
    20     }
    21 }

    四.逐行读文本

    如果要进行按行读取的话,必须采用BufferedReader  BufferedReader中的readline();

     1 package ReadLime;
     2  4 import java.io.BufferedWriter; 6 import java.io.FileWriter;
     7 import java.io.IOException;
     8 
     9 public class ReadLine {
    10     public static void readline(String file, String writerfile) {
    11         try {
    12             FileReader fr = new FileReader(file);
    13             BufferedReader br = new BufferedReader(fr);
    14             
    15             String str;
    16             17             while ((str = br.readLine()) != null) {19                 System.out.println(str);
    20             }
    21             
    22 23             br.close();
    24         } catch (IOException e) {
    25             e.printStackTrace();
    26         }
    27     }
    28 
    29     public static void main(String[] args) {
    30         readline("e:\dd.txt", "e:/aa.txt");
    31     }
    32 }

    五.文件读写异常处理

    在上述代码中,文件读写语句之外,都有try...catch...结构,这个结构叫做异常处理。异常时指程序运行时出现的超出程序正常执行流程的某些特殊情况。例如:FileReader fr = new FileReader(“E:/aa.txt”);如果E:aa.txt文件不存在,那么这句话就会导致出现一个文件不存在的异常。

    Java中,使用FileReader等文件操作类时,如果不处理异常,编译不会通过。

    这里我们先需要掌握try...catch的异常处理方法,其它更多异常处理的知识在以后再继续学习。

    使用try...catch的方式是将有可能出现异常的代码块放在try语句块里面,catch语句捕捉异常。

    以下写法都是错误的:

        public static void writeTestByLine() {
            // 方法一:获取系统的分行符号,在每次写入文本后,再写入一次分行符号
            String str = System.getProperty("line.separator");
            try {
                FileWriter fw = new FileWriter("E:/test.txt");            
            } catch (IOException e) {
                e.printStackTrace();
            }
            // 错误,fw对象的作用访问是try{ fw的作用范围 }
            fw.write("Mike Mike@163.com");
            fw.write(str);//增加换行符
            fw.write("John John@163.com");
            fw.write(str);//增加换行符
            fw.write("Jane Jane@163.com");
            fw.close();
        }
        public static void writeTestByLine() {
            // 方法一:获取系统的分行符号,在每次写入文本后,再写入一次分行符号
            String str = System.getProperty("line.separator");
            //错误:new FileWriter("E:/test.txt")有可能会引发异常,但没有包含在try内
            FileWriter fw = new FileWriter("E:/test.txt");
            try {
                
                fw.write("Mike Mike@163.com");
                fw.write(str);//增加换行符
                fw.write("John John@163.com");
                fw.write(str);//增加换行符
                fw.write("Jane Jane@163.com");
                fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        public static void writeTestByLine() {
            // 方法一:获取系统的分行符号,在每次写入文本后,再写入一次分行符号
            String str = System.getProperty("line.separator");        
            
            try {
                FileWriter fw = new FileWriter("E:/test.txt");
                fw.write("Mike Mike@163.com");
                fw.write(str);//增加换行符
                fw.write("John John@163.com");
                fw.write(str);//增加换行符
                fw.write("Jane Jane@163.com");
                
            }
            fw.close();//错误:不符合try...catch结构的语法规则
            catch (IOException e) {
                e.printStackTrace();
            }
        }
  • 相关阅读:
    mysql 清空数据
    centos 7 安装搜狗输入法
    【分布式】分布式事务解决方案
    【Spring】事务的实现方式
    【Maven】 (请使用 -source 8 或更高版本以启用 lambda 表达式)
    【Redis】DENIED Redis is running in protected mode
    【Shiro】调用doGetAuthenticationInfo进行认证成功之后,isAuthenticated是false的问题。
    【线程池】ExecutorService与quartz搭配出现的问题
    【jenkins】jenkins执行nohup java报错
    【MySQL】mac环境下使用navicat premium连接mysql乱码问题
  • 原文地址:https://www.cnblogs.com/bayes/p/5478862.html
Copyright © 2011-2022 走看看