A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王丽   /  2011-7-27 10:03  /  3145 人查看  /  5 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

问一下,在java io的类中,怎样知道哪些是对字符流,哪些是字节流,我晕晕的,有什么技巧吗?

评分

参与人数 1技术分 +1 收起 理由
admin + 1 新手报到!

查看全部评分

5 个回复

倒序浏览
分类          字节输入流                      字节输出流                  字符输入流              字符输出流
抽象基类       inputstream              outputstream                reader               writer
访问文件       FileInputStream          FileOutputStream           FileReader           FileWriter
访问数组       ByteArrayInputStream     ByteArrayOutputStream      CharArrayReader         CharArrayWriter
访问管道       PipedInputStream         PipedOutputStream          PipedReader           PipeWriter
访问字符串                                                                StringReader          StringWriter
缓冲流         BufferedInputStream      BufferedOutputStream       BufferReader             BufferWriter
转换流                                                                  InputStreamReade    OutputStreamWriter
对象流         ObjectInputStream         ObjectOutputStream        
抽象基类       FilterInputStream         FilterOutputStream         FilterReader             FilterWriter
打印流                                            PrintStream                                  PrintWriter
推回输入流        PushbackInputStream                               PushbackReader
特殊流           DataInputStream          DataInputStream

这个表中看到区别了么一般对字符流操作的后面都是Reader和writer这样你该明白点了吧 希望可以帮到你
[ 本帖最后由 包志恒 于 2011-07-27  10:11 编辑 ]
回复 使用道具 举报
黑马网友  发表于 2011-7-27 10:12:12
藤椅
晕怎么改都弄不顺了楼住对付这看吧:loveliness:
回复 使用道具 举报
黑马网友  发表于 2011-7-27 10:18:03
板凳
一.I/O 流(java 如何实现与外界数据的交流)
流定义:
  任何有能力产出数据的数据源对象或者有能力接收数据的数据源对象。他屏蔽了实际的I/O设备处理数据的细节。
1.Input/Output:指跨越出了JVM 的边界,与外界数据的源头或者目标数据源进行数据交换。

2.流的分类:
  按流向分为输入流和输出流;
  按传输单位分为字节流(Stream)结尾的和字符流(Reader和Writer);
  按功能还可以分为节点流和过滤流。
  节点流:负责数据源和程序之间建立连接;(相当于裸枪)
  过滤流:用于给节点增加功能。(相当于功能零部件)
  过滤流的构造方式是以其他流位参数构造(这样的设计模式称为装饰模式)。
注:I/O流是一类很宝贵的资源,使用完后必须调用close()方法关闭流并释放资源。在关闭流时只用关闭最外层的流。   
3.File 类(java.io.*)可表示一个文件,也有可能是一个目录
  (在JAVA 中文件和目录都属于这个类中,而且区分不是非常的明显  
4.Java.io 下的方法是对磁盘上的文件进行磁盘操作,但是无法读取文件的内容。
注意:创建一个文件对象和创建一个文件在JAVA 中是两个不同的概念。前者是在虚拟机中创建了一个文件,
  但却并没有将它真正地创建到OS 的文件系统中,随着虚拟机的关闭,这个创建的对象也就消失了。
  而创建一个文件才是在系统中真正地建立一个文件。   

二File类:我们猛看起来像是文件,其实他也可以指代一个文件集,当作为文件集时我们可以对此调用List方法。
  这个类的常用构造有: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也是过滤流,使节点流直接获得输出对象。
  [email]ganbin@tarena.com.cn[/email]
  最有用的方法:
  (1)writeObject(Object b)
  (2)readObject();该方法返回的是读到的一个对象,但是需要我们注意的是,该方法不会以返回null表示读到文件末尾。
  而是当读到文件末尾时会抛出一个IOException;
  6. 序列化一个对象并不一定会序列化该对象的父类对象
  7. 瞬间属性(临时属性)不参与序列化过程。
  8. 所有属性必须都是可序列化的,特别是当有些属性本身也是对象的时候,要尤其注意这一点。序列化的集合就要求集合中的每一个元素都是可序列化的。
  9. 用两次序列化把两个对象写到文件中去(以追加的方式),
  和用一次序列化把两个对象写进文件的大小是不一样的。
  因为每次追加时都会要在文件中加入一个开始标记和结束标记。所以对于对象的序列化不能以追加的方式写到文件中。
回复 使用道具 举报
黑马网友  发表于 2011-7-27 10:36:14
报纸
[color=Red]如果需要进行输入输出操作的内容是文本内容,就应该考虑使用字符流,如果是进行输入输出的二进制内容,就应该考虑字节流[/color]
[color=Blue]文本文件:[/color]所有能用记事本打开并且看到里面字符内容的文件称为文本文件,相反就是二进制文件
实质:计算机里面的文件都是二进制文件,文本文件只是二进制文件的一种特例,如果二进制文件里面的内容恰好能被正常解析成为字符的时候,二进制文件就变成了文本文件,更主要的即使是文本文件,如果我们打开文件强制使用了”错误“编码--就是和保存文件时候的编码不一样,那么看到的就是乱码,所以我们如果要看到正常的文本文件的内容,应该在打开文件的时候与保存文件的时候使用的编码级相同

如下两个列子刚在网上看到的:[color=Blue]第一种方法使用字节流,第二种使用字符流,但是第二个程序生成的文件打不开[/color]
第一个:使用FileInputStream,FileOutputStream   如下:[code=java]package cn.itcast.heima
import   java.io.*;
public   class   FileCopy   {
  private   String   in;
  private   String   out;
  public     FileCopy(String   inName,String   outName)   {
    in   =   inName;
    out   =   outName;
  }
  private   void   copyFile   ()   
    throws   Exception   {
      FileInputStream   fis   =   new   FileInputStream(in);
      FileOutputStream   fos   =   new   FileOutputStream(out);
      byte[]   b   =   new   byte[256];
      while(fis.read(b)!=-1)   {
        fos.write(b);
    }
    fis.close();
    fos.close();
  }
  public   static   void   main(String[]   args)   throws   Exception   {
    try   {
        FileCopy   fc   =   new   FileCopy( "f:\\help.bmp ", "g:\\help.bmp ");
    fc.copyFile();
    }
    catch   (Exception   e)   {
      e.printStackTrace();
    }
  }
}[/code]第二个用BufferedReader,BufferedWriter[code=java]package cn.itcast.heima
import   java.io.*;
public   class   FileCopy   {
      private   String   in;
      private   String   out;
      public     FileCopy(String   inName,String   outName)   {
            in   =   inName;
            out   =   outName;
      }
      private   void   copyFile   ()   throws   Exception   {
            BufferedReader   fis   =   new   BufferedReader(new   FileReader(in));
            BufferedWriter   fos   =   new   BufferedWriter(new   FileWriter(out));
            char[]   b   =   new   char[256];
            while(fis.read()!=   -1)   {
                  fos.write(b);
            }
            fis.close();
            fos.close();
      }
      public   static   void   main(String[]   args)   throws   Exception   {
            try   {
                  FileCopy   fc   =   new   FileCopy( "f:\\help1.bmp ", "g:\\help11.bmp ");
                  fc.copyFile();
            } catch   (Exception   e)   {
                  e.printStackTrace();
            }
      }
}[/code]这是因为:[color=Red]图片属于二进制文件,不能以文本文件打开,就象用文本打开可执行文件再保存后明显的文件所尺寸不一样啦[/color]
回复 使用道具 举报
黑马网友  发表于 2011-7-27 10:49:29
地板
我是这样区分的 : 类名后面部分带[color=#FF0000]InputStream[/color]或者[color=#FF0000]OutputStream [/color]字样的我分为字节流, 类名后面部分带[color=#FF0000]Reader [/color]或者[color=#FF0000]Writer[/color]字样的为字符流。也不知道是不是绝对的,但我所发现都是这样子的。

[size=3][/size]
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马