《java io包 2》

day18

课程

part1.带缓冲区的输入流与输出流

try {
  //创建基本的字符输入流
  Reader reader=new FileReader("d:/test1.txt");
  //创建带缓冲区的字符输入流
  BufferedReader bufferedReader=new BufferedReader(reader);
  }
  catch (Exception e) {
  e.printStackTrace();
 }

首先创建基本的字符输入流,再创建带缓冲的字符输入流

 String reString=null;
  while((reString=bufferedReader.readLine())!=null){
   System.out.println(reString);
  }

在创建了带缓冲区的字符输入流之后,可以通过先创建一个空字符串,再通过while循环来逐行逐行的读取文件内容,如果读取到了null,则停止读取,如果没有读取到null,则将值赋给字符串后输出字符串,这里使用的方法时readLine()

try {
  Writer writer=new FileWriter("d:/kkp.txt");
  BufferedWriter bufferedWriter=new BufferedWriter(writer);
  }
   catch (Exception e) {
  e.printStackTrace();
 }

带缓冲区的字符输出流的使用方法也是先创建一个字符输入流对象,再创建带缓冲区的字符输出流对象

bufferedWriter.write("德玛西亚!!");
bufferedWriter.flush();
bufferedWriter.close();
writer.close();

带缓冲区的字符输出流对象也时可以使用它父辈Writer类的方法,直接输出字符串至文件中,需记住的是如果想看到结果,应该刷新缓存区或关闭资源

try {
  Reader reader=new FileReader("d:/test1.txt");
  BufferedReader bufferedReader=new BufferedReader(reader);
  Writer writer=new FileWriter("d:/kkp.txt");
  BufferedWriter bufferedWriter=new BufferedWriter(writer);
  String kkString=null;
  while((kkString=bufferedReader.readLine())!=null){
   System.out.print(kkString);
   bufferedWriter.write(kkString);
   bufferedWriter.newLine();
   bufferedWriter.flush();
  }
  bufferedWriter.close();
  writer.close();
  bufferedReader.close();
  reader.close();
 } catch (Exception e) {
  e.printStackTrace();
 }

这里演示的案例是将文件读入后输出至另一个文件中,程序的逻辑与方法与上面所讲无很大差别,唯一应该注意的是如果在输出至文件时没有使用newLine()方法,会出现数据写入不会换行的情况

part2.字节输入流转化为字符输入流,字节输出流转化为字符输出流

try {
   //创建基本的字节输入流
  InputStream inputStream=new FileInputStream("d:/test1.txt");
  //创建转换流对象的作用:1.将字节输入流转换为字符输入流 2.可以指定传输过程中的字符集
  InputStreamReader reader=new InputStreamReader(inputStream);
  int data=0;
  while((data=reader.read())!=-1){
   System.out.print((char)data);
  }  
 } catch (Exception e) {
  e.printStackTrace();
 }

字节输入流转化为字符输入流具体的操作为先创建基本的字符输入流,再创建转换流的对象,之后的操作就与字符输入流相同了,上面展示的是字符输入流查看文件的第一种方法

try {
  OutputStream outputStream=new FileOutputStream("d:/test2.txt");
  //也可以指定字符集
  OutputStreamWriter writer=new OutputStreamWriter(outputStream);
  writer.write("i love china");
  writer.flush();
  writer.close();
  outputStream.close();
  
 } catch (Exception e) {
  e.printStackTrace();
 }

字节输出流转换为字符输出流也一样,只要转换成功后,即可以使用字符输出流的功能

part3.对象输出流与对象输入流

public class User implements Serializable{
private String name;
private int age;
public User(String name,int age){
this.name=name;
this.age=age;
}
public String toString() {
 return "User [name=" + name + ", age=" + age + "]";
}
}

在进行本章节的学习前需要先创建一个User类,需要着重注意的是此类需要实现Serializable接口,以达到读取写入序列化的作用

try {
  //创建User对象,用于保存到外部文件
  User user2=new User("网易",168);
 //创建基本的字节输出流
  OutputStream outputStream=new FileOutputStream("d:/test3.txt");
  //创建对象输出流
  ObjectOutputStream out=new ObjectOutputStream(outputStream);
  out.writeObject(user2);
  out.close();
  outputStream.close();
  
 } catch (Exception e) {
  // TODO 自动生成的 catch 块
  e.printStackTrace();
 }

首先创建一个User类的对象,用来保存到外部文件,再创建基本的字节输出流,接着创建对象输出流,最后调用对象输出流中的writeObject()方法来输出对象至文件内,最后关闭资源

try {
  //创建User对象,用于保存到外部文件
  //User user2=new User("网易",168);
  List<User> list=new ArrayList<User>();
  list.add(new User("王五",16));
  list.add(new User("王si",165));
  list.add(new User("王san",161));
  list.add(new User("王er",163));
  list.add(new User("王uy",164));
  //创建基本的字节输出流
  OutputStream outputStream=new FileOutputStream("d:/test3.txt");
  //创建对象输出流
  ObjectOutputStream out=new ObjectOutputStream(outputStream);
  out.writeObject(list);
  out.close();
  outputStream.close();
  
 } catch (Exception e) {
  // TODO 自动生成的 catch 块
  e.printStackTrace();
 }

如果有多个对象都想要写入文件的情况,可以使用集合,先将对象添加进集合内,然后用writeObject()的重载方法,将集合直接输出至文件内

try {
  //创建基本的字节输入流
  InputStream inputStream=new FileInputStream("d:/test3.txt");
  ObjectInputStream in =new ObjectInputStream(inputStream);
  Object object=in.readObject();
  if(object instanceof User){
   User user2=(User)object;
   System.out.println(user2);
  }
 } catch (Exception e) {
  e.printStackTrace();
 }

在对象输入流中,因为文件test3.txt在刚才已经被写入了对象,所以可以先通过先创建基本的字节输入流,再创建对象输入流,通过readObject()方法进行对象的提取,因为不知道对象是否属于User类,所以此程序做了一个判断并向上转型的操作,确保对象被输入进控制台

try {
  //创建基本的字节输入流
  InputStream inputStream=new FileInputStream("d:/test3.txt");
  ObjectInputStream in =new ObjectInputStream(inputStream);
  //Object object=in.readObject();
  /*if(object instanceof User){
   User user2=(User)object;
   System.out.println(user2);
  }*/
  List<User> list=(List<User>)in.readObject();
  for(User user:list){
   System.out.println(user);
  }
 } catch (Exception e) {
  e.printStackTrace();
 }

这个程序表现的是将集合中的对象一个一个读出,方法也是先将对象输入流通过readObject()方法得到的所有对象强制转换为List集合,保存到一个自己定义的List集合的集合对象中,再遍历此集合,输出每一个对象

习题

1.

try {
  Reader reader=new FileReader("d:/test1.txt");
  BufferedReader bufferedReader=new BufferedReader(reader);
  String pnString=null;
  while((pnString=bufferedReader.readLine())!=null){
   System.out.println(pnString);
  }
 } catch (Exception e) {
  e.printStackTrace();
 }

这题考察的是用Reader和BufferedReader来输入文件内容至控制台观看,笔者采用了逐行查看的方式,成功输出了test1.txt文件中的内容

总结

今天主要学习了java输入输出流中剩下的几个流(io 包),part1和part2提到的四个包分别为带缓冲区的输入输出流,输入与输出的转换流,这四个包的使用不算困难,使用方式也与昨天所说的大同小异,只有对象的输入输出流比较困难,初学者应着重掌握对象或集合的输入输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值