IO的高级应用
1.字符缓冲流
BufferedReader BufferedWriter
2.字节缓冲流
BufferedInputStream BufferedOutputStream
在给出的缓冲区数据输入流有两个,其中最重要的是BufferedReader,因为在BufferedReader中提供了一个重要的读取方法:
public String readLine() throws IOException {}读取一行数据一换行为界
public class BufferedReader extends Reader {
public BufferedReader(Reader in){}
}
如果想使用BufferedReader来处理System.in的操作就比较麻烦了;英文System.in是InputStream类型的;
可以利用InputStreamReader来进行转换,且得到的是String类型的数据;
因为String类型的数据可以利用正则进行校验,比较方便;缓冲流 1. 解决数据乱码的问题;
2.解决system.in带来的问题;
键盘输入的标准格式:
//System.in 是InputStream类对象
// BufferedReader 的构造方法里面需要一个接收Reader类对象
//利用InputStreamReader将字节流转换为字符流;
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
boolean bl=true;
while(bl) {
System.out.println("请输入数据");
String readLine = br.readLine();//以回车作为换行 没有长度的限制
if(!readLine.matches("\\d{1,3}")) {
System.out.println("请输入正确的年龄");
bl=false;
}else {
System.out.println(readLine);
}
}
String len;
while((len=br.readLine())!=null) {
System.out.println(len);
}
3.利用缓冲区读取文件;
与直接使用Inputstream和Reader类相比使用bufferedReader在进行文件的信息读取的时候会更加的方便;
二进制文件不建议这样读取会出现一些问题;
//读文件
BufferedReader br=new BufferedReader(new FileReader(new File("D:\\testio\\a.txt")));
String len;
while((len=br.readLine())!=null) {
System.out.println(len);
}
br.close();
//写文件
BufferedWriter bw=new BufferedWriter(new FileWriter(new File("D:\\testio\\a.txt")));
bw.write("hello world");
bw.close();
//缓冲流写入文件
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("D:\\testio\\a.txt"));
bos.write("hello world buffered".getBytes());
bos.close();
//缓冲流读文件
BufferedInputStream bis=new BufferedInputStream(new FileInputStream("D:\\testio\\a.txt"));
byte [] buf=new byte[1024];
int len;
while((len=bis.read(buf))!=-1){
System.out.println(new String(buf, 0, len));
}
2.Scanner
/*1.Scanner类的主要特点和操作形式
*2.利用Scanner解决数据输入流的操作;
*1.为了改进输出流功能不足java提供了打印流,利用bufferReader解决了大文本读取操作;
* BufferedReader 有两个问题
* a.它读取数据的时候只能够按照字符串返回:
* public String readLine(){}
* b.所有的分隔符都市固定存在的;
* java1.5提供了java.util.Scanner类,来负责解决所有输入流的操作问题; *
* public final class Scanner implements Iterator<String>, Closeable {}
* public Scanner(InputStream source) {}
* 主要有两大类方法 hasNextXxx()和nextXxx()
* hasNextXxx():判断是否有指定的数据;
* nextXxx():取出数据;
* public boolean hasNext(){}
* public 数据类型 next() {}
* 与BufferedReader相比较Scanner更加的直观和简单;
* 支持正则表达式
* String next(Pattern pattern)
* boolean hasNext(Pattern pattern)
* 实现文件的输入
* a.在文件读取的时候需要考虑到分隔符的问题;
* Scanner useDelimiter(String pattern)
* Scanner useDelimiter(Pattern pattern)
*
* 使用Scanner读取数据的时候综合来讲的确比bufferedReader简单;
* 使用原则:程序输出时使用打印流,输入流使用Scanner(如果发现Scanner不好用了,使用bufferedReader)
*
* 总结:
* InputStream 类的功能不足已经被Scanner解决了
* Reader类的功能不足被BufferedReader解决了
* OutputStream类的功能不足被PrintStream解决了
* Writer类的功能不足被PrintWriter解决了;
*/
Scanner scanner=new Scanner(System.in);
System.out.println("输入信息");
if(scanner.hasNext()) {
System.out.println("输入了"+scanner.next());
}
Scanner canner1=new Scanner(new FileInputStream(new File("d:"+File.separator+"testio"+File.separator+"a.txt")));
canner1.useDelimiter("\n");
while(canner1.hasNext()) {
System.out.println(canner1.next());
}
3.对象序列化
1.对象序列化的意义和实现
1.对象的序列化指的是将保存在内存中的对象数据转换为二进制数据流进行传输的操作;
但是不是每个对象都可以进行序列号,如果要被序列号的对象,必须实现java.io.Serializable接口;
没有任何方法的实现,因为它是一个标识接口,标识一种能力;
java中有两个标识接口
1.Serializable接口 用在对象序列化上
2. 克隆
2.了解对象输入,输出的使用
序列化类:java.io.ObjectOutputstream
将对象变为指定格式的二进制数据
反序列号类:java.io.ObjectInputStream
将序列号的对象转换为对象内容
a.实现序列号对象
ObjectOutputStream(OutputStream out)
public final void writeObject(Object obj)
throws IOException
b.反序列化
ObjectInputStream(InputStream in)
public final Object readObject()
throws IOException,
ClassNotFoundException
在实际开发会由容器帮我们完成序列化操作;
3.理解transient关键字;
在实现序列化的时候,是将整个对象的所有属性进行了保存
如果某些属性不需要被保存,可以使用transient关键字来定义;
被transient修改的属性不能被序列化
不是所有的类都需要序列化,只有需要传输的对象才需要实例化;
总结
1.InputStream :专门进行字节数据输入的一个类
outputStream:专门进行字节数据输出的一个类
Reader :作为输入流可以进行字符串直接的输入
Writer:作为输出流可以进行字符串之间的输出
2.字节流和字符流直接的转换
InputStreamReader OutputStreamWriter
5.使用OutputStream输出数据,需要将数据变为字节数组输出,使用起来不是很方便;
为了解决outputStream输出的不足java提供PrintStream 和PrintWriter
6.如果某个应用需要进行IO操作,但是不想产生文件的时候,就可以利用内存流实现输入输出的操作;
java 提供了两组操作,
字节内存流:ByteArrayInputStream ByteArrayOutputStream
字符内存流: CharArrayReader CharArrayWriter
7.缓冲流
BufferedReader BufferedWriter BufferedInputStream BufferedOutputStream
其中重要的时BufferedReader, BufferedReader中提供了一个重要的读取方法: public String readLine() throws IOException {} 读取一行数据一换行为界
8.为了改进输出流功能不足java提供了打印流,利用bufferReader解决了大文本读取操作;
但是BufferedReader 有两个问题
a.它读取数据的时候只能够按照字符串返回:
public String readLine(){}
b.所有的分隔符都是固定存在的;
为此java1.5提供了java.util.Scanner类,来负责解决所有输入流的操作问题;
10. InputStream 类的功能不足已经被Scanner解决了
解决了1.InputStream读取数据的时候只能够按照字符串返回:
2.InputStream读取数据的时候所有的分隔符都市固定存在的;
Reader类的功能不足被BufferedReader解决了;
1. 解决数据乱码的问题;
2.解决system.in带来的问题;
OutputStream类的功能不足被PrintStream解决了;
a.使用OutputStream输出数据,需要将数据(String,boolean ,double,int)变为字节数组然后输出,使用起来不是很方便;
PrintStream解决了这个问题;(输出是建议使用打印流实现)
Writer类的功能不足被PrintWriter解决了;
a.可以方便的写入各种类型的数据;