Java流的分类

1.输入/输出流

输入流:只能向其读数据,不能写。

输出流:只能向其写数据,不能读。

所谓的输入输出都是相对应用程序而言的。

2.字节流/字符流

单位不同,字节流操作8位,字符流操作16位,2倍关系。

3.节点流/处理流

按照流的角色来分的。

节点流:从/向特定的IO设备读/写的流,也称低级流。

处理流:对于一个已经存在的流进行连接或包装,通过包装后的流来实现读写功能,也称高级流。

Java流概念模型

Java.io包里面有40多个类,看上去很凌乱负责,但实际有规律。所有类都继承自4个类,

InputStream

OutputStream

Reader

Writer

所有类的结构图如下:

其实是按字节流/字符流来分的。

上述4个类是抽象类的主要方法。

读,InputStream/Reader

有几个主要的方法:

Int read()读取单个字节/字符。

Int read(byte[] b/char[] c),读取给定数组的字节/字符。

Int read(byte[] b/char[] c, int off, int len)从字节/字符组中的off位置,读取len长度。

代码:

以FileInputStream和FileReader为例子:

  1. public static void main(String[] args) throws Exception{
  2.  
  3. // TODO Auto-generated method stub
  4.  
  5. FileInputStream fis = new FileInputStream("TestFile1.java");
  6.  
  7. byte[] bbuf = new byte[1024];
  8.  
  9. int hasRead = 0;
  10.  
  11. while((hasRead = fis.read(bbuf))>0){
  12.  
  13. System.out.print(new String(bbuf,0,hasRead));
  14.  
  15. }
  16.  
  17. fis.close();
  18.  
  19. }

这里byte数组的大小是1024,如果很小,或者为奇数的话,可能会出现读出来的是乱码。

  1. public static void main(String[] args) throws IOException {
  2. // TODO Auto-generated method stub
  3. try {
  4. fr = new FileReader("TestFile1.java");
  5. char[] cbuf = new char[32];
  6. int hasRead = 0;
  7. while ((hasRead = fr.read(cbuf)) > 0) {
  8. System.out.print(new String(cbuf, 0, hasRead));
  9. }
  10. } catch (IOException e) {
  11. e.printStackTrace();
  12. }
  13. finally{
  14. fr.close();
  15. }
  16. }

写,OutputStream/Writer

主要的方法:

Void write(c)写入指定的c个字节/字符。

Void write(byte[] b/char[] c)写入字节/字符数组中的数据。

Void write(byte[]/char[] buf, int off, int len)从字节/字符数组中的off位置写入len长度到输出流。

由于字符流以字符为单位,Writer可以用字符串来代替字符数组,于是有了2个新的方法:

Void write(string s)写入字符串s到流。

Void write(string s, int off, int len)从字符串s的off位置处写入len长度到流。

以FileOutputStream和FileWriter为例子:

  1. public static void main(String[] args) throws IOException {
  2.  
  3. // TODO Auto-generated method stub
  4.  
  5. FileInputStream fis = null;
  6.  
  7. FileOutputStream fos = null;
  8.  
  9. try {
  10.  
  11. fis = new FileInputStream(
  12.  
  13. " TestFile1.java");
  14.  
  15. fos = new FileOutputStream(
  16.  
  17. " NewFile.txt");
  18.  
  19. byte[] bbuf = new byte[1024];
  20.  
  21. int hasRead = 0;
  22.  
  23. while ((hasRead = fis.read(bbuf)) > 0) {
  24.  
  25. fos.write(bbuf, 0, hasRead);
  26.  
  27. }
  28.  
  29. } catch (IOException e) {
  30.  
  31. e.printStackTrace();
  32.  
  33. } finally {
  34.  
  35. fis.close();
  36.  
  37. fos.close();
  38.  
  39. }
  40.  
  41. }

FileWriter:

  1. public static void main(String[] args) throws IOException {
  2.  
  3. // TODO Auto-generated method stub
  4.  
  5. FileWriter fw = null;
  6.  
  7. try {
  8.  
  9. fw = new FileWriter("newFile2.txt");
  10.  
  11. fw.write("静夜思\r\n");
  12.  
  13. fw.write("床前明月光,\r\n");
  14.  
  15. fw.write("疑是地上霜,\r\n");
  16.  
  17. fw.write("举头望明月,\r\n");
  18.  
  19. fw.write("低头思故乡。\r\n");
  20.  
  21. } catch (IOException e) {
  22.  
  23. // TODO Auto-generated catch block
  24.  
  25. e.printStackTrace();
  26.  
  27. }finally{
  28.  
  29. fw.close();
  30.  
  31. }
  32.  
  33. }

Java序列化和反序列化

序列化即将对象转换成数据(二进制或xml文本),反序列化则相反。

Java序列化/反序列化用到的类:ObjectOutputStream/ObjectInputStream,它们都是处理流对象,接受节点流FileOutputStream/FileInputStream.

序列化/反序列化要求被处理的类继承Serializable接口。

例子:

  1. //Person 类
  2. public class Person implements java.io.Serializable {
  3.  
  4. public String Name;
  5.  
  6. public int Age;
  7.  
  8. public Person(String name,int age){
  9. this.Name=name;
  10. this.Age=age;
  11. }
  12. }
  13.  
  14. public class TestSerialization {
  15.  
  16. /**
  17. * @param args
  18. * @throws ClassNotFoundException
  19. */
  20. public static void main(String[] args) throws ClassNotFoundException {
  21. // TODO Auto-generated method stub
  22.  
  23. /**
  24. * Serialize
  25. */
  26. try {
  27. ObjectOutputStream op = new ObjectOutputStream(
  28. new FileOutputStream(
  29. "Person.txt"));
  30. Person p = new Person("Jackson", 24);
  31. Person p2 = new Person("Anne", 23);
  32. op.writeObject(p);
  33. op.writeObject(p2);
  34. System.out.println("person info: name is " + p.Name + " ;age is: "
  35. + p.Age);
  36. } catch (IOException e) {
  37. // TODO Auto-generated catch block
  38. e.printStackTrace();
  39. }
  40.  
  41. /**
  42. * DeSerialize
  43. */
  44. try {
  45. ObjectInputStream ip = new ObjectInputStream(new FileInputStream(
  46. "Person.txt"));
  47. Person p = (Person) ip.readObject();
  48. Object o;
  49. while ((o = ip.readObject()) != null) {
  50. Person pp = (Person) o;
  51. System.out.println("name: " + pp.Name + ",Age:" + pp.Age);
  52. }
  53.  
  54. } catch (FileNotFoundException e) {
  55. // TODO Auto-generated catch block
  56. e.printStackTrace();
  57. } catch (IOException e) {
  58. // TODO Auto-generated catch block
  59. e.printStackTrace();
  60. }
  61. }
  62. }

JAVA IO 学习的更多相关文章

  1. Java IO学习笔记:概念与原理

    Java IO学习笔记:概念与原理   一.概念   Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存 中,形成了 ...

  2. Java IO学习笔记总结

    Java IO学习笔记总结 前言 前面的八篇文章详细的讲述了Java IO的操作方法,文章列表如下 基本的文件操作 字符流和字节流的操作 InputStreamReader和OutputStreamW ...

  3. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

  4. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

  5. Java IO学习笔记一

    Java IO学习笔记一 File File是文件和目录路径名的抽象表示形式,总的来说就是java创建删除文件目录的一个类库,但是作用不仅仅于此,详细见官方文档 构造函数 File(File pare ...

  6. java IO 学习(三)

    java IO 学习(一)给了java io 进行分类,这一章学习这些类的常用方法 一.File 1.创建一个新的File的实例: /** * 创建一个新的File实例 */ File f = new ...

  7. Java IO学习笔记一:为什么带Buffer的比不带Buffer的快

    作者:Grey 原文地址:Java IO学习笔记一:为什么带Buffer的比不带Buffer的快 Java中为什么BufferedReader,BufferedWriter要比FileReader 和 ...

  8. Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer

    作者:Grey 原文地址:Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer ByteBuffer.allocate()与ByteBuffer.allocateD ...

  9. Java IO学习笔记三:MMAP与RandomAccessFile

    作者:Grey 原文地址:Java IO学习笔记三:MMAP与RandomAccessFile 关于RandomAccessFile 相较于前面提到的BufferedReader/Writer和Fil ...

  10. Java IO学习笔记四:Socket基础

    作者:Grey 原文地址:Java IO学习笔记四:Socket基础 准备两个Linux实例(安装好jdk1.8),我准备的两个实例的ip地址分别为: io1实例:192.168.205.138 io ...

随机推荐

  1. linux 添加基于weblogic的nodemanager的服务

    用nodemanager来添加weblogic服务启动. 1.新建一个server,命名为Server1,端口设置为7055,其他采用默认值. 2.新建一个Machine,命名为Machine1.配置 ...

  2. Python 模块chardet安装 setup.py

    http://pypi.python.org/pypi/chardet#downloads 下载chardet-2.*.*.tar.gz:解压到site-package文件夹, Python及其一些模 ...

  3. php部分,一个用递归无限分类的方法

    <?php $data[]=array('id'=>1,'parentid'=>0,'name'=>'中国'); $data[]=array('id'=>2,'paren ...

  4. mysql数据库性能篇

    慢查询:超过设定时间的SQL语句会被记录到指定文件内 1.观察mysql慢查询默认的时间(默认10秒) show variables like 'long%'; 2.修改慢查询设定时间 set lon ...

  5. IDEA IntelliJ常用设置以及快捷键(转)

    转载自:http://macrochen.iteye.com/blog/1035680 关于字体的设置 IDEA下使用雅黑Consolas混合字体      快捷贱, 快捷贱 , 快捷键贱    In ...

  6. ASP.NET MVC5 实现网址伪静态

    一.路由规则: routes.MapRoute( name: "Default1", url: "more_{root}_{plate}.html", defa ...

  7. gui2

    事件:描述发生了什么的对象. 存在各种不同类型的事件类用来描述各种类型的用户交互. 事件源:事件的产生器. 事件处理器:接收事件.解释事件并处理用户交互的方法. 比如在Button组件上点击鼠标会产生 ...

  8. 解决ideviceinstaller未安装的问题

    在Mac上,使用Appium时提示: Could not initialize ideviceinstaller; make sure it is installed and works on you ...

  9. ORA-00907: 缺失右括号

    创建表时出现ORA-00907: 缺失右括号的情况 调整关键字的顺序 CREATE TABLE s_dept(ID PRIMARY KEY NOT NULL NUMBER(7),NAME NOT NU ...

  10. Android应用开发-网络编程(一)(重制版)

    网络图片查看器 1. 确定图片的网址 2. 发送http请求 URL url = new URL(address); // 获取客户端和服务器的连接对象,此时还没有建立连接 HttpURLConnec ...