一、思路

  1、用字符流读出a和b中的文件,然后创建一个输出流用于输出到C文件中;

  2、a和b交替输出到c中。

 

二、编程

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;

public class MainClass{
    public static void main(String[] args) throws Exception{
        
        // 用字符流读取a和b文件内容。
        FileManager a = new FileManager("a.txt",new char[]{'\n'});
        FileManager b = new FileManager("b.txt",new char[]{'\n',' '});    
        
        // 创建字符输出流类对象和已存在的文件相关联。文件不存在的话,并创建。
        FileWriter c = new FileWriter("c.txt");
        
        String aWord = null;
        String bWord = null;
        
        while((aWord = a.nextWord()) !=null ){
            c.write(aWord + "\n");//写入字符串。
            bWord = b.nextWord();
            if(bWord != null)
                c.write(bWord + "\n");
        }
        
        // 当b的长度大于a的长度,继续写入b的内容
        while((bWord = b.nextWord()) != null){
            c.write(bWord + "\n");
        }    
        c.close();
    }
    
}


class FileManager{

    String[] words = null;
    int pos = 0;
    
    public FileManager(String filename,char[] seperators) throws Exception{
        
        // 表当前目录
        File f = new File(filename);
        
        //创建读取字符数据的流对象,读取路径不正确时会抛 IOException ,用以读取流对象关联一个已存在文件。
        FileReader reader = new FileReader(f);
        
        char[] buf = new char[(int)f.length()];
        
        //将字符读入数组。返回读取的字符数。如果已经到达尾部,则返回-1。
        int len = reader.read(buf);
        
        // new一个string对象,取值从0开始,长度为len,取的是buf数组的值。
        String results = new String(buf,0,len);
        String regex = null;
        
        if(seperators.length >1 ){
            regex = "" + seperators[0] + "|" + seperators[1];
        }else{
            regex = "" + seperators[0];
        }
        words = results.split(regex);
    }
    
    public String nextWord(){
        if(pos == words.length)
            return null;
        return words[pos++];
    }

}

 

三、java中的 FileWriter类 和 FileReader类的一些基本用法 

1、FileWriter类(字符输出流类)

  1.1 构造方法:

(1)FileWriter fw = new FileWriter(String fileName);//创建字符输出流类对象和已存在的文件相关联。文件不存在的话,并创建。

FileWriter fw = new FileWriter("C:\\demo.txt");

(2)FileWriter fw = new FileWriter(String fileName,boolean append);//创建字符输出流类对象和已存在的文件相关联,并设置该该流对文件的操作是否为续写。

FileWriter fw = new FileWriter("C:\\demo.txt",ture); //表示在fw对文件再次写入时,会在该文件的结尾续写,并不会覆盖掉。

  1.2 主要方法: 

  ① void write(String str) :写入字符串。当执行完此方法后,字符数据还并没有写入到目的文件中去,此时字符数据会保存在缓冲区中。此时在使用刷新方法就可以使数据保存到目的文件中去。

  ② viod flush() : 刷新该流中的缓冲。将缓冲区中的字符数据保存到目的文件中去。

  ③ viod close() :关闭此流。在关闭前会先刷新此流的缓冲区。在关闭后,再写入或者刷新的话,会抛IOException异常。

  例子1:  

import java.io.FileWriter;  
import java.io.IOException;  
  
public class Filewriter {  
  
    // 换行符,功能和"\n"是一致的,但是此种写法屏蔽了 Windows和Linux的区别。
    private static final String LINE_SEPARATOR = System.getProperty("line.separator"); 
    
    public static void main(String[] args) throws IOException {  
       
        /** 
         * 创建一个可以往文件中写入字符数据的字符流输出流对象 
         * 创建时必须明确文件的目的地 
         * 如果文件不存在,这回自动创建。如果文件存在,则会覆盖。 
         * 当路径错误时会抛异常 
         *  
         * 当在创建时加入true参数,会实现对文件的续写。 
         */  
        FileWriter fw = new FileWriter("C:\\demo1.txt",false);  
        
        //fw.write("hello \r\nworld!");//windows中的换行为\r\n    unix下为\r。  
        
        //调用该对象的write方法,向文件写入字符。其实写入到了临时存储缓冲区中 
        fw.write("aello"+LINE_SEPARATOR+"world!");  
        fw.write("nihaonihao");  
       
        // fw.flush();  //进行刷新,将字符写到目的地中。
       
        fw.close();       
  
    }  
}  

  例子2:FileWriter的的异常处理 

import java.io.FileWriter;  
import java.io.IOException;  
  
public class IOExceptionDemo {  
  
    private static final String LINE_SEPARATOR = System.getProperty("line.separator");  
    public static void main(String[] args) {  
  
        FileWriter fw = null;  
        try {  
            fw = new FileWriter("k:\\Demo.txt", true);  
            fw.write("hello" + LINE_SEPARATOR + "world!");  
        } catch (Exception e) {  
            System.out.println(e.toString());  
        } finally {  
            if (fw != null)  
                try {  
                    fw.close();  
                } catch (IOException e) {  
                    throw new RuntimeException("关闭失败!");  
                }  
        }  
    }  
}  

2、FileReader类

  2.1 构造方法

FileReader fr = new FileReader(String fileName);//使用带有指定文件的String参数的构造方法。创建该输入流对象。并关联源文件。  

FileReader fr = new FileReader("demo.txt"); 

2.2 主要方法

  ① int read(): 读取单个字符。返回作为整数读取的字符,如果已达到流末尾,则返回 -1。

  ② int read(char []cbuf):将字符读入数组。返回读取的字符数。如果已经到达尾部,则返回-1。

  ③ void close():关闭此流对象。释放与之关联的所有资源。

  例子:

import java.io.FileReader;  
import java.io.IOException;  
  
public class FileReaderDemo {  
  
    public static void main(String[] args) throws IOException {   
        // 创建读取字符数据的流对象。读取路径不正确时会抛 IOException,用以单个读取流对象关联一个已存在文件。
        FileReader fr = new FileReader("demo.txt");  
       
        // 用Reader中的read方法读取字符。返回作为整数读取的字符,如果已达到流末尾,则返回 -1
        int ch = 0;  
        while((ch = fr.read()) != -1){  
            System.out.print((char)ch);  
        }  
        fr.close();  
   }  
}  

  例子:用FileReader  和 FileWriter 写的复制文本文件,将C:\\的my.txt copy 到 D:\\you.txt下。

import java.io.FileNotFoundException;  
import java.io.FileReader;  
import java.io.FileWriter;  
import java.io.IOException;  
  
public class TxtCopy {  
    public static void main(String[] args) {  
        
        FileReader fr = null;  
        FileWriter fw = null;  
        
        try{  
            // 首先创建Reader读取数据数据的 读取流对象。
            fr = new FileReader("C:\\my.txt");  
            fw = new FileWriter("D:\\you.txt");  
 
            char []buf = new char[1024];  
            int len = 0; 
            
            //读一个数组大小,写一个数组大小方法。  
            while((len = fr.read(buf)) != -1){  
                fw.write(buf, 0, len); //一次最多写入的字节数不超过1024               
            }               
        }catch (Exception e) {  
            System.out.println(e.toString());  
        }finally {          
            if (fr != null)  
                try {  
                    fr.close();  
                } catch (Exception e2) {  
                    throw new RuntimeException("关闭失败!");  
                }  
            if (fw != null)  
                try {  
                    fw.close();  
                } catch (IOException e) {  
                    throw new RuntimeException("关闭失败!");  
                }  
        }  
    }  
}

 

四、关于System.getProperty()方法详解

// java版本号
System.out.println("java版本号:" + System.getProperty("java.version")); 
// Java提供商名称
System.out.println("Java提供商名称:" + System.getProperty("java.vendor")); 
// Java提供商网站
System.out.println("Java提供商网站:" + System.getProperty("java.vendor.url")); 
// Java,哦,应该是jre目录
System.out.println("jre目录:" + System.getProperty("java.home")); 
// Java虚拟机规范版本号
System.out.println("JVM规范版本号:" +System.getProperty("java.vm.specification.version")); 
// Java虚拟机规范提供商
System.out.println("JVM规范提供商:" + System.getProperty("java.vm.specification.vendor")); 
// Java虚拟机规范名称
System.out.println("JVM规范名称:" + System.getProperty("java.vm.specification.name")); 
// Java虚拟机版本号
System.out.println("JVM版本号:" + System.getProperty("java.vm.version"));
// Java虚拟机提供商
System.out.println("JVM提供商:" + System.getProperty("java.vm.vendor")); 
// Java虚拟机名称
System.out.println("JVM名称:" + System.getProperty("java.vm.name")); 
// Java规范版本号
System.out.println("Java规范版本号:" + System.getProperty("java.specification.version")); 
// Java规范提供商
System.out.println("Java规范提供商:" + System.getProperty("java.specification.vendor")); 
// Java规范名称
System.out.println("Java规范名称:" + System.getProperty("java.specification.name")); 
// Java类版本号
System.out.println("Java类版本号:" + System.getProperty("java.class.version")); 
// Java类路径
System.out.println("Java类路径:" + System.getProperty("java.class.path")); 
// Java lib路径
System.out.println("Java lib路径:" + System.getProperty("java.library.path")); 
// Java输入输出临时路径
System.out.println("Java输入输出临时路径:" + System.getProperty("java.io.tmpdir")); 
// Java编译器
System.out.println("Java编译器:" + System.getProperty("java.compiler")); 
// Java执行路径
System.out.println("Java执行路径:" + System.getProperty("java.ext.dirs"));
// 操作系统名称
System.out.println("操作系统名称:" + System.getProperty("os.name")); 
// 操作系统的架构
System.out.println("操作系统的架构:" + System.getProperty("os.arch")); 
// 操作系统版本号
System.out.println("操作系统版本号:" + System.getProperty("os.version")); 
// 文件分隔符
System.out.println("文件分隔符:" + System.getProperty("file.separator")); 
// 路径分隔符
System.out.println("路径分隔符:" + System.getProperty("path.separator")); 
// 直线分隔符
System.out.println("直线分隔符:" + System.getProperty("line.separator")); 
// 用户名
System.out.println("操作系统用户名:" + System.getProperty("user.name")); 
// 用户的主目录
System.out.println("操作系统用户的主目录:" + System.getProperty("user.home")); 
// 当前程序所在目录
System.out.println("当前程序所在目录:" + System.getProperty("user.dir")); 

 

posted on 2020-05-11 14:06  小潘同学  阅读(1272)  评论(0)    收藏  举报
-->