输入和输出处理(二)

Reader类

Reader类常用方法

        int   read( )  读一个字符

        int   read(char[] c)  将字符读入数组

        read(char[] c,int off,int len)  将字符读入数组的一部分

        void close( )   关闭流

子类InputStreamReader常用的构造方法

        InputStreamReader(InputStream in)  创建使用默认字符集InputStreamReader

package demo01;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class InputStreamReaderDemo01 {

	public static void main(String[] args) {
		//创建File类对象
		File file = new File("F:\\demo.txt");
		
		//创建InputStream类对象,但是InputStream是一个抽象类,不能直接创建对象,可以创建它的子类FileInputStream类对象
		InputStream is=null;
		InputStreamReader ir =null;
		try {
			is = new FileInputStream(file);
			//创建InputStreamReader类对象
			ir = new InputStreamReader(is);
			
			//开始读取数据
			// int num =ir.read();
			// System.out.println((char)num);
			int num;
			while((num=ir.read())!=-1){
				System.out.print((char)num);
			}
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			//关闭多个流的原则:先开的后关,后开的先关
			if(ir!=null){
				try {
					ir.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			
			if(is!=null){
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
		
	}

}

        InputStreamReader(InputStream in,String charsetName)  创建使用命名字符集的ISR

package demo01;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

public class InputStreamReaderDemo02 {

	public static void main(String[] args) {
		InputStreamReader ir = null;
		try {
			ir = new InputStreamReader(new FileInputStream(
					"F:/demo.txt"),"UTF-8");
			char[] chars = new char[1024];

			//read(char[] ch):从流中读取数据,并将数据存储在ch这个数组中,返回值表示从流中读取的数据个数
			int num = ir.read(chars);
			System.out.println(System.getProperty("file.encoding"));  
			// System.out.println(num); //10
			
			//遍历数组chars,获取读取的数据
			for(int i =0;i<num;i++){
				System.out.print(chars[i]);
			}

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			if(ir!=null){
				try {
					ir.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

	}

}

FileReader类

FileReader类是InputStreamReader的子类

        FileReader(File file)  创建一个新的FileReader,给出File读取

        FileReader(String name)  创建一个新的 FileReader ,给定要读取的文件的名称。

该类只能按照本地平台的字符编码来读取数据,用户不能指定其他的字符编码类型 System.out.println(System.getProperty("file.encoding"));  获得本地平台的字符编码类型 

使用FileReader读取文件

与字节流FileInputStream类实现文本文件读取步骤类似

1.引入相关的类

 import java.io.Reader;                                                                                                         import java.io.FileReader;                                                                                                  Import java.io.IOExceprion;

2.创建FileReader

 Reader fr= new FileReader("D:\\myDoc\\简介.txt");

3.读取文本文件的数据

 fr.read();

4.关闭相关的流对象

fr.close();

package demo01;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class FileReaderDemo01 {

	public static void main(String[] args) {
		
		//创建FileReader类对象
		FileReader  fr = null;
		try {
			fr = new FileReader("F:/demo.txt");
			int num =fr.read();
			System.out.println((char)num);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				fr.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}

如何提高字符流读取文本文件的效率?

使用FileReader类与BufferedReader类

BufferedReader类

BufferedReader类是Reader类的子类

BufferedReader类带有缓冲区

按行读取内容的readLine()方法

BufferedReader常用的构造方法

        BufferedReader(Reader in)

子类BufferedReader特有的方法  

        readLine()

使用 BufferedReader读文本文件

1.引入相关的类

 import java.io.FileReader;                                                                                                 import java.io.BufferedReader;                                                                                         import java.io.IOException;

2.构造BufferedReader对象和FileReader对象

Reader fr= new  FileReader("C:\\myTest.txt ");                                                                            BufferedReader br=new BufferedReader(fr);

3.调用read Line()方法读取数据

br.readLine();

4.关闭文件流对象

br.close();                                                                                                                               fr.close();

读取包含中文的文本文件时,可能出现中文乱码,怎么办?

使用InputStreamReader并设置编码格式
InputStreamReader fr=new InputStreamReader(fis,"UTF-8"); 

package demo01;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

public class BufferedReaderDemo01 {

	public static void main(String[] args) {
		// 创建BufferedReader类对象
		BufferedReader br  = null;
		try {
			br  = new BufferedReader(new InputStreamReader(new FileInputStream("F:/demo.txt"), "UTF-8"));
			String str;
			while((str=br.readLine())!=null){
				System.out.println(str);
			}
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				br.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}

}

Writer类

Writer类常用方法

         write(String str)  写一个字符串

        write(String str,int off,int len)  写一个字符串的一部分

        void close()  关闭流,先刷新

        void flush()   刷新流

子类OutputStreamWriter常用的构造方法

OutputStreamWriter(OutputStream out)

OutputStreamWriter(OutputStream out,String charsetName)

package demo02;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class OutputStreamWriterDemo01 {

	public static void main(String[] args) {
		// 创建OutputStreamWriter类对象
		OutputStreamWriter osw = null;
		try {
			osw = new OutputStreamWriter(new FileOutputStream(
					"F:/demo.txt", true));
			
			osw.write("hello java");
			System.out.println("写入完毕");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			try {
				osw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}

}

FileWriter类

FileWriter类是OutputStreamWriter的子类

        FileWriter (File file)

        FileWriter (String name)

该类只能按照本地平台的字符编码来写数据,用户不能指定其他的字符编码类型

使用FileWriter写文件

与字节流FileOutputStream类实现向文本文件写入数据步骤类似

1.引入相关的类

import java.io.Reader;                                                                                                        import java.io.FileWriter;                                                                                                          import java.io.IOException;

2.创建FileReader对象

Writer fw=new FileWriter("D:\\myDoc\\简介.txt");

3.写文本文件

fw.write();

4.关闭相关的流对象

fw.close();

package demo02;

import java.io.FileWriter;
import java.io.IOException;

public class FileWriterDemo01 {

	public static void main(String[] args) {
		// 创建FileWriter类对象
		FileWriter fw =null;
		try {
			fw = new FileWriter("F:/demo.txt", true);
			fw.write("hi,js");
			System.out.println("数据写入完毕");
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				fw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}

如何提高字符流写文本文件的效率?

使用FileWriter类与BufferedWriter类

BufferedWriter类是Writer类的子类

BufferedWriter类带有缓冲区

BufferedWriter常用的构造方法  BufferedWriter(Writer out)

使用 BufferedWriter写文件

1.引入相关的类

import java.io.FileWriter ;                                                                                                        import java.io.BufferedWriter ;                                                                                                import java.io.IOException;

2.构造BufferedWriter对象和FileWriter

FileWriter fw=new  FileWriter("C:\\myTest.txt");                                                                        BufferedWriter bw=new BufferedWriter(fw);

3.调用Writer()方法写数据

bw.writer("hello");

4.流对象的清空和关闭flush()和close()

bw.flush();

fw.close();

package demo02;

import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class BufferedWriterDemo01 {

	public static void main(String[] args) {
		// 创建BufferedWriter类对象
		BufferedWriter bw =null;
		try {
			bw = new BufferedWriter(new OutputStreamWriter(
					new FileOutputStream("F:/demo.txt", true)));
			bw.newLine();
			bw.write("qwertasdfg");
			bw.newLine();
			bw.write("qqqqqqqqqqqqqqqqqqqqq");
			bw.flush();
			System.out.println("数据写入完毕");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			try {
				bw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}

}

读写二进制文件

DataInputStream类

        FileInputStream的子类 与FileInputStream类结合使用读取二进制文件

DataOutputStream类

        FileOutputStream的子类 与FileOutputStream类结合使用写二进制文件

使用 DataInputStream 读二进制文件

1.引入相关的类

import java.io.FileInputStream;                                                                                                import java.io.DataInputStream;

2.构造数据输入

FileWriter fw=new  FileWriter("C:\\myTest.txt");                                                                        BufferedWriter bw=new BufferedWriter(fw);

3.调read()方法写数据

bfeol("hello");

4.流对象的清空和关闭flush()和close()

dis flush();

dis.vclose();

fw.close();

使用 DataOutputStream写二进制文件

DataInputStream类

        FileInputStream的子类 与FileInputStream类结合使用读取二进制文件

DataOutputStream类

        FileOutputStream的子类 与FileOutputStream类结合使用写二进制文件

使用 DataInputStream 读二进制文件

1.引入相关的类

        import java.io.FileOutputStream;                                                                  import import            import java.io.DataOutputStream;

2.构造数据输出流对象

FileOutputStream outFile=new  FileOutputStream("C:\\temp.class");                        DataOutputStream out=new  DataOutputStream(outFile);

3.调write()方法写数据

out.write();

4.关闭数据输出流

out.close();

package demo03;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class DataInputStreamAndDataOutputStreamDemo01 {

	public static void main(String[] args) {
		//创建FileInputStream类对象
		FileInputStream fis=null;
		//创建DataInputStream类对象
		DataInputStream dis  =null;
		//创建FileOutputStream类对象
		FileOutputStream fos =null;
		//创建DataOutputStream类对象
		DataOutputStream dos = null;
		try {
			fis = new FileInputStream("F:/beautiful.jpg");
			dis  = new DataInputStream(fis);
			fos = new FileOutputStream("F:/girl.jpg");
			dos=new DataOutputStream(fos);
			int num;
			while((num=dis.read())!=-1){
				dos.write(num);
			}
			
			System.out.println("图片复制完毕");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				dos.close();
				fos.close();
				dis.close();
				fis.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		

	}

}

序列化和反序列化

序列化是将对象的状态写入到特定的流中的过程

反序列化则是从特定的流中获取数据重新构建对象的过程

实现序列化

1.实现Serializable接口

2.创建对象输出流

3.调用writeObject()方法将对象写入文件

4.关闭对象输出流

使用集合保存对象,可以将集合中的所有对象序列化

实现反序列化

1.实现Serializable接口

2.创建对象输入流

3.调用readObject()方法读取对象

4.关闭对象输入流

如果向文件中使用序列化机制写入多个对象,那么反序列化恢复对象时,必须按照写入的顺序读取

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值