• Java--输入输出流


    转载来自:http://www.cnblogs.com/FishAndWater/p/3458074.html

    1:FileInputStream和FileOutputStream对象的常用方法总结

    FileInputStream:文件输入字节流,只能读取文件,节点流

    构造方法摘要
    FileInputStream(File file) 
              通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
    FileInputStream(FileDescriptor fdObj) 
              通过使用文件描述符 fdObj 创建一个FileInputStream,该文件描述符表示到文件系统中某个实际文件的现有连接。
    FileInputStream(String name) 
              通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的路径名 name 指定。
    方法摘要
     int available() 
              返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。
     void close() 
              关闭此文件输入流并释放与此流有关的所有系统资源。
    protected  void finalize() 
              确保在不再引用文件输入流时调用其close 方法。
     FileChannel getChannel() 
              返回与此文件输入流有关的唯一FileChannel 对象。
     FileDescriptor getFD() 
              返回表示到文件系统中实际文件的连接的 FileDescriptor 对象,该文件系统正被此FileInputStream 使用。
     int read() 
              从此输入流中读取一个数据字节。
     int read(byte[] b) 
              从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。
     int read(byte[] b, int off, int len) 
              从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。
     long skip(long n) 
              从输入流中跳过并丢弃 n 个字节的数据。

    其中read()返回的是读入的一个字节所对应的int值(0-255),而read(byte[] b) 和read(byte[] b, int off, int len) 返回的是读入的字节数

    FileOutputStream:输出文件流,写出到文件

    构造方法摘要
    FileOutputStream(File file) 
              创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
    FileOutputStream(File file, boolean append) 
              创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
    FileOutputStream(FileDescriptor fdObj) 
              创建一个向指定文件描述符处写入数据的输出文件流,该文件描述符表示一个到文件系统中的某个实际文件的现有连接。
    FileOutputStream(String name) 
              创建一个向具有指定名称的文件中写入数据的输出文件流。
    FileOutputStream(String name, boolean append) 
              创建一个向具有指定 name 的文件中写入数据的输出文件流。
    方法摘要
     void close() 
              关闭此文件输出流并释放与此流有关的所有系统资源。
    protected  void finalize() 
              清理到文件的连接,并确保在不再引用此文件输出流时调用此流的 close 方法。
     FileChannel getChannel() 
              返回与此文件输出流有关的唯一FileChannel 对象。
     FileDescriptor getFD() 
              返回与此流有关的文件描述符。
     void write(byte[] b) 
              将 b.length 个字节从指定 byte 数组写入此文件输出流中。
     void write(byte[] b, int off, int len) 
              将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。
     void write(int b) 
              将指定字节写入此文件输出流。

    2:BufferedInputStream和BufferedOutputStream---处理流

    比FileInputStream流的功能更多,详见http://download.oracle.com/technetwork/java/javase/6/docs/zh/api/java/io/BufferedInputStream.html

    对于其中的mark()和reset()方法的使用说明:

    根据JAVA官方文档的描述,mark(int readlimit)方法表示,标记当前位置,并保证在mark以后最多可以读取readlimit字节数据,mark标记仍有效。如果在mark后读取超过readlimit字节数据,mark标记就会失效,调用reset()方法会有异常。 
    但实际的运行情况却和JAVA文档中的描述并不完全相符。 有时候在BufferedInputStream类中调用mark(int readlimit)方法后,即使读取超过readlimit字节的数据,mark标记仍有效,仍然能正确调用reset方法重置。 

    事实上,mark在JAVA中的实现是和缓冲区相关的。只要缓冲区够大,mark后读取的数据没有超出缓冲区的大小,mark标记就不会失效。如果不够大,mark后又读取了大量的数据,导致缓冲区更新,原来标记的位置自然找不到了。

    因此,mark后读取多少字节才失效,并不完全由readlimit参数确定,也和BufferedInputStream类的缓冲区大小有关。 如果BufferedInputStream类的缓冲区大小大于readlimit,在mark以后只有读取超过缓冲区大小的数据,mark标记才会失效。

    JAVA中mark()和reset()用法的通俗理解

    mark就像书签一样,在这个BufferedReader对应的buffer里作个标记,以后再调用reset时就可以再回到这个mark过的地方。mark方法有个参数,通过这个整型参数,你告诉系统,希望在读出这么多个字符之前,这个mark保持有效。读过这么多字符之后,系统可以使mark不再有效,而你不能觉得奇怪或怪罪它。这跟buffer有关,如果你需要很长的距离,那么系统就必须分配很大的buffer来保持你的mark。

    另外补充:

    1,Scanner类总结

    Scanner scanner = new Scanner(System.in);

    使用Scanner类创建一个对象,并通过对象调用相应的方法输入相应的数据类型如:nextInt()/nextDouble()/nextFloat()...但是,没有nextString(),直接使用next()即可。

    scanner对象调用: nextByte(),nextDouble(),nextFloat,nextInt(),nextLin(),nextLong(),nextShot() 等方法读取用户在命令行输入的各种数据类型
    上述方法执行时都会造成堵塞,等待用户在命令行输入数据回车确认.

    注意区别nextInt()/nextLine()/next()三者:

    nextInt()方法会读取下一个int型标志的token.但是焦点不会移动到下一行,仍然处在这一行上;

    nextLine()方法会读取该行剩余的所有的内容,包括换行符,然后把焦点移动到下一行的开头;

    next()方法是以换行或者空格符为分界线接收下一个String类型变量。

    Scanner()构造函数的形式常用三种:

    Scanner(System.in);

    Scannner(string source);

    Scanner(File source);

    对象scanner常用方法:

       //useDelimiter(Pattern pattern)改变token的分割方式,默认的是空格,传Pattern对象 
       //useDelimiter(String pattern)改变token的分割方式,默认的是空格,传String 
        
       //hasNext();查看是否有token的分割段 
       //hasNextInt();查看是否有int类型的token的分割段 
       //nextInt();返回下一个int的数值 
       //nextLine();返回一行 
        
       //hasNext(Pattern pattern);返回下一个pattern类型的token 

    实例代码:

    public class ScannerTest { 
           public static void main(String[] args){ 
               String str = "1.1 22.2 s 4 5.3 6 7.5 8 9"; 
               Scanner scanner = new Scanner(str); 
               //scanner.useDelimiter("\."); 
               while(scanner.hasNext()){ 
                   if(scanner.hasNext(Pattern.compile("\d\.\d"))){ 
                       System.out.println(scanner.next()); 
                   }else{ 
                       scanner.next();//要调用一下next()相关的方法才会到下一个token 
                   } 
               }            
           } 
       } 

     2:使用装饰器模式decorator,将输入输出流分为底层的节点流和上层的处理流。

    详见http://www.cnblogs.com/zuoxiaolong/p/pattern11.html

  • 相关阅读:
    实现自己的Linq to Sql
    [分享] 浅谈项目需求变更管理
    【分享】老程序员的经验和价值在哪里?
    程序员是自己心中的“上帝”
    [分享]解析“程序员的十大技术烦恼”
    【分享】帮助你早些明白一些道理
    “风雨20年”的20条精辟编程经验
    【分享】 优秀程序员的代码是“活的”
    给开发人员培训时的语录
    【分享】SQL Server优化50法
  • 原文地址:https://www.cnblogs.com/graceting/p/4106881.html
Copyright © 2020-2023  润新知