【黑马程序员】黑马入学准备篇:IO输入与输出 【上】

来源:互联网 发布:腾讯手游助手mac 编辑:程序博客网 时间:2024/06/15 10:15

------- android培训、java培训、期待与您交流! ----------

1、FileWriter

package com.itheima.io;import java.io.FileWriter;import java.io.IOException;/** * 字符流和字节流: *  * 字节流两个基类: InputStream OutputStream *  * 字符流两个基类: Reader Writer *  * 字符流的特点。 *  * 以操作文件为主演示: 需求:在硬盘上,创建一个文件并写入一些文字数据 * 找到一个专门用于操作文件的Writer子类对象。FileWrite。后缀名是父类名。前缀名是该流对象的功能。 *  * @author StephenHu *  */public class FileWriterDemo {/** * @param args * @throws IOException */public static void main(String[] args) throws IOException {// 创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件// 而且该文件会被创建到指定目录下。并覆盖同名文件// 该步骤就是明确数据要存放的目的地FileWriter fw = new FileWriter("D:\\javaDemo\\test.txt");// 调用write方法,将字符串写入到流中。fw.write("hahahahah");// 刷新流对象中缓冲的数据// 将数据刷到目的文件中fw.flush();fw.write("wwwwwww");fw.flush();fw.write("333hahahahah");// 关闭流资源,但关闭前会flush一次fw.close();// IO异常处理FileWriter fw1 = null;try {fw1 = new FileWriter("h:\\javaDemo\\test1.txt");fw1.write("hhhhhhhh");} catch (IOException e) {System.out.println("catch1:" + e.toString());} finally {try {if (fw1 != null) {fw1.close();}} catch (IOException e) {System.out.println("catch2:" + e.toString());}}/* * 对已有文件的续写 */FileWriter fw2 = null;try {// 传递一个true参数,代表不覆盖已有的文件fw2 = new FileWriter("D:\\javaDemo\\test.txt", true);fw2.write("\n\r\n\rwwwww");} catch (IOException e) {System.out.println("catch1:" + e.toString());} finally {try {if (fw2 != null) {fw2.close();}} catch (IOException e) {System.out.println("catch2:" + e.toString());}}}}



2、FileReader

package com.itheima.io;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;public class FileReaderDemo {public static void main(String[] args) throws IOException {// 创建一个文件读取流对象,和指定名称的文件相关联// 要保证该文件是已经存在的,如果不存在,会发生异常FileNotFoundExceptionFileReader fr = new FileReader("D:\\javaDemo\\test.txt");// 调用读取流对象的read方法// read方法一次读一个字符,而且自动继续往下读int ch = 0;String str = "";while ((ch = fr.read()) != -1) {str += (char) ch;}p(str);fr.close();// 定义一个字符数组,用于存储独到的字符// 改read(char[])返回的是独到的字符个数FileReader fr1 = new FileReader("D:\\javaDemo\\test.txt");char[] buf = new char[1024];int num = 0;while ((num = fr1.read(buf)) != -1) {p(new String(buf, 0, num));}fr1.close();// 读取一个.java文件,并打印在控制台上FileReader fr2 = new FileReader("D:\\javaWorkspace\\Practices\\src\\com\\itheima\\io\\DateDemo.java");char[] buf1 = new char[1024];int num1 = 0;while ((num1 = fr2.read(buf1)) != -1) {System.out.print(new String(buf1, 0, num1));}fr2.close();}private static void p(Object o) {System.out.println(o);}}


3、文件拷贝

package com.itheima.io;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class CopyTextDemo {/** * 将C盘一个文本文件复制带D盘 *  * 复制原理: 其实就是讲C盘下的文件数据储存到D盘的一个文件中 *  *  * 1、在D盘创建一个文件,用于储存C盘文件中的数据 2、定义读取流和C盘文件关联 3、通过不断的读写完成数据存储 *  * @throws IOException *  */public static void main(String[] args) throws IOException {// TODO Auto-generated method stub// copy_1();copy_2();}public static void copy_1() throws IOException {// 创建目的地FileWriter fw = new FileWriter("D:\\javaDemo\\testTo.txt");// 与已有文件关联FileReader fr = new FileReader("D:\\javaDemo\\testFrom.txt");int ch = 0;while ((ch = fr.read()) != -1) {fw.write(ch);}fw.close();fr.close();}public static void copy_2() {FileWriter fw = null;FileReader fr = null;try {fw = new FileWriter("D:\\javaDemo\\testCopyTo.txt");fr = new FileReader("D:\\javaDemo\\test.txt");char[] buf = new char[1024];int len = 0;while ((len = fr.read(buf)) != -1) {fw.write(buf, 0, len);}} catch (IOException e) {// TODO: handle exceptionthrow new RuntimeException("读写失败");} finally {if (fr != null && fw != null) {try {fw.close();fr.close();} catch (IOException e) {e.printStackTrace();}}}}}<strong></strong>

======明天继续======晚安~



==========================


4、问了提高效率,利用缓冲区写文件

package com.itheima.io;import java.io.BufferedWriter;import java.io.FileWriter;import java.io.IOException;public class BufferedWriterDemo_2_1 {/** * 缓冲区的出现是为了提高流的操作效率而出现的 所以创建缓冲区之前,必须先有流对象 */public static void main(String[] args) {// 创建一个字符写入流对象FileWriter fw = null;BufferedWriter bw = null;try {fw = new FileWriter(".\\testData\\buf.txt");// 为了提高字符写入流效率,加入了缓冲技术// 使用方法:讲需要提高效率的流对象作为参数传递给缓冲区的构造函数bw = new BufferedWriter(fw);for (int i = 0; i < 5; i++) {bw.write("hhhhhhhh" + i);bw.newLine();bw.flush();}} catch (IOException e) {throw new RuntimeException("读写失败!");} finally {// 关闭了缓冲区,就是关闭了缓冲区中的流对象,因为是缓冲区在读取数据try {if (bw != null)bw.close();} catch (IOException e) {throw new RuntimeException("关闭失败!");}}}}<strong></strong>

5、利用缓冲区读文件

package com.itheima.io;import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;public class BufferedReaderDemo_2_2 {/** * 字符读取流缓冲区 * 改缓冲区提供了一个一次读一行的方法readline(),方便于对文本数据的获取 *  */public static void main(String[] args) {// 创建读取流对象和文件关联FileReader fr = null;BufferedReader br = null;try {fr = new FileReader(".\\testData\\buf.txt");// 用缓冲区读取提高效率br = new BufferedReader(fr);String line="";while((line=br.readLine())!=null){System.out.println(line);}} catch (IOException e) {throw new RuntimeException("读写失败!");} finally {try {if (br != null)br.close();} catch (IOException e) {throw new RuntimeException("关闭失败!");}}}}

6、利用缓冲区完成文本文件拷贝功能


package com.itheima.io;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class CopyTextByBuf_2_3 {/** * 利用缓冲区复制文本文件 */public static void main(String[] args) {BufferedReader br = null;BufferedWriter bw = null;FileReader fr = null;FileWriter fw = null;try {fr = new FileReader(".\\testData\\buf.txt");br = new BufferedReader(fr);fw = new FileWriter(".\\testData\\buf_copy.txt");bw = new BufferedWriter(fw);String line = "";while ((line = br.readLine()) != null) {bw.write(line);//readline()不读取换行符bw.newLine();//bw.flush();}} catch (IOException e) {throw new RuntimeException("读写失败!");} finally {try {if (bw != null)bw.close();if (br != null)br.close();} catch (IOException e) {throw new RuntimeException("关闭失败!");}}}}


7、了解原理,编写自己的缓冲区方法


package com.itheima.io;import java.io.FileReader;import java.io.IOException;/** * 装饰者设计模式:当想要对已有的对象进行功能增强时,可以定义 类,将已有对象传入,基于已有功能,并提供加强功能 *  * @author StephenHu *  */public class MyBufferedReader_2_4 {public static void main(String[] args) {FileReader fr = null;MyBufferedReader mbr = null;try {fr = new FileReader(".\\testData\\buf.txt");mbr = new MyBufferedReader(fr);String line = "";while ((line = mbr.myReadLine()) != null) {System.out.println(line);}} catch (IOException e) {throw new RuntimeException("读写失败!");} finally {try {if (mbr != null)mbr.close();} catch (IOException e) {e.printStackTrace();}}}}class MyBufferedReader {/** * 自己写一个类似BufferedReader功能的方法 */private FileReader fr;MyBufferedReader(FileReader fr) {this.fr = fr;}// 类似readline()方法public String myReadLine() throws IOException {StringBuilder sb = new StringBuilder();int ch = 0;while ((ch = fr.read()) != -1) {if (ch == '\r') {continue;} else if (ch == '\n') {return sb.toString();} else {sb.append((char) ch);}}if (sb.length() != 0)return sb.toString();return null;}public void close() throws IOException {fr.close();}}

======今天没什么精神,就这么点T_T==============

明天加油↖(^ω^)↗===============


今天又来了


8、从自己编写的缓冲区方法浅谈装饰者模式,以及他和集成的区别


package com.itheima.io;/** * 装饰者设计模式:当想要对已有的对象进行功能增强时, *  * 可以定义类,将已有对象传入,基于已有功能,并提供加强功能 *  *  * 装饰类通常会通过构造方法接收被装饰的对象。 *  * 并基于被装饰的对象的功能,提供更强大的功能。 */ /** 装饰和继承的区别* MyReader专门用于读取数据的类* |--MyTextReader* |--MyBufferTextReader* |--MyMediaReader*|--MyBufferMediaReader*|--MyDataReader*|--MyBufferDataReader**class MyBufferReader{*MyBufferReader(MyTextBufferReader text)*{}*MyBufferReader(MyMediaBufferReader media)*{}*MyBufferReader(MyDataBufferReader media)*{}*}*上面这个类拓展性很差。*找到其参数的共同类型。通过多种形式。可以提高拓展性*class MyBufferReader extends MyReader{*private MyReader r;*MyBufferReader(MyReader r)*{}*}*继而产生装饰设计模式* MyReader专门用于读取数据的类*|--MyTextReader*|--MyMediaReader*|--MyDataReader*|--MyBufferReader*装饰模式比继承要灵活。避免了继承体系的臃肿。*而且降低了类与类之间的关系**装饰类因为增强了已有对象,具备的功能和已有的是相同的*所以装饰类和被装饰类通常是属于一个体系中 */class Person {public void chifan() {System.out.println("吃饭");}}class SuperPerson {private Person p;public SuperPerson(Person p) {this.p = p;}public void superChifan() {System.out.println("开胃酒");p.chifan();System.out.println("甜点");System.out.println("来一根");}}public class Decorator_Person_3_1 {public static void main(String[] args) {Person p = new Person();//p.chifan();SuperPerson sp = new SuperPerson(p);sp.superChifan();}}

9、编写自己的LineNumberReader,并用继承来简化


package com.itheima.io;import java.io.FileReader;import java.io.IOException;import java.io.Reader;/*class MyLineNumberReader {private Reader r;private int lineNumber;public int getLineNumber() {return lineNumber;}public void setLineNumber(int lineNumber) {this.lineNumber = lineNumber;}public MyLineNumberReader(Reader r) {this.r = r;}public String myReaderLine() throws IOException {lineNumber++;StringBuilder sb = new StringBuilder();int ch = 0;while ((ch = r.read()) != -1) {if (ch == '\r')continue;else if (ch == '\n') {return sb.toString();} else {sb.append((char) ch);}}if (sb.length() != 0) {return sb.toString();}return null;}public void myClose() throws IOException {r.close();}}*///利用继承来简化class MyLineNumberReader extends MyBufferedReader{private int lineNumber;public int getLineNumber() {return lineNumber;}public void setLineNumber(int lineNumber) {this.lineNumber = lineNumber;}public MyLineNumberReader(Reader r) {super(r);}public String myReaderLine() throws IOException {lineNumber++;return super.myReadLine();}}public class MyLineNumberReaderDemo_3_2 {public static void main(String[] args) {FileReader fr = null;MyLineNumberReader mln = null;try {fr = new FileReader(".\\testData\\buf.txt");mln = new MyLineNumberReader(fr);String line = "";mln.setLineNumber(100);while ((line = mln.myReaderLine()) != null) {System.out.println(mln.getLineNumber()+">>"+line);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}


先到此为止吧,下篇我们再来谈字节的读写操作




0 0
原创粉丝点击