【翻译】Java IO 关系总览和整理

http://tutorials.jenkov.com/java-io/overview.html

  这篇文档我将会尝试展示JAVA IO包。更具体地说,我将试着在他们的目的之后分组。这个分组应该使您将来更容易确定类的用途,或者找到特定用途所需的类。

输入输出源-目的地(Input and Output - Source and Destination)

  输入和输出两个词有时可能会有一些使人疑惑。应用程序的一部分的输入通常是另一部分的输入。outputStream是一个输出的流写入的地方,还是输出出来(供您阅读)?毕竟,输入流将其数据输出到读取程序,不是吗?就我个人而言,在我第一次开始学习Java IO的时候,我发现这有点令人困惑。

  为了解释疑惑,我试图在输入和输出上添加一些不同的名称,试图在概念上将它们与输入来自哪里以及输出去向哪里联系起来。             

  Java的IO包主要涉及到从源读取原始数据并将原始数据写入目的地。最典型的数据来源和目的地是:

 

 下面的图表说明了一个程序从源读取数据并将其写入某个目的地的原理:

 

流(Streams)

   IO流是Java IO的一个核心概念。流是概念上无限的数据流。您可以从流中读取,也可以向流中写入。流连接到数据源或数据目的地。Java IO中的流可以基于字节(读写字节BYTE),也可以基于字符(读写字符characters)。

The InputStream, OutputStream, Reader and Writer

  需要从某个源读取数据的程序需要一个InputStreamReader。需要将数据写入某个目的地的程序需要OutputStreamWriter。下面的图表也说明了这一点:

  

  输入流或阅读器链接到数据源。输出流或写入器链接到数据的目的地。

Java IO用途和特性

   Java IO包含许多InputStream、OutputStream、Reader和Writer类的子类。原因是,所有这些子类都用于不同的目的。这就是为什么有这么多不同的类。所述目的摘要如下:

  

  在阅读Java IO类时,了解这些目的是很好的。它们使我们更容易理解类的目标。

Java IO类概览表

  已经讨论了来源、目的地、输入、输出和各种Java IO类的目标,

  这是一个表清单,大多数(如果不是全部)Java IO类被按照输入,输出,基于字节或字符,和任何特定的目的,他们可能会寻址(addressing),如缓冲、解析(parsing)等等区分。

  

 

  Java中的文件读取:

  比较常用的是InputStream和outputStream

  Java InputStream类表示一个有序的字节流。换句话说,您可以从Java InputStream中读取数据作为有序的字节序列。这在从文件中读取数据或通过网络接收数据时非常有用。
  Java InputStream类是Java IO API中所有输入流的基类(超类)。InputStream的子类包括FileInputStream、BufferedInputStream和PushbackInputStream等。
  
 1 InputStream inputstream = new FileInputStream("c:\\data\\input-text.txt");
 2 //创建了一个新的FileInputStream实例
3 int data = inputstream.read(); 4 while(data != -1) { 5 //do something with data... 6 doSomethingWithData(data); 7 8 data = inputstream.read(); 9 } 10 inputstream.close();//读取完关闭

  这个例子创建了一个新的FileInputStream实例。FileInputStream是InputStream的子类,因此将FileInputStream的实例分配给InputStream变量(InputStream变量)是安全的。这里涉及的子类和父类知识不再解释。

 

  如果read()方法返回-1,则已经到达流的末尾,这意味着在InputStream中没有更多的数据需要读取。即-1作为int值,而不是-1作为byte或short值。这是有区别的!当到达流的末尾时,您可以关闭InputStream。
  一次读取一个字节数组要比一次读取一个字节快得多,所以如果可以,可以使用这些read方法而不是read()方法。
  read(byte[])方法将尝试将尽可能多的字节读入作为参数的字节数组,只要数组有空间。read(byte[])方法返回一个int值,表示实际读取了多少字节。如果从InputStream读取的字节数少于字节数组的空间,那么字节数组的其余部分将包含与读取开始之前相同的数据。记得检查返回的int,看看有多少字节被实际读入字节数组。
  read(byte[], int offset, int length)方法也将字节读入字节数组,但是从偏移字节开始读入数组,并从那个位置读入最大长度字节。
  同样,read(byte[], int offset, int length)方法返回一个int值,告诉数组中实际读取了多少字节,因此在处理读字节之前要检查这个值。
对于这两个方法,如果到达流的末尾,该方法将返回-1作为读取的字节数。
  下面是一个使用InputStream的read(byte[])方法的示例:
  
 1 InputStream inputstream = new FileInputStream("c:\\data\\input-text.txt");
 2 
 3 byte[] data  = new byte[1024];
 4 int bytesRead = inputstream.read(data);
 5 
 6 while(bytesRead != -1) {
 7   doSomethingWithData(data, bytesRead);
 8 
 9   bytesRead = inputstream.read(data);
10 }
11 inputstream.close();

  首先,这个示例创建一个字节数组。然后,它创建一个名为bytesRead的int变量,用于保存每个read(byte[])调用所读取的字节数,并立即为bytesRead分配第一次read(byte[])调用返回的值。在while循环中调用doSomethingWithData()方法,传递数据字节数组以及作为参数读入数组的字节数。在while循环结束时,再次将数据读入字节数组。
  要弄清楚如何使用read(byte[], int offset, int length)方法而不是read(byte[])不需要太多的想象力。您只需将read(byte[])调用替换为read(byte[], int offset, int length)调用。
  参考网站:http://tutorials.jenkov.com/java-io/inputstream.html
 
 
 
  先写到这里。

 

 

 

 
 

 

  

  

 

 

 

 

 

  

 

  

  

  

 

posted @ 2018-10-30 23:33  清凌  阅读(356)  评论(0编辑  收藏  举报