JAVA-4 InputStream/OutputStream

Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中。其中

所有输入流类都是抽象类InputStream(字节输入流)或者抽象类Reader(字符输入流)的子类

所有输出流都是抽象类OutputStream(字节输出流)或者抽象类Writer(字符输出流)的子类

 

InputStream类是字节输入流的抽象类,是所有字节输入流的父类,InputStream类具有层次结构如下图所示

输出流OutputStream类是字节输入流的抽象类,此抽象类表示输出字节流的所有类的超类。

其它子类讲解:

ObjectInputStream/ObjectOutputStream:https://blog.csdn.net/sinat_27180253/article/details/82185460

ByteArrayInputStream/ByteArrayOutputStream:https://blog.csdn.net/sinat_27180253/article/details/82185609

BufferedInputStream/BufferedOutputStream:https://blog.csdn.net/sinat_27180253/article/details/82185662

DataInputStream/DataOutputStream:https://blog.csdn.net/sinat_27180253/article/details/82186009

 

代码先行:

InputStream

package com.stydy.stream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

public class InputStreamx {

     // 文件路径

     public static final String filePath = "D:" + File.separator + "ZZ" + File.separator + "stream.txt";

     public static void main(String[] args) {

          try {

              InputStream in = new FileInputStream(filePath);

              byte bytes[] = new byte[1024];

              

              int len =0;

              int temp = 0;

              while ((temp = in.read()) !=-1) {

                   bytes[len] = (byte) temp;

                   len++;

              }

              in.close();

              System.out.println(new String(bytes, 0, len));

          } catch (FileNotFoundException e) {

              e.printStackTrace();

          } catch (IOException e) {

              e.printStackTrace();

          }

     }

}

 

OutputStream

package com.stydy.stream;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

public class OutputStreamx {

     // 文件路径

     public static final String filePath = "D:" + File.separator + "ZZ" + File.separator + "stream.txt";

     public static void main(String[] args) {

          try {

              /**

               * 这两个构造方法各多了一个boolean参数append。

               * append参数为true时,数据从文件尾部写入;append参数为false时,数据覆盖原文件

               */

              //OutputStream out = new FileOutputStream(filePath, true);

              OutputStream out = new FileOutputStream(new File(filePath), true);

              String msg = "\r\n" + "小蚊子(xiaowenzi)" + "\r\n" + "小蚊子(xiaowenzi)";

              out.write(msg.getBytes("GBK"));

              out.close();

          } catch (FileNotFoundException e) {

              e.printStackTrace();

          } catch (IOException e) {

              e.printStackTrace();

          }

     }

}

 

InputStream 函数列表

public FileInputStream(String name)

public FileInputStream(File file)

public FileInputStream(FileDescriptor fdObj)

private void open(String name)

 

//一个一个字节的读

public int read()

//b-读入数据的缓冲区。

public int read(byte b[])

/**

 * b-读入数据的缓冲区。

 * off-在其处写入数据的数组 b 的初始偏移量。

 * len-要读取的最大字节数。

 */

public int read(byte b[], int off, int len)

代码解析:

package com.stydy.stream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

public class InputStreamx {

     // 文件路径

     public static final String filePath = "D:" + File.separator + "ZZ" + File.separator + "stream.txt";

     public static void main(String[] args) {

          try {

              InputStream in = new FileInputStream(filePath);

              byte bytes[] = new byte[1024];

              

              int temp = 0;

              while ((temp = in.read(bytes, 0, 11)) !=-1) {

              }

              in.close();

              System.out.println(new String(bytes));

          } catch (FileNotFoundException e) {

              e.printStackTrace();

          } catch (IOException e) {

              e.printStackTrace();

          }

     }

}

解析:

1.文件内容: xiaowenzi#xiaowenzi#xiaowenzi

2.读取到的内容,因为最大长度为11: bytes[0]=xiaowenzi#x, bytes[1]=iaowenzi#xi, bytes[2]=aowenzi

3.逆向输出,输出最后11位长度字符:结果为aowenzii#xi

 

/**

 * 跳过和丢弃此输入流中数据的 n 个字节   

 * 跳过和丢弃此输入流中数据的 n 个字节。出于各种原因,skip 方法结束时跳过的字节数可能小于该数,也可能为 0。导致这种情况的原因很多,跳过 n 个字节之前已到达文件末尾只是其中一种可能。返回跳过的实际字节数。如果 n 为负,则不跳过任何字节。

 * 

 */

public long skip(long n)

代码解析:

package com.stydy.stream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

public class InputStreamx {

     // 文件路径

     public static final String filePath = "D:" + File.separator + "ZZ" + File.separator + "stream.txt";

     public static void main(String[] args) {

          try {

              InputStream in = new FileInputStream(filePath);

              byte bytes[] = new byte[1024];

              

              int temp = 0;

              while ((temp = in.read(bytes, 0, 10)) !=-1) {

                   //每读完一次跳过一个继续读取

                   in.skip(1);

              }

              in.close();

              System.out.println(new String(bytes));

          } catch (FileNotFoundException e) {

              e.printStackTrace();

          } catch (IOException e) {

              e.printStackTrace();

          }

     }

}

解析:

1.文件内容: xiaowenzi#xiaowenzi#xiaowenzi

2.读取到的内容,因为最大长度为10,每次读完跳过一个继续读取: bytes[0]=xiaowenzi#,跳过后面一个字符x继续读取bytes[1]=iaowenzi#x, 跳过后面一个字符i继续读取bytes[2]=aowenzi

3.逆向输出,输出最后10位长度字符:结果为aowenzii#x

 

/**

 * 输出流的大小

 * 如果是网络流的话,此种方法可能不准确,因为请求会存在延时

 */

public int available()

//关闭流

public void close()

//在读取的字节数 <= readlimit时,一定确保不失效.而读取的字节数 > readlimit,就不能确保不失效(随时都可能失效),但不一定立即失效.

public synchronized void mark(int readlimit)

//重新回到标记位置,从标记位置重新读取

public synchronized void reset()

//判断是否可被标记

public boolean markSupported()

 

OutputStream 函数列表

public FileOutputStream(String name)

public FileOutputStream(String name, boolean append)

public FileOutputStream(File file)

public FileOutputStream(File file, boolean append)

public FileOutputStream(FileDescriptor fdObj)

 

private void open(String name, boolean append)

public void write(int b)

public void write(int b, boolean append)

public void write(byte b[])

public void write(byte b[], int off, int len)

 

public void close()

protected void finalize()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章