欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

-java IO,

来源: javaer 分享于  点击 34936 次 点评:141

-java IO,




      在java 中,向文件的读取是通过流的形式进行的,我们在学习的时候把一次想象成一根管道,读取文件的操作就是从这根管道进行的。

       流的分类: 按流向分为输了出流(OutputStream)和输入流(InputStream);

 按传输单位分为字节流和字符流。

还分为节点流和过滤流。



创建一个文件对象和创建一个文件在JAVA 中是两个不同的概念。前者是在虚拟机中创建了一个文件,

  但却并没有将它真正地创建到OS 的文件系统中,随着虚拟机的关闭,这个创建的对象也就消失了。
  而创建一个文件才是在系统中真正地建立一个文件。 

  File类(java.io.* )可表示一个目录,

这个类的常用构造有:File("路径"),File(“前边路径”,“后边路径”)File(File,“路径”)
  这个类的常用方法:exists(),delete(),getName(),getPath(),isDirectory(),isFile(),length(),
  listFile(FileFilter),主要用来过滤文件这里有(可以用来嵌套内部类) 
  mkdir(),mkdirs(),toString(),
  FileFilter接口只有accept方法,其返回值为Boolean型,可以在其里边写一些正则表达式来对文件进行筛选。
  这里需要注意的是传入accept的参数必须是final类型(匿名内部类的要求),这样他才能使用该类范围之外的对象。


字节流:

InputStream/OutputStream 所有输入输入流的父类,是抽象类。
  子类有:FileInputStream/FileOutputStream(节点流)(注意FileInputStream(path名,boolean)Boolean为true 表示拼接)
  DataInputStream/DataOutputStream 数据输入流允许应用程序以与"机器无关方式"
  从底层输入流中读取基本 Java 数据类型 (8种基本类型,加一种String)读入写出时类型必须一致
  BufferedInputStream/BufferedOutputStream 字节缓冲流 用于给节点流增加一个缓冲的功能。(典型的牺牲空间换时间)
  1.字节输入流:io包中的InputStream为所有字节输入流的父类。
  Int read();读入一个字节(每次一个);
  可先使用new byte[]=数组,调用read(byte[] b)
  read (byte[])返回值可以表示有效数;read (byte[])返回值为-1 表示结束。 
  2.在流中close()方法由程序员控制。因为输入输出流已经超越了JVM的边界,所以有时可能无法回收资源。
  原则:凡是跨出虚拟机边界的资源都要求程序员自己关闭,不要指望垃圾回收。   

字符编码把字符转换成数字存储到计算机中,按ASCii 将字母映射为整数。
  把数字从计算机转换成相应的字符的过程称为解码。
  乱码的根源在于编解码方式不统一。在世界上任何一种编码方式中都会向上兼容ASCII码。所以英文没有乱码。
  编码方式的分类:
  ASCII(数字、英文):1 个字符占一个字节(所有的编码集都兼容ASCII)
  ISO8859-1(欧洲):1 个字符占一个字节
  GB-2312/GBK:1 个字符占两个字节。GB代表国家标准。
  GBK是在GB-2312上增加的一类新的编码方式,也是现在最常用的汉字编码方式。
  Unicode: 1 个字符占两个字节(网络传输速度慢)
  UTF-8:变长字节,对于英文一个字节,汉字三个字节。
  原则:保证编解码方式的统一,才能不至于出现错误。  
  I/O学习种常范的两个错误 1。忘了加flush2.没有加换行。

中文的汉字如果用字节的方式进行存取,那么的话呢。这样会是乱码的。

所以为了处理这个问题, 我们引进了字符流的概念。

字符流
  Reader/Writer所有字符流的父类
  其子类有
  InputStreamReader/OutputStreamWriter 称为从字节流到字符流的桥转换类。这个类可以设定字符转换方式 
  FileReader/FileWriter (FileInputStream/FileOutputStream和InputStreamReader/OutputStreamWriter)的组合,只能是本地默认编码
  Bufferedreader/BufferedWriter个字符缓冲流,其特有方法readLine()读取一个文本行,newLine()表示Writer到下一个文本行。。



  我们想在计算机中存储一个对象的话跜 ,我们可以用对象流。把一个对象序列化后存储在计算机中



  1. 定义:把一个对象通过I/O流写到文件(持久性介质)上的过程叫做对象的序列化。
  2. 序列化接口:Serializable
  此接口没有任何的方法,这样的接口称为标记接口。
  3. 不是所有对象都能序列化的,只有实现了Serializable的类,他的实例对象才是可序列化的。
  4. 在Java种定义了一套序列化规范,对象的编码和解码方式都是已经定义好的。
  5. class ObjectOutputStream 和ObjectInputStream也是过滤流,使节点流直接获得输出对象。
  ganbin@tarena.com.cn
  最有用的方法:
  (1)writeObject(Object b)
  (2)readObject();该方法返回的是读到的一个对象,但是需要我们注意的是,该方法不会以返回null表示读到文件末尾。
  而是当读到文件末尾时会抛出一个IOException;
  6. 序列化一个对象并不一定会序列化该对象的父类对象
  7. 瞬间属性(临时属性)不参与序列化过程。
  8. 所有属性必须都是可序列化的,特别是当有些属性本身也是对象的时候,要尤其注意这一点。序列化的集合就要求集合中的每一个元素都是可序列化的。
  9. 用两次序列化把两个对象写到文件中去(以追加的方式),
  和用一次序列化把两个对象写进文件的大小是不一样的。
  因为每次追加时都会要在文件中加入一个开始标记和结束标记。所以对于对象的序列化不能以追加的方式写到文件中。



  • 对我有用[2]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
回复次数:16

相关文章

    暂无相关文章
相关栏目:

用户点评