I/O知识点复习总结

知识点包括:
1、 序列化
2、 读写文件
3、 字节流
4、 字符流
5、 Servlet 输入输出流:ServletInputStream、ServletOutputStream
  
  IO(是 Input 输入、 Output 输出的首字母),是一个抽象的概念,输入输出是相对于
CPU 而言的。
  输入输出流又分为字节流、字符流;字节流的输入输出单位是字节,通过字节流可以
读写任何文件;字符流的输入输出的单位是字符;它只能读写字符,适合处理由字符组成
的文档类型文件。
  
IO 的用途有哪些:
 1、读写文件 
2、上传下载 
3、将 Java 对象序列化到硬盘 
  
例子:使用 Java 语言,分别用字节流和字符流复制文件。
答:复制文件的过程可以分为读取文件和写出文件两部分,转化为计算机的操作实质
上是读取文件和写出文件。用字节流读取文件可以使用 InputStream,写出文件可以使用
OutputSream。用字符流读取文件可以用 Reader,写出文件可以用 Writer。然而知道这些知
识并不一定能写出程序,还需要有一定的思路以及将思路转化为计算机语言的能力。
字节流读取文件时,可以用 Inputsream 提供的 read(byte[] byt)方法,此方法将读取
到的字节数据保存到参数 byt 数组中。byt 字节数组被作为字节流缓冲区定义。那该数组的
作用是什么呢?既然是缓冲区,其实就是说保存在内存当中的。我们读取文件的时候,可
以一次性读取更多的数据到缓冲中,而不是一个字节一个字节读取,这样读取效率会提
高。而往出写数据的时候,又可以一次性将缓冲中的所有字节写出到硬盘,而不是一个个写出,这样会提高写出效率。那缓冲数组大小应该设置为多大呢?如果设置大了,那么会
过多消耗内存空间。如果设置小了,读写效率又不会有多少提高。目前常见的大小是
1024。
关于 read(byte[] byt)方法,他有一个返回参数,是 int 类型。返回的值代表这次读
取操作读取到多少个字节并写入到缓冲数组中。为什么要设定返回值呢,因为每次读取的
字节数不一定是 1024 个,可能会比 1024 少,而我们的字节数组定义的是 1024 的大小,
如果读取的字节数小于 1024 个,那么数组中就会有空元素。而我们知道了此次读取了多少
个字节后,再往出写数据的时候,我们就能把数组中有效的数据写出,无效的数据将不写
出。
将字节读取到缓冲区后,那么就可以写出数据到硬盘了。写出可以用 OutputSream 的
writer(byte[] byt, int start, int length)方法。这个方法的第一个参数是缓冲数组,就是上边
定义的数组。第二个参数是在给定的缓冲数组中,从哪一个下标位置开始读取数组数据。
第三个参数是读取该数组中多长的数据。给定了这些参数后,writer(byte[] byt, int start,
int length)方法会将指定的数据写出到硬盘中。
那参数该如何指定呢?第一个参数自然是我们定义的缓冲数组;第二个参数我们设置
为 0,因为我们是从 0 开始读取的。第三个参数我们设置为在读取数据时的长度,读取了
多少字节,我们就写出多少字节。
代码如下:
1)字节流读写文件:
 public class CopyFile {
   /**
   * 字节流复制文件
   * @param args
   * @throws IOException 
   */
  public static void main(String[] args) throws IOException {
  
   //1、定义文件输入流
   InputStream in = new FileInputStream("c:/soft/test.jpg");//2、定义文件的输出流
   OutputStream out = new FileOutputStream("c:/soft/test(1).jpg");
  
   //3、定义缓冲区
   byte[] byt = new byte[1024];
  
   int length = -1;
   while((length = in.read(byt)) !=-1){
    out.write(byt, 0, length);
   }
  
   out.close();
   in.close();
  }
 }
 
  2)字符流读写文件
  字符流读写文件与字节流类似,只是将对应的接口和缓冲数组类型换一下。字符流读
取文件的接口是 Reader,写出文件的接口是 Writer。缓冲数组类型是 char[]。
 代码如下:
 public class CharCopyFile {
 
  /**
   * 字符流读写文件
   * @param args
   * @throws IOException 
   */
  public static void main(String[] args) throws IOException {
  
   //1、定义字符输入流Reader reader = new FileReader("c:/soft/test.txt");
  
   //2、定义字符输出流
   Writer writer = new FileWriter("c:/soft/test-副本.txt");
  
   char[] buffer = new char[1024];
  
   int length = -1;
  
   while((length = reader.read(buffer))!=-1) {
    writer.write(buffer, 0, length);
   }
  
   writer.close();
   reader.close();
  }
 }
 
 3)对象的序列化反序列化
 由于 Java 的对象同样是以数据的形式在内存保存,所以可以将对象保存到硬盘,也可
以从硬盘读取对象到内存供程序使用。对象的序列化和反序列化是指:将对象保存至硬盘
中,这是序列化;将硬盘中的对象加载进来供程序使用,这是反序列化。
 例子:用 Java 创建一个 User 对象,其中有 username、password 属性。
1) 将此 User 对象序列化到硬盘;
2) 将硬盘中的 User 对象反序列化。
代码如下:
1)序列化:
public class SerializableObject {
 public static void main(String[] args) throws IOException {
   User user = new User();user.setUsername("mayanyun");
  user.setPassword("123456");
  
  ObjectOutputStream out = new ObjectOutputStream(new
FileOutputStream("c:/soft/user.obj"));
  
  out.writeObject(user);
  out.close();
 }
}
 
 
 2)反序列化:
 
public class ReadObjectFromDesk {
 
 public static void main(String[] args) throws Exception {
  
  ObjectInputStream in = new ObjectInputStream(new
FileInputStream("c:/soft/user.obj"));
  
  User user = (User)in.readObject();
  
  in.close();
  
  System.out.println(user.getUsername());
  System.out.println(user.getPassword());
 }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值