一、思路
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"));
浙公网安备 33010602011771号