目录
4 数据流分类:
1. 命令行参数
2. 标准输入,输出数据流
1. io流的四个基本类
1. io流的具体分类
 1. InputStream抽象类 
 2.OutputStream抽象类 
3. 文件输入流: FileInputStream类
5. FileInputStream流和FileOutputStream的应用
6. 缓冲输入输出流 BufferedInputStream/ BufferedOutputStream
1. Reader抽象类
2. Writer抽象类
3 .InputStream与Reader差别 OutputStream与Writer差别
首页 Java java教程 Java输入流输出流

Java输入流输出流

May 28, 2017 am 11:28 AM
输入


1.什么是IO

      Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法。任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法。  

      Java.io是大多数面向数据流的输入/输出类的主要软件包。此外,Java也对块传输提供支持,在核心库 java.nio中采用的便是块IO。

  流IO的好处是简单易用,缺点是效率较低。块IO效率很高,但编程比较复杂。 
      Java IO模型  :
      Java的IO模型设计非常优秀,它使用Decorator模式,按功能划分Stream,您可以动态装配这些Stream,以便获得您需要的功能。例如,您需要一个具有缓冲的文件输入流,则应当组合使用FileInputStream和BufferedInputStream。 

 



2.数据流的基本概念

 

 

        数据流是一串连续不断的数据的集合,就象水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股连续不断的水流。数据写入程序可以是一段、一段地向数据流管道中写入数据,这些数据段会按先后顺序形成一个长的数据流。对数据读取程序来说,看不到数据流在写入时的分段情况,每次可以读取其中的任意长度的数据,但只能先读取前面的数据后,再读取后面的数据。不管写入时是将数据分多次写入,还是作为一个整体一次写入,读取时的效果都是完全一样的。 

      “流是磁盘或其它外围设备中存储的数据的源点或终点。”

    在电脑上的数据有三种存储方式,一种是外存,一种是内存,一种是缓存。比如电脑上的硬盘,磁盘,U盘等都是外存,在电脑上有内存条,缓存是在CPU里面的。外存的存储量最大,其次是内存,最后是缓存,但是外存的数据的读取最慢,其次是内存,缓存最快。这里总结从外存读取数据到内存以及将数据从内存写到外存中。对于内存和外存的理解,我们可以简单的理解为容器,即外存是一个容器,内存又是另外一个容器。那又怎样把放在外存这个容器内的数据读取到内存这个容器以及怎么把内存这个容器里的数据存到外存中呢?

     在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:

         标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流等等,java中将输入输出抽象称为流,就好像水管,将两个容器连接起来。将数据冲外存中读取到内存中的称为输入流,将数据从内存写入外存中的称为输出流。

    流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。


      总结的基本概念如下:

1) 数据流

    一组有序,有起点和终点的字节的数据序列。包括输入流和输出流。

  

2) 输入流(Input  Stream):

      程序从输入流读取数据源。数据源包括外界(键盘、文件、网络…),即是将数据源读入到程序的通信通道

     

 3) 输出流

    程序向输出流写入数据。将程序中的数据输出到外界(显示器、打印机、文件、网络…)的通信通道。

         

采用数据流的目的就是使得输出输入独立于设备。

Input  Stream不关心数据源来自何种设备(键盘,文件,网络)
Output  Stream不关心数据的目的是何种设备(键盘,文件,网络)

4 数据流分类:

流序列中的数据既可以是未经加工的原始二进制数据,也可以是经一定编码处理后符合某种格式规定的特定数据。因此Java中的流分为两种:
 1)  字节流:数据流中最小的数据单元是字节
 2)  字符流:数据流中最小的数据单元是字符, Java中的字符是Unicode编码,一个字符占用两个字节。

 

 



3. 标准I/O

 

      Java程序可通过命令行参数与外界进行简短的信息交换,同时,也规定了与标准输入、输出设备,如键盘、显示器进行信息交换的方式。而通过文件可以与外界进行任意数据形式的信息交换。

1. 命令行参数

 


  1. public class TestArgs {  

  2.     public static void main(String[] args) {  

  3.         for (int i = 0; i < args.length; i++) {

  4. System.out.println("args[" + i + "] is <" + args[i] + ">");  

  5.         }  

  6.     }  

  7. }  


 

运行命令:Java Java C VB

运行结果:

args[0] is

args[1] is

args[2] is

 

2. 标准输入,输出数据流

java系统自带的标准数据流:java.lang.System:

 


  1. java.lang.System   

  2. public final class System  extends Object{   

  3.    static  PrintStream  err;//标准错误流(输出)  

  4.    static  InputStream  in;//标准输入(键盘输入流)  

  5.    static  PrintStream  out;//标准输出流(显示器输出流)  

  6. }  


 

注意:
(1)System类不能创建对象,只能直接使用它的三个静态成员。
(2)每当main方法被执行时,就自动生成上述三个对象。

1) 标准输出流 System.out

   System.out向标准输出设备输出数据,其数据类型为PrintStream。方法:

 

      Void print(参数)

      Void println(参数)

 

2)标准输入流 System.in

    System.in读取标准输入设备数据(从标准输入获取数据,一般是键盘),其数 据类型为InputStream。方法:

 

        int read()  //返回ASCII码。若,返回值=-1,说明没有读取到任何字节读取工作结束。

         int read(byte[] b)//读入多个字节到缓冲区b中返回值是读入的字节数

例如:



  1. import java.io.*;  

  2. public class StandardInputOutput {  

  3.     public static void main(String args[]) {  

  4.         int b;  

  5.         try {  

  6.             System.out.println("please Input:");  

  7.             while ((b = System.in.read()) != -1) {  

  8.                 System.out.print((char) b);  

  9.             }  

  10.         } catch (IOException e) {  

  11.             System.out.println(e.toString());  

  12.         }  

  13.     }  

  14. }  


等待键盘输入,键盘输入什么,就打印出什么:

 

3)标准错误流

   System.err输出标准错误,其数据类型为PrintStream。可查阅API获得详细说明。

 

    标准输出通过System.out调用println方法输出参数并换行,而print方法输出参数但不换行。println或print方法都通 过重载实现了输出基本数据类型的多个方法,包括输出参数类型为boolean、char、int、long、float和double。同时,也重载实现 了输出参数类型为char[]、String和Object的方法。其中,print(Object)和println(Object)方法在运行时将调 用参数Object的toString方法。

 


  1. import java.io.BufferedReader;  

  2. import java.io.IOException;  

  3. import java.io.InputStreamReader;  


  4. public class StandardInputOutput {  

  5.     public static void main(String args[]) {  

  6.         String s;  

  7.         // 创建缓冲区阅读器从键盘逐行读入数据  

  8.         InputStreamReader ir = new InputStreamReader(System.in);  

  9.         BufferedReader in = new BufferedReader(ir);  

  10.         System.out.println("Unix系统: ctrl-d 或 ctrl-c 退出"  

  11.                 + "\nWindows系统: ctrl-z 退出");  

  12.         try {  

  13.             // 读一行数据,并标准输出至显示器  

  14.             s = in.readLine();  

  15.             // readLine()方法运行时若发生I/O错误,将抛出IOException异常  

  16.             while (s != null) {  

  17.                 System.out.println("Read: " + s);  

  18.                 s = in.readLine();  

  19.             }  

  20.             // 关闭缓冲阅读器  

  21.             in.close();  

  22.         } catch (IOException e) { // Catch any IO exceptions.  

  23.             e.printStackTrace();  

  24.         }  

  25.     }  

  26. }  


 

 



4.java.IO层次体系结构

     在整个Java.io包中最重要的就是5个类和一个接口。5个类指的是File、OutputStream、InputStream、Writer、Reader;一个接口指的是Serializable.掌握了这些IO的核心操作那么对于Java中的IO体系也就有了一个初步的认识了

 

      Java I/O主要包括如下几个层次,包含三个部分:

 

   1.流式部分――IO的主体部分;

   2.非流式部分――主要包含一些辅助流式部分的类,如:File类、RandomAccessFile类和FileDescriptor等类;

   3.其他类--文件读取部分的与安全相关的类,如:SerializablePermission类,以及与本地操作系统相关的文件系统的类,如:FileSystem类和Win32FileSystem类和WinNTFileSystem类。

   主要的类如下:

     1. File(文件特征与管理):用于文件或者目录的描述信息,例如生成新目录,修改文件名,删除文件,判断文件所在路径等。

     2. InputStream(二进制格式操作):抽象类,基于字节的输入操作,是所有输入流的父类。定义了所有输入流都具有的共同特征。

     3. OutputStream(二进制格式操作):抽象类。基于字节的输出操作。是所有输出流的父类。定义了所有输出流都具有的共同特征。

     Java中字符是采用Unicode标准,一个字符是16位,即一个字符使用两个字节来表示。为此,JAVA中引入了处理字符的流。

     4. Reader(文件格式操作):抽象类,基于字符的输入操作。

     5. Writer(文件格式操作):抽象类,基于字符的输出操作。

     6. RandomAccessFile(随机文件操作):它的功能丰富,可以从文件的任意位置进行存取(输入输出)操作

 

     Java中IO流的体系结构如图:

     


 


 



5. 非流式文件类--File类

 

在Java语言的java.io包中,由File类提供了描述文件和目录的操作与管理方法。但File类不是InputStream、OutputStream或Reader、Writer的子类,因为它不负责数据的输入输出,而专门用来管理磁盘文件与目录。

 

作用:File类主要用于命名文件、查询文件属性处理文件目录。


  1. public    class   File   extends Object   

  2.     implements Serializable,Comparable  

  3. {}  


 

File类共提供了三个不同的构造函数,以不同的参数形式灵活地接收文件和目录名信息。构造函数:
1)File (String   pathname)   

     例:File  f1=new File("FileTest1.txt"); //创建文件对象f1,f1所指的文件是在当前目录下创建的FileTest1.txt
2)File (String  parent  ,  String child)

     例:File f2=new  File(“D:\\dir1","FileTest2.txt") ;//  注意:D:\\dir1目录事先必须存在,否则异常
3)File (File    parent  , String child)
     例:File  f4=new File("\\dir3");
          File  f5=new File(f4,"FileTest5.txt");  //在如果 \\dir3目录不存在使用f4.mkdir()先创建

        一个对应于某磁盘文件或目录的File对象一经创建, 就可以通过调用它的方法来获得文件或目录的属性。    

       1)public boolean exists( ) 判断文件或目录是否存在
       2)public boolean isFile( ) 判断是文件还是目录 
       3)public boolean isDirectory( ) 判断是文件还是目录
       4)public String getName( ) 返回文件名或目录名
       5)public String getPath( ) 返回文件或目录的路径。
       6)public long length( ) 获取文件的长度 
       7)public String[ ] list ( ) 将目录中所有文件名保存在字符串数组中返回。 

       File类中还定义了一些对文件或目录进行管理、操作的方法,常用的方法有:
       1) public boolean renameTo( File newFile );    重命名文件
       2) public void delete( );   删除文件
       3)  public boolean mkdir( ); 创建目录

例子:


 


  1. import java.io.File;  

  2. import java.io.IOException;  

  3. public class TestFile {  

  4.     public static void main(String args[]) throws IOException {  

  5.         File dir = new File("\\root");  

  6.         File f1 = new File(dir, "fileOne.txt");  

  7.         File f2 = new File(dir, "fileTwo.java");  

  8.         // 文件对象创建后,指定的文件或目录不一定物理上存在  

  9.         if (!dir.exists())  

  10.             dir.mkdir();  

  11.         if (!f1.exists())  

  12.             f1.createNewFile();  

  13.         if (!f2.exists())  

  14.             f2.createNewFile();  

  15.         System.out.println("f1's AbsolutePath=  " + f1.getAbsolutePath());  

  16.         System.out.println("f1 Canread=" + f1.canRead());  

  17.         System.out.println("f1's len= " + f1.length());  

  18.         String[] FL;  

  19.         int count = 0;  

  20.         FL = dir.list();  

  21.         for (int i = 0; i < FL.length; i++) {

  22. count++;

  23. System.out.println(FL[i] + "is in \\root");

  24. }

  25. System.out.println("there are" + count + "file in //root");

  26. }


  27. }


说明:File类的方法:
(1) exists()测试磁盘中指定的文件或目录是否存在
(2) mkdir()创建文件对象指定的目录(单层目录)
(3) createNewFile()创建文件对象指定的文件

(4) list()返回目录中所有文件名字符串



6. Java.IO流类库

1. io流的四个基本类

java.io包中包含了流式I/O所需要的所有类。在java.io包中有四个基本类:InputStream、OutputStream及Reader、Writer类,它们分别处理字节流和字符流:

基本数据流的I/O


输入/输出

字节流

字符流

输入流

Inputstream

Reader

输出流

OutputStream

Writer


Java中其他多种多样变化的流均是由它们派生出来的:

JDK1.4版本开始引入了新I/O类库,它位于java.nio包中,新I/O类库利用通道和缓冲区等来提高I/O操作的效率。

在java.io包中, java.io.InputStream 表示字节输入流, java.io.OutputStream表示字节输出流,处于java.io包最顶层。这两个类均为抽象类,也就是说它们不能被实例化,必须生成子类之后才能实现一定的功能。

1. io流的具体分类

一、按I/O类型来总体分类:

1. Memory 1)从/向内存数组读写数据: CharArrayReader、 CharArrayWriter、ByteArrayInputStream、ByteArrayOutputStream
2)从/向内存字符串读写数据 StringReader、StringWriter、StringBufferInputStream
2.Pipe管道 实现管道的输入和输出(进程间通信): PipedReader、PipedWriter、PipedInputStream、PipedOutputStream
3.File 文件流。对文件进行读、写操作 :FileReader、FileWriter、FileInputStream、FileOutputStream
4. ObjectSerialization 对象输入、输出 :ObjectInputStream、ObjectOutputStream
5.DataConversion数据流 按基本数据类型读、写(处理的数据是Java的基本类型(如布尔型,字节,整数和浮点数)):DataInputStream、DataOutputStream
6.Printing 包含方便的打印方法 :PrintWriter、PrintStream
7.Buffering缓冲 在读入或写出时,对数据进行缓存,以减少I/O的次数:BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream
8.Filtering 滤流,在数据进行读或写时进行过滤:FilterReader、FilterWriter、FilterInputStream、FilterOutputStream过
9.Concatenation合并输入 把多个输入流连接成一个输入流 :SequenceInputStream
10.Counting计数 在读入数据时对行记数 :LineNumberReader、LineNumberInputStream
11.Peeking Ahead 通过缓存机制,进行预读 :PushbackReader、PushbackInputStream
12.Converting between Bytes and Characters 按照一定的编码/解码标准将字节流转换为字符流,或进行反向转换(Stream到Reader,Writer的转换类):InputStreamReader、OutputStreamWriter

二、按数据来源(去向)分类:
1、File(文件): FileInputStream, FileOutputStream, FileReader, FileWriter
2、byte[]:ByteArrayInputStream, ByteArrayOutputStream
3、Char[]: CharArrayReader, CharArrayWriter
4、String: StringBufferInputStream, StringReader, StringWriter
5、网络数据流:InputStream, OutputStream, Reader, Writer



7. 字节流InputStream/OutputStream

1. InputStream抽象类

InputStream 为字节输入流,它本身为一个抽象类,必须依靠其子类实现各种功能,此抽象类是表示字节输入流的所有类的超类。 继承自InputStream 的流都是向程序中输入数据的,且数据单位为字节(8bit);

InputStream是输入字节数据用的类,所以InputStream类提供了3种重载的read方法.Inputstream类中的常用方法:
  (1) public abstract int read( ):读取一个byte的数据,返回值是高位补0的int类型值。若返回值=-1说明没有读取到任何字节读取工作结束。
  (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( ) :我们在使用完后,必须对我们打开的流进行关闭.

主要的子类:

1) FileInputStream把一个文件作为InputStream,实现对文件的读取操作
   2) ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用
   3) StringBufferInputStream:把一个String对象作为InputStream
   4) PipedInputStream:实现了pipe的概念,主要在线程中使用
   5) SequenceInputStream:把多个InputStream合并为一个InputStream

2.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) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中
2) FileOutputStream:把信息存入文件中
3) PipedOutputStream:实现了pipe的概念,主要在线程中使用
4) SequenceOutputStream:把多个OutStream合并为一个OutStream

流结束的判断:方法read()的返回值为-1时;readLine()的返回值为null时。

3. 文件输入流: FileInputStream类

FileInputStream可以使用read()方法一次读入一个字节,并以int类型返回,或者是使用read()方法时读入至一个byte数组,byte数组的元素有多少个,就读入多少个字节。在将整个文件读取完成或写入完毕的过程中,这么一个byte数组通常被当作缓冲区,因为这么一个byte数组通常扮演承接数据的中间角色。

作用:以文件作为数据输入源的数据流。或者说是打开文件,从文件读数据到内存的类。
使用方法(1)
File fin=new File("d:/abc.txt");
FileInputStream in=new FileInputStream( fin);

使用方法(2)
FileInputStream in=new FileInputStream(“d: /abc.txt”);

程序举例:
将InputFromFile.java的程序的内容显示在显示器上


  1. import java.io.IOException;

  2. import java.io.FileInputStream;

  3. ;

  4. public class TestFile {

  5. public static void main(String args[]) throws IOException {

  6. try{

  7. FileInputStream rf=new FileInputStream("InputFromFile.java");

  8. int n=512; byte buffer[]=new byte[n];

  9. while((rf.read(buffer,0,n)!=-1)&&(n>0)){  

  10.                    System.out.println(new String(buffer) );  

  11.                 }  

  12.                 System.out.println();  

  13.                 rf.close();  

  14.         } catch(IOException  IOe){        

  15.               System.out.println(IOe.toString());  

  16.         }  


  17.     }  


  18. }  


 

4.文件输出流:FileOutputStream类

   作用:用来处理以文件作为数据输出目的数据流;或者说是从内存区读数据入文件

 

      FileOutputStream类用来处理以文件作为数据输出目的数据流;一个表示文件名的字符串,也可以是File或FileDescriptor对象。 
  创建一个文件流对象有两种方法: 
  方式1: 
   File   f=new  File (“d:/myjava/write.txt ");
        FileOutputStream  out= new FileOutputStream (f);
  方式2: 
  FileOutputStream out=new FileOutputStream(“d:/myjava/write.txt "); 
  方式3:构造函数将 FileDescriptor()对象作为其参数。 
  FileDescriptor() fd=new FileDescriptor(); 
  FileOutputStream f2=new FileOutputStream(fd); 
  方式4:构造函数将文件名作为其第一参数,将布尔值作为第二参数。 
  FileOutputStream f=new FileOutputStream("d:/abc.txt",true); 
  注意: (1)文件中写数据时,若文件已经存在,则覆盖存在的文件;(2)的读/写操作结束时,应调用close方法关闭流。 

 


程序举例:使用键盘输入一段文章,将文章保存在文件write.txt中



  1. import java.io.IOException;  

  2. import java.io.FileOutputStream;  

  3. public class TestFile {  

  4.     public static void main(String args[]) throws IOException {  

  5.         try {  

  6.             System.out.println("please Input from      Keyboard");  

  7.             int count, n = 512;  

  8.             byte buffer[] = new byte[n];  

  9.             count = System.in.read(buffer);  

  10.             FileOutputStream wf = new FileOutputStream("d:/myjava/write.txt");  

  11.             wf.write(buffer, 0, count);  

  12.             wf.close(); // 当流写操作结束时,调用close方法关闭流。  

  13.             System.out.println("Save to the write.txt");  

  14.         } catch (IOException IOe) {  

  15.             System.out.println("File Write Error!");  

  16.         }  

  17.     }  


  18. }  


5. FileInputStream流和FileOutputStream的应用

利用程序将文件file1.txt 拷贝到file2.txt中。


  1. import java.io.File;  

  2. import java.io.IOException;  

  3. import java.io.FileOutputStream;  

  4. import java.io.FileInputStream;  


  5. public class TestFile {  

  6.     public static void main(String args[]) throws IOException {  

  7.         try {  

  8.             File inFile = new File("copy.java");  

  9.             File outFile = new File("copy2.java");  

  10.             FileInputStream finS = new FileInputStream(inFile);  

  11.             FileOutputStream foutS = new FileOutputStream(outFile);  

  12.             int c;  

  13.             while ((c = finS.read()) != -1) {  

  14.                 foutS.write(c);  

  15.             }  

  16.             finS.close();  

  17.             foutS.close();  

  18.         } catch (IOException e) {  

  19.             System.err.println("FileStreamsTest: " + e);  

  20.         }  

  21.     }  


  22. }  


 


6. 缓冲输入输出流 BufferedInputStream/ BufferedOutputStream

        


      


       计算机访问外部设备非常耗时。访问外存的频率越高,造成CPU闲置的概率就越大。为了减少访问外存的次数,应该在一次对外设的访问中,读写更多的数据。为此,除了程序和流节点间交换数据必需的读写机制外,还应该增加缓冲机制。缓冲流就是每一个数据流分配一个缓冲区,一个缓冲区就是一个临时存储数据的内存。这样可以减少访问硬盘的次数,提高传输效率。

 

BufferedInputStream:当向缓冲流写入数据时候,数据先写到缓冲区,待缓冲区写满后,系统一次性将数据发送给输出设备。

BufferedOutputStream :当从向缓冲流读取数据时候,系统先从缓冲区读出数据,待缓冲区为空时,系统再从输入设备读取数据到缓冲区。

1)将文件读入内存:


将BufferedInputStream与FileInputStream相接

  FileInputStream in=new  FileInputStream( “file1.txt ” );

  BufferedInputStream bin=new  BufferedInputStream( in); 

2)将内存写入文件:

将BufferedOutputStream与 FileOutputStream相接

FileOutputStreamout=new FileOutputStream(“file1.txt”);

BufferedOutputStream  bin=new BufferedInputStream(out);


3)键盘输入流读到内存

将BufferedReader与标准的数据流相接 

 InputStreamReader sin=new InputStreamReader (System.in) ;

BufferedReader bin=new             BufferedReader(sin);


  1. import java.io.*;  


  2. public class ReadWriteToFile {  

  3.     public static void main(String args[]) throws IOException {  

  4.         InputStreamReader sin = new InputStreamReader(System.in);  

  5.         BufferedReader bin = new BufferedReader(sin);  

  6.         FileWriter out = new FileWriter("myfile.txt");  

  7.         BufferedWriter bout = new BufferedWriter(out);  

  8.         String s;  

  9.         while ((s = bin.readLine()).length() > 0) {  

  10.             bout.write(s, 0, s.length());  

  11.         }  


  12.     }  

  13. }  


程序说明:
从键盘读入字符,并写入到文件中BufferedReader类的方法:String readLine()
作用:读一行字符串,以回车符为结束。
BufferedWriter类的方法:bout.write(String s,offset,len)
作用:从缓冲区将字符串s从offset开始,len长度的字符串写到某处。

 

 



8. 字符流Writer/Reader

        Java中字符是采用Unicode标准,一个字符是16位,即一个字符使用两个字节来表示。为此,JAVA中引入了处理字符的流。

 

1. Reader抽象类

 

    用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。

       

        1) FileReader :与FileInputStream对应  
           主要用来读取字符文件,使用缺省的字符编码,有三种构造函数: 
      (1)将文件名作为字符串 :FileReader f=new FileReader(“c:/temp.txt”); 
      (2)构造函数将File对象作为其参数。 
              File f=new file(“c:/temp.txt”); 
              FileReader f1=new FileReader(f); 
     (3)  构造函数将FileDescriptor对象作为参数 
            FileDescriptor() fd=new FileDescriptor() 
            FileReader f2=new FileReader(fd); 
               (1) 用指定字符数组作为参数:CharArrayReader(char[]) 
               (2) 将字符数组作为输入流:CharArrayReader(char[], int, int) 
          读取字符串,构造函数如下: public StringReader(String s); 
        2) CharArrayReader:与ByteArrayInputStream对应  
  3) StringReader : 与StringBufferInputStream对应 
  4) InputStreamReader 
        从输入流读取字节,在将它们转换成字符:Public inputstreamReader(inputstream is); 
  5) FilterReader: 允许过滤字符流 
        protected filterReader(Reader r); 
  6) BufferReader :接受Reader对象作为参数,并对其添加字符缓冲器,使用readline()方法可以读取一行。 
     Public BufferReader(Reader r); 

      主要方法:

      (1)  public int read() throws IOException; //读取一个字符,返回值为读取的字符 

  (2)  public int read(char cbuf[]) throws IOException; /*读取一系列字符到数组cbuf[]中,返回值为实际读取的字符的数量*/ 
  (3)  public abstract int read(char cbuf[],int off,int len) throws IOException; 
  /*读取len个字符,从数组cbuf[]的下标off处开始存放,返回值为实际读取的字符数量,该方法必须由子类实现*/ 

2. Writer抽象类

     写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。 其子类如下:

    

      1) FileWrite: 与FileOutputStream对应  
  将字符类型数据写入文件,使用缺省字符编码和缓冲器大小。 
  Public FileWrite(file f); 
  2)  chararrayWrite:与ByteArrayOutputStream对应 ,将字符缓冲器用作输出。 
      Public CharArrayWrite(); 
  3) PrintWrite:生成格式化输出 
      public PrintWriter(outputstream os); 
  4) filterWriter:用于写入过滤字符流 
      protected FilterWriter(Writer w); 
  5) PipedWriter:与PipedOutputStream对应   

      6) StringWriter:无与之对应的以字节为导向的stream  

      主要方法:

  (1)  public void write(int c) throws IOException; //将整型值c的低16位写入输出流 
  (2)  public void write(char cbuf[]) throws IOException; //将字符数组cbuf[]写入输出流 
  (3)  public abstract void write(char cbuf[],int off,int len) throws IOException; //将字符数组cbuf[]中的从索引为off的位置处开始的len个字符写入输出流 
  (4)  public void write(String str) throws IOException; //将字符串str中的字符写入输出流 
  (5)  public void write(String str,int off,int len) throws IOException; //将字符串str 中从索引off开始处的len个字符写入输出流 
  (6)  flush( ) //刷空输出流,并输出所有被缓存的字节。 
  (7)close()    关闭流 public abstract void close() throws IOException

 

 

3 .InputStream与Reader差别 OutputStream与Writer差别

 

InputStream和OutputStream类处理的是字节流,数据流中的最小单位是字节(8个bit)
Reader与Writer处理的是字符流,在处理字符流时涉及了字符编码的转换问题

 


  1. import java.io.*;  

  2. public class EncodeTest {  

  3.     private static void readBuff(byte [] buff) throws IOException {  

  4.        ByteArrayInputStream in =new ByteArrayInputStream(buff);  

  5.         int data;  

  6.         while((data=in.read())!=-1)   System.out.print(data+"  ");  

  7.         System.out.println();     in.close();     }  


  8.    public static void main(String args[]) throws IOException {  

  9.        System.out.println("内存中采用unicode字符编码:" );  

  10.        char   c='好';  

  11.        int lowBit=c&0xFF;     int highBit=(c&0xFF00)>>8;  

  12.        System.out.println(""+lowBit+"   "+highBit);  

  13.        String s="好";  

  14.        System.out.println("本地操作系统默认字符编码:");  

  15.        readBuff(s.getBytes());  

  16.        System.out.println("采用GBK字符编码:");  

  17.        readBuff(s.getBytes("GBK"));  

  18.        System.out.println("采用UTF-8字符编码:");        

  19.        readBuff(s.getBytes("UTF-8"));      }  

  20. }  



Reader类能够将输入流中采用其他编码类型的字符转换为Unicode字符,然后在内存中为其分配内存
Writer类能够将内存中的Unicode字符转换为其他编码类型的字符,再写到输出流中。

 



9. IOException异常类的子类

 

1.public class  EOFException :
   非正常到达文件尾或输入流尾时,抛出这种类型的异常。
2.public class FileNotFoundException:
   当文件找不到时,抛出的异常。
3.public class InterruptedIOException:

   当I/O操作被中断时,抛出这种类型的异常。

以上是Java输入流输出流的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

禁用Win11输入体验指南 禁用Win11输入体验指南 Dec 27, 2023 am 11:07 AM

最近有很多win11遇到了输入体验对话框总是闪烁,关也关不掉的问题,这其实是由于win11的默认系统服务和组件导致的,我们需要先禁用相关服务,再禁用输入体验服务就可以解决了,下面一起来试试看吧。win11输入体验怎么关闭:第一步,右键开始菜单,打开“任务管理器”第二步,依次找到“CTF加载程序”、“MicrosoftIME”和“服务主机:Textinputmanagementservice”三个进程,右键“结束任务”第三步,打开开始菜单,在上方搜索并打开“服务”第四步,在其中找到“Textinp

Windows输入遇到挂起或内存使用率高的问题[修复] Windows输入遇到挂起或内存使用率高的问题[修复] Feb 19, 2024 pm 10:48 PM

Windows的输入体验是一个关键的系统服务,负责处理来自各种人机接口设备的用户输入。它在系统启动时自动启动,在后台运行。然而,有时候这个服务可能会出现自动挂起或占用过多内存的情况,导致系统性能下降。因此,及时监控和管理这个进程是至关重要的,以确保系统的效率和稳定性。在这篇文章中,我们将分享如何解决Windows输入体验被挂起或导致内存使用率高的问题。Windows输入体验服务没有用户界面,但它与处理与输入设备相关的基本系统任务和功能有密切关联。它的作用是帮助Windows系统理解用户输入的每一

解决win11搜索栏输入问题 解决win11搜索栏输入问题 Dec 26, 2023 pm 12:07 PM

搜索栏是win11系统中非常好用的功能,可以帮助我们找到想要的设置、功能和服务等。但是有的朋友遇到了win11搜索栏无法输入的情况,我们可以在注册表中修改相关数据来解决,下面就跟着小编一起来解决一下吧。win11搜索栏无法输入怎么办1、首先我们可以按下键盘的“win+r”调出运行。2、然后在其中输入“regedit”回车确定打开注册表编辑器。3、然后在上方路径中输入“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Expl

word矩阵怎么输入 word矩阵怎么输入 Mar 19, 2024 pm 11:00 PM

矩阵是我们经常使用和遇到的公式,但是在word里如何输入矩阵你会操作吗?很多人可能没有接触过,遇到使用的时候就会感觉困惑,那么,这里我们就跟大家分享一下word矩阵怎么输入。希望经过这个技巧的分享,能够给你带来帮助和启发。1、首先,新建并打开一个word文档,为了演示操作,我们就使用空白文档进行演示。如下图所示:2、我们要输入矩阵,需要在菜单栏找到【插入】按钮,这个按钮可以插入很多内容选项,比如图片等都是从这个菜单栏完成。3、点击【插入】之后,我们工具选项右侧看,可以找到【公式】,然后我们点击【

C程序输入一个由空格分隔的整数序列的数组 C程序输入一个由空格分隔的整数序列的数组 Aug 25, 2023 am 11:33 AM

问题陈述编写一个C程序,以空格分隔的整数作为数组输入。SampleExamples输入12345输出‘Arrayelementsare-’1,2,3,4,5Explanation的中文翻译为:解释输入包含5个以空格分隔的整数。输入997687542356878967343423输出‘Arrayelementsare-’99,76,87,54,23,56,878,967,34,34,23Explanation的中文翻译为:解释输入包含11个以空格分隔的整数。方法一在这种方法中,我们将把输入中的以空

注意事项和示例:如何正确输入Python中的浮点数 注意事项和示例:如何正确输入Python中的浮点数 Feb 02, 2024 pm 06:34 PM

Python浮点型输入的注意事项及示例在Python中,浮点数是一种常见的数据类型,用于表示带有小数部分的数值。在进行浮点型输入时,有一些注意事项需要我们了解和注意,以确保输入的正确性和准确性。本文将介绍几个常见的注意事项,并提供示例代码以加深理解。浮点型的输入方式在Python中,浮点型的输入方式有多种,常见的有以下几种:直接使用浮点数进行输入:例如:x

PHP实践指南:如何判断输入只包含数字和字母 PHP实践指南:如何判断输入只包含数字和字母 Mar 28, 2024 pm 03:06 PM

在PHP编程中,有时候我们需要对用户输入的数据进行限制,比如判断输入是否只包含数字和字母。这在实际项目开发中经常会遇到,因此掌握如何实现这一功能非常重要。本文将介绍如何使用PHP来判断输入只包含数字和字母,并给出具体的代码示例。为什么需要判断输入只包含数字和字母?在网站开发中,用户输入的数据可能会被用于数据库操作、文件操作等重要功能,如果用户输入的数据包含特

PPT输入不等于符号的操作方法 PPT输入不等于符号的操作方法 Mar 26, 2024 pm 03:21 PM

1、打开PPT软件,进入操作界面。2、在这个界面内找到插入选项。3、点击插入选项,在其子级菜单中找到特殊符号选项。4、点击特殊符号选项,弹出插入特殊符号对话框。5、在该对话框内找到数学符号选项。6、点击数学符号选项,在其内找到不等于符号选项。7、点击该选项,可以看到再输入区我们的不等于符号就输入进来了。

See all articles