黑马程序员——Java基础--IO(四)

来源:互联网 发布:vb循环语句实例for 编辑:程序博客网 时间:2024/05/21 11:19

-----------android培训java培训、java学习型技术博客、期待与您交流!------------

第四讲 最后总结
一、转换流的简化写法
        我们接着上次的总结,转换流的名字比较长,而我们常见的操作都是按照本地默认编码实现的,所以,为了简化我们的书写,转换流提供了对应的子类。
1、FileWriter
        FileWriter 写入文本文件的便捷类,继承 OutputStreamWriter  继承 Writer,FileWriter 只能查询编码表GBK。
构造方法:  传递File对象,传递String文件名,写的方法,使用的都是他的父类方法,可以是单个字符,字符数组,字符串,最后调用flush()。
package cn.itheima.FileWriter;import java.io.FileWriter;import java.io.IOException;/* * FileWriter 写入文本文件的便捷类 *   继承 OutputStreamWriter  继承 Writer * FileWriter 只能查询编码表GBK *   构造方法   *     传递File对象 *     传递String文件名 *  写的方法,使用的都是他的父类方法 */public class FileWriterDemo {public static void main(String[] args) throws IOException {//创建FileWriter对象FileWriter fw = new FileWriter("d:\\a.txt");//写字符串fw.write("abcde");fw.flush();//写单个字符fw.write(97);fw.flush();//写字符数组char[] ch = "\r\n我们都是好孩子".toCharArray();fw.write(ch, 0, ch.length);fw.flush();fw.close();}}

2、FileReader
构造方法:传递File,String文件名,读取的方法,单个字符,字符数组。
package cn.itheima.FileReader;import java.io.FileReader;import java.io.IOException;/* * FileReader 读取文本文件便捷类 *   继承 InputStreamReader 继承 Reader *   查询本机默认编码表GBK *  * 构造方法 *   传递 File对象 *   传递String文件名 *    */public class FileReaderDemo {public static void main(String[] args) throws IOException {//创建字符输入流对象,封装文件FileReader fr = new FileReader("d:\\a.txt");//读取单个字符int len = 0;while((len=fr.read())!=-1){System.out.print((char)len);}//读取字符数组char[] ch = new char[1024];while((len=fr.read(ch))!=-1){System.out.println(new String(ch, 0, len));}fr.close();}}

3、FileWriter和FileReader实现文本文件的复制
package cn.itheima.copy;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;/* * 案例 便捷类复制文本 * FileWriter |-- 构造方法,传递File,String文件名 |-- 写的方法,单个字符,字符数组,字符串 |-- flush FileReader |-- 构造方法,传递File,String文件名 |-- 读取的方法,单个字符,字符数组 */public class CopyBianJieDemo {public static void main(String[] args) {//method();method_1();}/* * 字符数组 */public static void method_1() {// 创建FileReader对象,封装文件,不要newFileReader fr = null;// 创建FileWriter对象,不要newFileWriter fw = null;try {fr = new FileReader("d:\\a.txt");fw = new FileWriter("e:\\a.txt");// 定义一个字符数组char[] ch = new char[1024];int len = 0;while ((len = fr.read(ch)) != -1) {fw.write(ch, 0, len);fw.flush();}} catch (IOException ex) {throw new RuntimeException("文本文件复制失败");} finally {try {if (fr != null) {fr.close();}} catch (IOException ex) {throw new RuntimeException("释放资源失败");} finally {try {if (fw != null) {fw.close();}} catch (IOException ex) {throw new RuntimeException("释放资源失败");}}}}/* * 单个字符 */public static void method() {// 创建FileReader对象,封装文件,不要newFileReader fr = null;// 创建FileWriter对象,封装文件,不要newFileWriter fw = null;try {fr = new FileReader("d:\\a.txt");fw = new FileWriter("e:\\a.txt");// 单个字符int len = 0;while ((len = fr.read()) != -1) {fw.write(len);fw.flush();}} catch (IOException ex) {throw new RuntimeException("文本文件复制失败");} finally {try {if (fr != null) {fr.close();}} catch (IOException ex) {throw new RuntimeException("释放资源失败");} finally {try {if (fw != null) {fw.close();}} catch (IOException ex) {throw new RuntimeException("释放资源失败");}}}}}

二、字符缓冲流
1、BufferedWriter
字符输出流的缓冲区对象,提高字符输出流的写入效率,BufferedWriter 继承 Writer。
构造方法:
    BufferedWriter(Writer w)
    传递任意字符输出流   Writer子类对象
    OutputStreamWriter  FileWriter
    new BufferedWriter(new FileWriter)
    new BufferedWriter(new OutputStreamWriter)
缓冲区对象自己特有功能:
    void newLine() 写入换行符
    \r\n 文本换行
   方法newLine()写入换行与平台无关 ,不理会操作系统
   Windows  \r\n
   Linux     \n
   安装的JVM是Windows版本 newLine写的就是\r\n
   安装 的JVM是Linux版本    newLine写的就是\n
   \r 回车符  13
   \n 换行符  10
package cn.itheima.bufferedwrite;import java.io.BufferedWriter;import java.io.FileWriter;import java.io.IOException;/* * 字符输出流的缓冲区对象,提高字符输出流的写入效率 *   BufferedWriter 继承 Writer *   构造方法 *    BufferedWriter(Writer w) *    传递任意字符输出流   Writer子类对象 *    OutputStreamWriter  FileWriter *  new BufferedWriter(new FileWriter) *  new BufferedWriter(new OutputStreamWriter) *  缓冲区对象自己特有功能 *     void newLine() 写入换行符 */public class BufferedWriterDemo {public static void main(String[] args) {method();}public static void method() {// 创建BufferedWriter对象,不要newBufferedWriter bw = null;try {bw = new BufferedWriter(new FileWriter("d:\\a.txt"));// 写入字符串bw.write("abcde");bw.newLine();bw.flush();bw.write("第二行");bw.flush();} catch (IOException ex) {throw new RuntimeException("文本文件复制失败");} finally {try {if (bw != null) {bw.close();}} catch (IOException ex) {throw new RuntimeException("释放资源失败");}}}}


2、BufferedReader
    字符输入流的缓冲区对象 BufferedReader,继承Reader 字符输入流  读取字符,字符数组 ,读取行。
构造方法:
    BufferedReader(Reader r)传递的任意字符输入流对象,传递的是谁,我就对谁高效
    InputStreamReader  FileReader
    new BufferedReader(new FileReader)
    new BufferedReader(new InputStreamReader)
    BufferedReader特殊方法:
        String readLine()        读取文本行  readLine 返回字符串
package cn.itheima.bufferedreader;import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;/* *  字符输入流的缓冲区对象 BufferedReader *    继承Reader 字符输入流  读取字符,字符数组 ,读取行 *   *  构造方法 *    BufferedReader(Reader r) *    传递的任意字符输入流对象,传递的是谁,我就对谁高效 *    InputStreamReader  FileReader *   *  new BufferedReader(new FileReader) *  new BufferedReader(new InputStreamReader) *   *     读取文本一行 *     String newLine() 返回文本一行,没有换行符\r\n */public class BufferedReaderDemo {public static void main(String[] args) {method();}public static void method(){//创建BufferedReader对象,读取文件,不要newBufferedReader br = null;try {br = new BufferedReader(new FileReader("d:\\a.txt"));//读取文本行  readLine 返回字符串//br.readLine();String line = null;//readLine方法读取文件结尾返回nullwhile((line=br.readLine())!=null){System.out.println(line);}} catch (IOException ex) {throw new RuntimeException("文本文件复制失败"); }finally{try {if (br!=null); {br.close();}} catch (IOException ex) {throw new RuntimeException("释放资源失败");}}}}

3、字符缓冲流特殊功能复制文本文件
package cn.itheima.copy;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;/* *  字符流缓冲区对象,文本复制 *    读一行,写一个,写换行 *  BufferedReader+FileReader 读取文本一行 *  BufferedWriter+FileWriter  写文本换行 */public class CopyBufferedLine {public static void main(String[] args) {method();}public static void method() {// 创建BufferedReader对象,读取数据源,不要newBufferedReader br = null;// 创建BufferedWriter对象,写入数据目的,不要newBufferedWriter bw = null;try {br = new BufferedReader(new FileReader("d:\\a.txt"));bw = new BufferedWriter(new FileWriter("e:\\a.txt"));String line = null;while ((line = br.readLine()) != null) {bw.write(line);bw.newLine();bw.flush();}} catch (IOException ex) {throw new RuntimeException("文本文件复制失败");} finally {try {if (br != null) {br.close();}} catch (IOException ex) {throw new RuntimeException("释放资源失败");} finally {try {if (bw != null) {bw.close();}} catch (IOException ex) {throw new RuntimeException("释放资源失败");}}}}}

三、IO流练习
1、复制文本文件
package cn.itheima.test;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;/* * 复制文本文件 * 利用字节流缓冲区来读写字节数组,提高效率 */public class Test {public static void main(String[] args) {//获取系统当前时间long a = System.currentTimeMillis();copy();//获取系统当前时间long b = System.currentTimeMillis();System.out.println("复制时间为:"+(b-a)+"毫秒");}public static void copy() {// 创建BufferedInputStream对象,读取数据源,不要newBufferedInputStream bis = null;// 创建BufferedOutputStream对象,写入数据目的,不要newBufferedOutputStream bos = null;try {bis = new BufferedInputStream(new FileInputStream("d:\\a.txt"));bos = new BufferedOutputStream(new FileOutputStream("e:\\a.txt"));// 定义一个字节数组int len = 0;byte[] bytes = new byte[1024];while ((len = bis.read(bytes)) != -1) {bos.write(bytes, 0, len);}} catch (IOException ex) {throw new RuntimeException("文本文件复制失败");} finally {try {if (bis != null) {bis.close();}} catch (IOException ex) {throw new RuntimeException("释放资源失败");} finally {try {if (bos != null) {bos.close();}} catch (IOException ex) {throw new RuntimeException("释放资源失败");}}}}}


2、复制图片
package cn.itheima.test;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;/* * 复制图片 * 利用BufferedInputStream读取数据, * 利用BufferedOutputStream写入数据目的 */public class Test1 {public static void main(String[] args) {//获取系统当前时间long a = System.currentTimeMillis();copyPicture();//获取系统当前时间long b = System.currentTimeMillis();System.out.println("复制时间为:"+(b-a)+"毫秒");}public static void copyPicture(){//创建BufferedInputStream 对象,读取数据源,不要newBufferedInputStream bis = null;//创建BufferedOutputStream对象,写入数据目的,不要newBufferedOutputStream bos = null;try {bis = new BufferedInputStream(new FileInputStream("d:\\a.bmp"));bos = new BufferedOutputStream(new FileOutputStream("e:\\a.bmp"));//定义一个字节数组byte[] bytes = new byte[1024];int len = 0;while((len=bis.read(bytes))!=-1){bos.write(bytes, 0, len);}} catch (IOException ex) {throw new RuntimeException("文本文件复制失败");} finally {try {if (bis != null) {bis.close();}} catch (IOException ex) {throw new RuntimeException("释放资源失败");} finally {try {if (bos != null) {bos.close();}} catch (IOException ex) {throw new RuntimeException("释放资源失败");}}}}}

3、把ArrayList集合中的字符串数据存储到文本文件
package cn.itheima.test;import java.io.BufferedWriter;import java.io.FileWriter;import java.io.IOException;import java.util.ArrayList;/* * 把ArrayList集合中的字符串数据存储到文本文件 * 分析: * 1、创建一个ArrayList集合对象 *  2、添加元素 *  3、创建BufferedWriter对象,写入数据目的 *  4、遍历集合并写入文本文件中 */public class ArrayListTest {public static void main(String[] args) {// 创建ArrayList对象ArrayList<String> array = new ArrayList<String>();// 添加元素array.add("abc1");array.add("abc2");array.add("abc3");method(array);}public static void method(ArrayList<String> array) {// 创建BufferedWriter对象,写入数据目的,不要newBufferedWriter bw = null;try {bw = new BufferedWriter(new FileWriter("d:\\b.txt"));//遍历集合,遍历一个字符串,写入文本文件for (String s : array) {bw.write(s);bw.newLine();bw.flush();}} catch (IOException ex) {throw new RuntimeException("文本文件写入失败");} finally {try {if (bw != null) {bw.close();}} catch (IOException ex) {throw new RuntimeException("释放资源失败");}}}}

4、从文本文件中读取数据(每一行为一个字符串数据)到集合中,并遍历集合
package cn.itheima.test;import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;import java.util.Iterator;/* * 从文本文件中读取数据(每一行为一个字符串数据)到集合中,并遍历集合 * 分析: * 1、创建BufferedReader对象,读取数据源 * 2、定义一个集合 * 3、每读取一行添加到集合中 * 4、遍历集合 */public class Test2 {public static void main(String[] args) {// 创建BufferedReader对象,读取数据源。不要newBufferedReader br = null;// 定义一个集合ArrayList<String> arrayList = new ArrayList<String>();try {br = new BufferedReader(new FileReader("d:\\b.txt"));String line = null;while ((line = br.readLine()) != null) {arrayList.add(line);}// 迭代器遍历/*Iterator<String> it = arrayList.iterator();while (it.hasNext()) {System.out.println(it.next());}*///增强forfor (String s : arrayList) {System.out.println(s);}} catch (IOException ex) {throw new RuntimeException("文本文件写入失败");} finally {try {if (br != null) {br.close();}} catch (IOException ex) {throw new RuntimeException("释放资源失败");}}}}

5、复制单级文件夹
package cn.itheima.test;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;/* * 复制单级文件夹 * 分析: * 1、在数据目的,创建和源一样的文件夹名字 * 2、遍历数据源目录获取所有的文件 * 3、获取数据源文件名组合成数据目的文件名 * 4、字节流读写文件 */public class CopyDemo {public static void main(String[] args) {method(new File("d:\\abc"), new File("e:"));}// 定义一个方法,复制文件夹,接收File数据源,File数据目的public static void method(File source, File target) {// 获取数据源文件夹名String name = source.getName();// 创建File对象,父路径参数为target,子路径字符串文件夹名File file = new File(target, name);// 创建文件夹file.mkdirs();// 遍历源文件夹File[] listFiles = source.listFiles();for (File file2 : listFiles) {// 获取数据源文件名字String name2 = file2.getName();// 创建文件名,数据目的File file3 = new File(file, name2);// 调用方法复制文件copy(file2, file3);}}// 定义方法,完成字节数组流的复制public static void copy(File source, File target) {// 创建字节流对象FileInputStream fis = null;FileOutputStream fos = null;try {fis = new FileInputStream(source);fos = new FileOutputStream(target);// 定义一个字节数组byte[] bytes = new byte[1024];int len = 0;while ((len = fis.read(bytes)) != -1) {fos.write(bytes, 0, len);}} catch (IOException ex) {throw new RuntimeException("目录复制失败");} finally {try {if (fos != null)fos.close();} catch (IOException ex) {throw new RuntimeException("关闭资源失败");} finally {try {if (fis != null)fis.close();} catch (IOException ex) {throw new RuntimeException("关闭资源失败");}}}}}

6、复制单级文件夹中指定文件并修改文件名称
package cn.itheima.test;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;/* * 复制单级文件夹中指定文件并修改文件名称 */public class CopyDemo2_1 {public static void main(String[] args) {File source = new File("d:\\abc");File target = new File("e:");method(source, target);}//定义一个方法,复制文件及文件夹public static void method(File source,File target){//获取文件夹名String sourceName = source.getName();//创建File对象,父路径为target,子路径为sourceNameFile targetDir = new File(target, sourceName);//创建文件夹targetDir.mkdirs();//获取文件夹下的所有文件File[] files = source.listFiles();//遍历所有文件for (File file : files) {//获取所有文件名String ziName = file.getName();//创建File对象,fu路径为targetDir,zi路径名为ziNameFile file2 = new File(targetDir, ziName);//复制所有文件copy(file,file2);}//复制完成后,修改复制过后的文件夹下的所有文件rename(targetDir);}//定义一个方法,完成重命名功能public static void rename(File targetDir){//获取数据目的下的所有文件File[] files = targetDir.listFiles();//遍历所有文件for (File file : files) {//获取所有文件名String fileName = file.getName();int lastIndexOf = fileName.lastIndexOf(".");fileName = fileName.substring(0, lastIndexOf);fileName = fileName+".java";File file2 = new File(targetDir, fileName);file.renameTo(file2);}}public static void copy(File source, File target) {FileInputStream fis = null;FileOutputStream fos = null;try {fis = new FileInputStream(source);fos = new FileOutputStream(target);byte[] bytes = new byte[1024];int len = 0;while ((len = fis.read(bytes)) != -1) {fos.write(bytes, 0, len);}} catch (IOException ex) {throw new RuntimeException("文本文件复制失败");} finally {try {if (fis != null) {fis.close();}} catch (IOException ex) {throw new RuntimeException("释放资源失败");} finally {try {if (fos != null) {fos.close();}} catch (IOException ex) {throw new RuntimeException("释放资源失败");}}}}}

7、复制多级文件夹(源代码)
package cn.itheima.test;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;/* * 复制多级文件夹 *  */public class CopyFilesDemo {public static void main(String[] args) {method(new File("d:\\abc"), new File("e:"));}// 定义一个方法来创建多级文件的复制public static void method(File source, File target) {String sourceName = source.getName();File xinFile = new File(target, sourceName);xinFile.mkdirs();File[] listFiles = source.listFiles();for (File file : listFiles) {if(file.isDirectory()){method(file,xinFile);}else{String ziName = file.getName();File zifiles = new File(xinFile, ziName);copy(file, zifiles);}}}// 定义一个方法来复制多级文件public static void copy(File source, File target) {BufferedInputStream bis = null;BufferedOutputStream bos = null;try {bis = new BufferedInputStream(new FileInputStream(source));bos = new BufferedOutputStream(new FileOutputStream(target));byte[] bytes = new byte[1024];int len = 0;while ((len = bis.read(bytes)) != -1) {bos.write(bytes, 0, len);}} catch (IOException ex) {throw new RuntimeException("文件复制失败");} finally {try {if (bis != null) {bis.close();}} catch (IOException ex) {throw new RuntimeException("释放资源失败");} finally {try {if (bos != null) {bos.close();}} catch (IOException ex) {throw new RuntimeException("释放资源失败");}}}}}

8、已知s.txt文件中有这样的一个字符串:“hcexfgijkamdnoqrzstuvwybpl”请编写程序读取数据内容,把数据排序后写入ss.txt中。
package cn.itheima.test;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;/* * 已知s.txt文件中有这样的一个字符串:“hcexfgijkamdnoqrzstuvwybpl” 请编写程序读取数据内容,把数据排序后写入ss.txt中。 *  */public class Test3 {public static void main(String[] args) {BufferedReader br = null;BufferedWriter bw = null;try {br = new BufferedReader(new FileReader("d:\\s.txt"));bw = new BufferedWriter(new FileWriter("e:\\ss.txt"));String line = null;while ((line = br.readLine()) != null) {// 定义一个数组来存放,字符串转成字符数组char[] ch = line.toCharArray();// 排序for (int i = 0; i < ch.length; i++) {for (int j = i + 1; j < ch.length; j++) {if (ch[i] > ch[j]) {char temp = ch[i];ch[i] = ch[j];ch[j] = temp;}}}System.out.println(ch);bw.write(ch);bw.newLine();bw.flush();}} catch (IOException ex) {throw new RuntimeException("目录复制失败");} finally {try {if (br != null)br.close();} catch (IOException ex) {throw new RuntimeException("关闭资源失败");} finally {try {if (bw != null)bw.close();} catch (IOException ex) {throw new RuntimeException("关闭资源失败");}}}}}

9、自定义类模拟LineNumberReader的特有功能,获取每次读取数据的行号
package cn.itheima.zidingyireadline;import java.io.IOException;import java.io.Reader;/* *  自定义readLine方法读取文本行 *  依靠Reader类的子类对象,的read读取 *  new MyReadLine(new FileReader()) */public class MyReadLine {private Reader r;public MyReadLine(Reader r) {this.r = r;}//定义保存行号的变量private int lineNumber = 0;public int getLineNumber() {return lineNumber;}public void setLineNumber(int lineNumber) {this.lineNumber = lineNumber;}public String readLine() throws IOException{//定义字符缓冲区,存储每次读取到的有效字符StringBuilder builder = new StringBuilder();int len = 0;//循环读取文件while((len=r.read())!=-1){//读取到的字符进行判断if (len=='\r') continue;if (len=='\n') {lineNumber++;//行就读取结束,将缓冲区变成字符串返回return builder.toString();}//读取到的len是有效字符,存储到缓冲区builder.append((char)len);}//文件结尾//判断字符串缓冲区,是不是有字符,如果有返回,没有返回nullif (builder.length()!=0) {lineNumber++;return builder.toString();}return null;}//定义关闭资源的方法public void close()throws IOException{r.close();}}

package cn.itheima.zidingyireadline;import java.io.FileReader;import java.io.IOException;/* * 自定义的readLine方法进行测试 */public class MyReadLineTest {public static void main(String[] args) throws IOException {//创建自定义类的对象,传递字符输入流MyReadLine m = new MyReadLine(new FileReader("d:\\s.txt"));String line = null;while((line=m.readLine())!=null){System.out.println(m.getLineNumber()+"----"+line);}m.close();}}

四、打印流
PrintStream(字节流) 继承 OutputStream
    作用:为其他输出添加了功能,也是一个装饰流,方便打印各种形式的数据,不会抛出异常,此流只操作数据目的,不操作数据源,使用场景,做数据输出的时候,优先考虑使用打印流。
PrintWriter(字符流)
    打印流开启自动刷新:三个条件,一是打印构造方法,传递必须是流对象;二是构造方法传递,第二个写true;三是必须调用println,format,printf。
示例:打印流复制文本文件
package cn.itheima.printliu;import java.io.BufferedReader;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter;/* * 打印流复制文本文件 *   不能操作数据源,写目的 *   BufferedReader  读取文本行 * PrintWriter     写 println() */public class CopyText {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new FileReader("d:\\s.txt"));PrintWriter pw = new PrintWriter(new FileWriter("e:\\s.txt"),true);String line = null;while((line=br.readLine())!=null){pw.println(line);//pw.flush();}br.close();pw.close();}}

五、标准输入输出流
        System类中的字段:in,out。它们各代表了系统标准的输入和输出设备。默认输入设备是键盘,输出设备是显示器。System.in的类型是InputStream.System.out的类型是PrintStream是OutputStream的子类FilterOutputStream 的子类。
package cn.itheima.io_outliu;import java.io.IOException;import java.io.InputStream;/* * System类的标准输入流 *  System类的静态成员变量  System.in; * 运行结果InputStream的子类对象  BufferedInputStream * 流中的read方法,等待的特性,线程阻塞 *  * read方法,读取键盘录入一行,打印出来 * 一行数据,不需要换行符 *  * 代码和读取一行的readLine功能几乎是一样 * 能不能使用readLine直接读取键盘一行 * readLine 读取键盘一行  System.in * InputStreamReader 字节转成字符 */public class SystemInDemo {public static void main(String[] args) throws IOException {InputStream in = System.in;StringBuilder builder = new StringBuilder();int len = 0;while ((len = in.read()) != -1) {if (len == '\r') {continue;}if (len == '\n') {if ("over".equals(builder.toString())) {break;}System.out.println(builder);builder.delete(0, builder.length());} else {builder.append((char) len);}}}}

1、转换流实现标准写法
package cn.itheima.io_outliu;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;/* 转换流标准写法*/public class TranseDemo2 {public static void main(String[] args) throws IOException{BufferedReader br = new BufferedReader(new InputStreamReader(System.in));BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));String line = null;while((line=br.readLine())!=null){if ("over".equals(line)) {break;}bw.write(line);bw.newLine();bw.flush();}br.close();bw.close();}}

2、打印流替换输出转换流
package cn.itheima.io_outliu;import java.io.BufferedReader;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;/* *  使用打印流,替换转换流+字节输出流 *  操作目的,不能操作数据源 *   *  打印流PrintWriter 构造方法中(字节,字符,File,String) */public class TranseDemo1 {public static void main(String[] args) throws IOException{BufferedReader br = new BufferedReader(new InputStreamReader(System.in));PrintWriter pw = new PrintWriter(new FileOutputStream("d:\\ss.txt"),true);String line = null;while((line=br.readLine())!=null){if("over".equals(line)){break;}pw.println(line);}br.close();pw.close();}}

六、序列化流
    对象的序列化,使用IO流技术将我们对象中的数据写入到文件中保存起来,这一过程称为对象序列化;将文件中班车的数据还原会对象,称为镀锡的反序列化。
    IO包,ObjiectOutputStream 写对象,序列化流
进行反序列化时,必须要有.class文件,否则会抛出ClassNotFoundsException。
    静态修饰的成员变量,不能被序列化,静态修饰的属于自己的类,不属于对象,transient 修饰成员变量,阻止成员变量序列化。
    java.io.Serializable序列化接口,任何一个类,实现这个接口,就可以开启序列化功能,这个接口,没有任何抽象方法,不需要重写。因此叫标记型接口,做一个序列化的标记。   
    以下步骤:
        1、对Person序列化
        2、成功的反序列化
        3、修改Person类的源代码,age修饰符改成public,保存
        4、直接进行反序列化,出现了异常(出现了序列号冲突问题)
        5、为了防止序列化改变,加入自定义序列号
示例:
package cn.itheima.serializable;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;/* * 序列化流 *  */public class ObjectOutputStreamDemo {public static void main(String[] args) throws IOException,ClassNotFoundException{//writeObj();readObj();}public static void writeObj()throws IOException{FileOutputStream fos = new FileOutputStream("d:\\person.txt");ObjectOutputStream oos = new ObjectOutputStream(fos);Person p = new Person("zhangsan", 20);oos.writeObject(p);fos.close();oos.close();}public static void readObj()throws IOException, ClassNotFoundException{FileInputStream fis = new FileInputStream("d:\\person.txt");ObjectInputStream ois = new ObjectInputStream(fis);Object readObject = ois.readObject();System.out.println(readObject);fis.close();ois.close();}}

七、Properties集合
主要记一下使用方法:
    properties和IO流关联使用
    load() 
    store()
示例1:Properties和IO流关联使用
package cn.itheima.properties;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.PrintStream;import java.util.Properties;/* * Properties和IO流关联使用 *  读取配置文件 *  * load(传递字节或者字符输入流) *   流对象读取文件,文件中的键值对保存到集合 *  * store(传递字节或者字符输出流,String s) *   将集合中的键值对,保存会文件中 */public class PropertiesDemo {public static void main(String[] args) throws IOException {//method();//method_1();method_2();}/* * 集合方法list()传递打印流 */public static void method_2()throws IOException{Properties p = new Properties();p.setProperty("a", "1");p.setProperty("b", "2");p.setProperty("c", "3");p.list(new PrintStream(new FileOutputStream("d:\\a.txt")));System.out.println(p);}/* * IO读取配置文件,键值对存储到集合 修改键值对,将修改后的内容存储回配置文件 */public static void method_1()throws IOException{//创建字节输入流,封装文件FileInputStream fis = new FileInputStream("d:\\s.txt");//创建集合对象Properties p = new Properties();//使用集合方法load传递字节输入流p.load(fis);fis.close();System.out.println(p);//将age修改成30p.setProperty("age", "30");System.out.println(p);//创建字节输出流FileOutputStream fos = new FileOutputStream("e:\\s.txt");//调用集合方法store传递字节输出流p.store(fos, "");fos.close();}/* * IO读取配置文件,键值对存储到集合 */public static void method()throws IOException  {// 创建字节输入流,封装文件FileInputStream fis = new FileInputStream("d:\\s.txt");// 创建集合对象Properties p = new Properties();// 使用集合方法load传递字节输入流p.load(fis);fis.close();System.out.println(p);// 通过键获取值String name = p.getProperty("name");String age = p.getProperty("age");System.out.println(name + "---" + age);// 修改集合中的键值对p.setProperty("age", "30");System.out.println(p);}}

示例2:我有一个文本文件,我知道数据是键值对形式的,但是不知道内容是什么。请写一个程序判断是否有“lisi”这样的键存在,如果有就改变其实为”100”
package cn.itheima.properties;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.util.Properties;/* * 我有一个文本文件,我知道数据是键值对形式的, * 但是不知道内容是什么。请写一个程序判断是否有“lisi”这样的键存在, * 如果有就改变其实为”100” *   IO+集合综合效果 * 实现步骤: *   IO流读取配置文件 *   集合load,键值对存储集合 *   判断集合中,有没有lisi键 *     如果有,值改成100 *     创建IO输出流,键值对存储回文件 */public class PropertiesTest {public static void main(String[] args) throws IOException{//创建自己输入流FileInputStream fis = new FileInputStream("d:\\s.txt");//创建集合对象Properties p = new Properties();p.load(fis);String value = p.getProperty("lisi");if(value!=null){FileOutputStream fos = new FileOutputStream("d:\\s.txt");p.setProperty("lisi", "100");p.store(fos, "");fos.close();System.out.println(p.toString());}}}

到目前为止,IO流部分差不多就这些了,很多吧,多多练习吧。

-----------android培训java培训、java学习型技术博客、期待与您交流!------------


0 0
原创粉丝点击