`

浅谈java输入输出流(二)

    博客分类:
  • java
阅读更多

导读:
  stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。在Java的IO中,所有的stream(包括Inputstream和Out stream)都包括两种类型:
  (1)字节流
  表示以字节为单位从stream中读取或往stream中写入信息,即io包中的inputstream类和outputstream类的派生类。通常用来读取二进制数据,如图象和声音。
  (2)字符流
  以Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取或往stream中写入信息。
  区别:
  Reader和Writer要解决的,最主要的问题就是国际化。原先的I/O类库只支持8位的字节流,因此不可能很好地处理16位的Unicode字符流。Unicode是国际化的字符集(更何况Java内置的char就是16位的Unicode字符),这样加了Reader和Writer之后,所有的I/O就都支持Unicode了。此外新类库的性能也比旧的好。
  但是,Read和Write并不是取代InputStream和OutputStream,有时,你还必须同时使用"基于byte的类"和"基于字符的类"。为此,它还提供了两个"适配器(adapter)"类。InputStreamReader负责将InputStream转化成Reader,而OutputStreamWriter则将OutputStream转化成Writer。
  一.流的层次结构
  定义:
  (1) java将读取数据对象成为输入流,能向其写入的对象叫输出流。结构图如下:输入流:
  
  
  输出流
  
  
  二.InputStream类
  inputstream类和outputstream类都为抽象类,不能创建对象,可以通过子类来实例化。
  InputStream是输入字节数据用的类,所以InputStream类提供了3种重载的read方法.Inputstream类中的常用方法:
  (1) public abstract int read( ):读取一个byte的数据,返回值是高位补0的int类型值。
  
  (2) public int read(byte b[ ]):读取b.length个字节的数据放到b数组中。返回值是读取的字节数。该方法实际上是调用下一个方法实现的
  
  (3) public int read(byte b[ ], int off, int len):从输入流中最多读取len个字节的数据,存放到偏移量为off的b数组中。
  
  (4) public int available( ):返回输入流中可以读取的字节数。注意:若输入阻塞,当前线程将被挂起,如果InputStream对象调用这个方法的话,它只会返回0,这个方法必须由继承InputStream类的子类对象调用才有用,
  
  (5) public long skip(long n):忽略输入流中的n个字节,返回值是实际忽略的字节数, 跳过一些字节来读取
  
  (6) public int close( ) :我们在使用完后,必须对我们打开的流进行关闭.
  三.OutputStream类
  OutputStream提供了3个write方法来做数据的输出,这个是和InputStream是相对应的。
  
  1. public void write(byte b[ ]):将参数b中的字节写到输出流。
  2. public void write(byte b[ ], int off, int len) :将参数b的从偏移量off开始的len个字节写到输出流。
  3. public abstract void write(int b) :先将int转换为byte类型,把低字节写入到输出流中。
  4. public void flush( ) : 将数据缓冲区中数据全部输出,并清空缓冲区。
  5. public void close( ) : 关闭输出流并释放与流相关的系统资源。
  
  注意:
  1. 上述各方法都有可能引起异常。
  2. InputStream和OutputStream都是抽象类,不能创建这种类型的对象。
  四.FileInputStream类
  FileInputStream类是InputStream类的子类,用来处理以文件作为数据输入源的数据流。使用方法:
  方式1:
  File fin=new File("d:/abc.txt");
  FileInputStream in=new FileInputStream(fin);
  方式2:
  FileInputStream in=new
  FileInputStream("d: /abc.txt");
  方式3:
  构造函数将 FileDescriptor()对象作为其参数。
  FileDescriptor() fd=new FileDescriptor();
  FileInputStream f2=new FileInputStream(fd);
  
  五.FileOutputStream类
  FileOutputStream类用来处理以文件作为数据输出目的数据流;一个表示文件名的字符串,也可以是File或FileDescriptor对象。
  创建一个文件流对象有两种方法:
  方式1:
  File f=new File("d:/abc.txt");
  FileOutputStream out=new FileOutputStream (f);
  方式2:
  FileOutputStream out=new
  FileOutputStream("d:/abc.txt");
  方式3:构造函数将 FileDescriptor()对象作为其参数。
  FileDescriptor() fd=new FileDescriptor();
  FileOutputStream f2=new FileOutputStream(fd);
  方式4:构造函数将文件名作为其第一参数,将布尔值作为第二参数。
  FileOutputStream f=new FileOutputStream("d:/abc.txt",true);
  注意:
  (1)文件中写数据时,若文件已经存在,则覆盖存在的文件;(2)的读/写操作结束时,应调用close方法关闭流。
  
  举例:2-1
  六.File类
  File类与InputStream / OutputStream类同属于一个包,它不允许访问文件内容。
  File类主要用于命名文件、查询文件属性和处理文件目录。
  举例:2-2
  七.从一个流构造另一个流
  java的流类提供了结构化方法,如,底层流和高层过滤流。
  而高层流不是从输入设备读取,而是从其他流读取。同样高层输出流也不是写入输出设备,而是写入其他流。
  使用"分层对象(layered objects)",为单个对象动态地,透明地添加功能的做法,被称为Decorator Pattern。Decorator模式要求所有包覆在原始对象之外的对象,都必须具有与之完全相同的接口。这使得decorator的用法变得非常的透明--无论对象是否被decorate过,传给它的消息总是相同的。这也是Java I/O类库要有"filter(过滤器)"类的原因:抽象的"filter"类是所有decorator的基类。Decorator模式常用于如下的情形:如果用继承来解决各种需求的话,类的数量会多到不切实际的地步。Java的I/O类库需要提供很多功能的组合,于是decorator模式就有了用武之地。
  为InputStream和OutputStream定义decorator类接口的类,分别是FilterInputStream和FilterOutputStream。
  7.1 FilterInputStream
  FilterInputStream的种类
  类 功能 构造函数的参数
  用法
  DataInputStream 与DataOutputStream配合使用,这样你就能以一种"可携带的方式(portable fashion)"从流里读取primitives了(int,char,long等) InputStream
  包含了一整套读取primitive数据的接口。
  BufferedInputStream 用这个类来解决"每次要用数据的时候都要进行物理读取"的问题。你的意思是"用缓冲区。" InputStream,以及可选的缓冲区的容量
  它本身并不提供接口,只是提供一个缓冲区。需要连到一个"有接口的对象(interface object)"。
  LineNumberInputStream 跟踪输入流的行号;有getLineNumber( )和setLineNumber(int)方法 InputStream
  只是加一个行号,所以还得连一个"有接口的对象"。
  PushbackInputStream 有一个"弹压单字节"的缓冲区(has a one byte push-back buffer),这样你就能把最后读到的那个字节再压回去了。 InputStream
  主要用于编译器的扫描程序。可能是为支持Java的编译器而设计的。用的机会不多。
  
  FilterOutputStream的种类
  类 功能 构造函数的参数
  用法
  DataOutputStream 与DataInputStream配合使用,这样你就可以用一种"可携带的方式(portable fashion)"往流里写primitive了(int, char, long,等) OutputStream
  包括写入primitive数据的全套接口。
  PrintStream 负责生成带格式的输出(formatted output)。DataOutputStrem负责数据的存储,而PrintStream负责数据的显示。 一个OutputStream以及一个可选的boolean值。这个boolean值表示,要不要清空换行符后面的缓冲区。
  应该是OutputStream对象的最终包覆层。用的机会很多。
  BufferedOutputStream 用 这个类解决"每次往流里写数据,都要进行物理操作"的问题。也就是说"用缓冲区"。用flush( )清空缓冲区。 OutputStream, 以及一个可选的缓冲区大小
  本身并不提供接口,只是加了一个缓冲区。需要链接一个有接口的对象。
  
  
  DataInputStream类对象可以读取各种类型的数据。
  DataOutputStream类对象可以写各种类型的数据;
  创建这两类对象时,必须使新建立的对象指向构造函数中的参数对象。例如:
  FileInputStream in=new FileInputStream("d:/abc.txt");
  DataInputStream din=new DataInputStream(in);
  7.2BufferInputStream和bufferOutputStream
  允许程序在不降低系统性能的情况下一次一个字节的从流中读取数据。
  BufferInputstream定义了两种构造函数
  (1) BufferInputStream b= new BufferInputstream(in);
  (2) BufferInputStream b=new BufferInputStream(in,size)
  第二个参数表示指定缓冲器的大小。
  同样BufferOutputStream也有两种构造函数。一次一个字节的向流中写数据。
  
  7.3printstream
  用于写入文本或基本类型
  两种构造函数方法:
  PrintStream ps=new PrintStream(out);
  PrintStream ps=new PrintStream(out, autoflush)
  第二个参数为布尔值,控制每次输出换行符时java是否刷新输出流。
  
  
  
  八.字符流的读取和写入
  java.io.Reader 和 java.io.InputStream 组成了 Java 输入类。Reader 用于读入16位字符,也就是 Unicode 编码的字符;而 InputStream 用于读入 ASCII 字符和二进制数据。
  Reader的体系结构
  
  
  (1) FileReader
  FileReader主要用来读取字符文件,使用缺省的字符编码,有三种构造函数:
  --将文件名作为字符串
  FileReader f=new FileReader(“c:/temp.txt”);
  --构造函数将File对象作为其参数。
  File f=new file(“c:/temp.txt”);
  FileReader f1=new FileReader(f);
  --构造函数将FileDescriptor对象作为参数
  FileDescriptor() fd=new FileDescriptor()
  FileReader f2=new FileReader(fd);
  (2) charArrayReader
  将字符数组作为输入流,构造函数为:
  public CharArrayReader(char[] ch);
  (3) StringReader
  读取字符串,构造函数如下:
  public StringReader(String s);
  (4) InputStreamReader
  从输入流读取字节,在将它们转换成字符。
  Public inputstreamReader(inputstream is);
  (5) FilterReader
  允许过滤字符流
  protected filterReader(Reader r);
  (6) BufferReader
  接受Reader对象作为参数,并对其添加字符缓冲器,使用readline()方法可以读取一行。
  Public BufferReader(Reader r);
  
  Writer类体系结构
  
  
  (1) FileWrite
  将字符类型数据写入文件,使用缺省字符编码和缓冲器大小。
  Public FileWrite(file f);
  (2)chararrayWrite()
  将字符缓冲器用作输出。
  Public CharArrayWrite();
  (3) PrintWrite
  生成格式化输出
  public PrintWriter(outputstream os);
  (4) filterWriter
  用于写入过滤字符流
  protected FilterWriter(Writer w);
  
  FilterOutputStream的种类
  类 功能 构造函数的参数
  用法
  DataOutputStream 与DataInputStream配合使用,这样你就可以用一种"可携带的方式(portable fashion)"往流里写primitive了(int, char, long,等) OutputStream
  包括写入primitive数据的全套接口。
  PrintStream 负责生成带格式的输出(formatted output)。DataOutputStrem负责数据的存储,而PrintStream负责数据的显示。 一个OutputStream以及一个可选的boolean值。这个boolean值表示,要不要清空换行符后面的缓冲区。
  应该是OutputStream对象的最终包覆层。用的机会很多。
  BufferedOutputStream 用 这个类解决"每次往流里写数据,都要进行物理操作"的问题。也就是说"用缓冲区"。用flush( )清空缓冲区。 OutputStream, 以及一个可选的缓冲区大小
  本身并不提供接口,只是加了一个缓冲区。需要链接一个有接口的对象。
  
  
  DataInputStream类对象可以读取各种类型的数据。
  DataOutputStream类对象可以写各种类型的数据;
  创建这两类对象时,必须使新建立的对象指向构造函数中的参数对象。例如:
  FileInputStream in=new FileInputStream("d:/abc.txt");
  DataInputStream din=new DataInputStream(in);
  7.2BufferInputStream和bufferOutputStream
  允许程序在不降低系统性能的情况下一次一个字节的从流中读取数据。
  BufferInputstream定义了两种构造函数
  (1) BufferInputStream b= new BufferInputstream(in);
  (2) BufferInputStream b=new BufferInputStream(in,size)
  第二个参数表示指定缓冲器的大小。
  同样BufferOutputStream也有两种构造函数。一次一个字节的向流中写数据。
  
  7.3printstream
  用于写入文本或基本类型
  两种构造函数方法:
  PrintStream ps=new PrintStream(out);
  PrintStream ps=new PrintStream(out, autoflush)
  第二个参数为布尔值,控制每次输出换行符时java是否刷新输出流。
  
  
  
  八.字符流的读取和写入
  java.io.Reader 和 java.io.InputStream 组成了 Java 输入类。Reader 用于读入16位字符,也就是 Unicode 编码的字符;而 InputStream 用于读入 ASCII 字符和二进制数据。
  Reader的体系结构
  
  
  (1) FileReader
  FileReader主要用来读取字符文件,使用缺省的字符编码,有三种构造函数:
  --将文件名作为字符串
  FileReader f=new FileReader(“c:/temp.txt”);
  --构造函数将File对象作为其参数。
  File f=new file(“c:/temp.txt”);
  FileReader f1=new FileReader(f);
  --构造函数将FileDescriptor对象作为参数
  FileDescriptor() fd=new FileDescriptor()
  FileReader f2=new FileReader(fd);
  (2) charArrayReader
  将字符数组作为输入流,构造函数为:
  public CharArrayReader(char[] ch);
  (3) StringReader
  读取字符串,构造函数如下:
  public StringReader(String s);
  (4) InputStreamReader
  从输入流读取字节,在将它们转换成字符。
  Public inputstreamReader(inputstream is);
  (5) FilterReader
  允许过滤字符流
  protected filterReader(Reader r);
  (6) BufferReader
  接受Reader对象作为参数,并对其添加字符缓冲器,使用readline()方法可以读取一行。
  Public BufferReader(Reader r);
  
  Writer类体系结构
  
  
  (1) FileWrite
  将字符类型数据写入文件,使用缺省字符编码和缓冲器大小。
  Public FileWrite(file f);
  (2)chararrayWrite()
  将字符缓冲器用作输出。
  Public CharArrayWrite();
  (3) PrintWrite
  生成格式化输出
  public PrintWriter(outputstream os);
  (4) filterWriter
  用于写入过滤字符流
  protected FilterWriter(Writer w);

本文转自
http://cyp-034.blog.163.com/blog/static/2823190520074691849380/

分享到:
评论

相关推荐

    浅谈Java的输入输出流

    网上找的Java的输入输出流 详细文档,很适合初学者。多看多练

    浅谈Java的输入输出流.pdf

    ### Java的输入输出流概述 #### 一、引言 Java 的输入输出(I/O)功能强大且灵活,为开发者提供了处理各种数据源的能力。I/O 操作涉及到的数据源包括但不限于文件、内存、网络连接等。尽管 I/O 操作强大,但其复杂...

    浅谈输入输出流

    ### 浅谈Java输入输出流 #### 一、引言 Java作为一种广泛应用的编程语言,在处理数据时提供了非常强大且灵活的输入输出功能。然而,Java的输入输出操作可能看起来较为复杂,因为开发者通常需要处理多种不同的对象...

    软件工程师-浅谈Java的输入输出流技术步骤说明.pdf

    "Java 输入/输出流技术步骤说明" Java 中的流可以分为两种:字节流和字符流。字节流是指以字节为单位的流,主要用于处理二进制数据,而字符流是指以字符为单位的流,主要用于处理文本数据。Java 中的流都是从四个...

    2021-2022年收藏的精品资料软件工程师浅谈Java的输入输出流技术步骤说明.docx

    Java的输入输出流技术是Java编程中不可或缺的一部分,它提供了数据传输和处理的途径,涵盖了文件操作、网络通信、标准输入输出等多种场景。在Java中,流被分为两大类:字节流和字符流。 字节流主要由两个抽象基类...

    浅谈JAVA中输入输出流实例详解

    Java中的输入输出流是编程中不可或缺的一部分,它们用于在程序和外部资源之间传输数据。Java提供了丰富的类库来支持各种类型的输入输出操作,包括文件操作、网络通信、数据压缩等。这里我们将深入探讨Java中的输入...

    浅谈标准数据流---对java数据流的体会

    ### 标准输入输出流(System.in/out/err) Java中定义了三个标准的数据流,它们分别是: - **System.in**:这是标准输入流,通常用于从控制台接收用户输入。它是一个`InputStream`对象。 - **System.out**:这是标准...

    浅谈Socket编程及Java实现

    总之,Java 中的 Socket 编程是实现客户端-服务器应用程序的关键技术,它基于 TCP/IP 协议,通过输入输出流进行数据交换。虽然相比其他高级的网络通信库,Socket 编程可能较为繁琐,但它提供了更底层的控制,适用于...

    浅谈java之IO学习经验

    - `FileOutputStream`:向文件写入数据的输出流。 - **字符流**: - `FileReader`:以字符形式读取文本文件。 - `FileWriter`:以字符形式向文本文件写入数据。 #### 缓冲流 为了提高数据读写的效率,Java提供...

    浅谈java IO流——四大抽象类

    java IO流是java语言中用于输入输出操作的基本类库,IO流是Java程序中最基本也最重要的一部分,java IO流主要可以分为两大类:字节流和字符流。在java中,四大抽象类是IO流的基础,它们分别是InputStream、...

    浅谈JAVA 内存流的实现

    Java内存流,主要指的是ByteArrayInputStream和ByteArrayOutputStream这两个类,它们分别代表了内存中的输入流和输出流。在Java中,通常我们处理输入和输出时,会涉及到文件操作,但内存流允许我们在内存中进行数据...

    java之浅谈深说--教你如何成长

    ### Java之浅谈深说——教你如何成长为Java编程高手 在IT行业中,Java作为一种广泛使用的编程语言,其重要性不言而喻。对于希望成为Java编程高手的学习者来说,掌握正确的学习路径至关重要。本文将根据提供的标题、...

    浅谈java8 stream flatMap流的扁平化操作

    浅谈 Java8 Stream flatMap 流的扁平化操作 Java8 中的 Stream 是一个新概念,它不是输入输出的 Stream 流,而是一种用函数式编程方式在集合类上进行复杂操作的工具。Stream 提供了两种操作:中间操作和终止操作。...

Global site tag (gtag.js) - Google Analytics