Java——InputStream与OutputStream流类的方法及其子类的方法实现

一、基本的输入输出类

为了方便流的处理,Java语言的流类都封装在java.io包中,所以要使用流类,必须导入java.io包。

1.InputStream流类

InputStream流类中包含一套所有字节输入都需要的方法,可以完成最基本的从输入流读入数据的功能。常见方法见下表:

常用方法 功能说明
public int read() 从输入流中的当前位置读入一个字节(8b)的二进制数据,然后以此数据位低位字节,配上8个全0的高位字节合成一个16位的整型量(0~255)返回调用此方法的语句,若输入流中的当前位置没有数据,则返回-1
public int read(byte[] b) 从输入流中的当前位置连续读入多个字节保存在数组b中,同时返回所读到的字节数
public int read(byte[] b,int off,int len) 从输入流中的当前位置连续读入len个字节,保存在数组b中
public int available() 返回输出流中可以读取的字节数
public long skip(long n) 使位置指针从当前位置向后跳n个字节
public void mark(int readlimit) 在当前位置处做一处标记,并且在输入流中读取readlimit个字节数后该标记消失
public void reset() 将位置执政返回到标记位置
public void close() 关闭输入流与外设的连接并释放所占用的系统资源
2.OutputStream流类
常用方法 功能说明
public void write(int b) 将参数b的低位字节写入到输出流
public void write(byte[] b) 将字节数组b的全部字节按顺序写入到输出流
public void write(byte[] b,int off,int len) 将字节数组b中第off+1个元素开始的len个数据,顺序地写入到输出流
public void flush() 强制清空缓冲区并执行向外设写操作
public void close() 关闭输出流与外设的连接并释放所占用的系统资源

二、输入输出流的应用

由于InputStream、OutputStrean是抽象类,所以在具体引用时使用的都是由他们所派生的子类,不同的子类,用于不同情况数据的输入输出操作。下面简要介绍这些子类:

1.文件输入输出流

FileInputStream和FileOutStream分别是InputStream和OutputStream的直接子类,这两个子类主要负责完成对本地磁盘文件的顺序输入与输出操作的流。

FileInputStream类对象表示一个文件字节输入流,从中可读取一个字节或一批字节。在生成FileInputStream类的对象时,若指定的文件找不到,会抛出一个FileNotException异常,该异常必须捕获声明抛出FileNotFoundException异常,该异常必须捕获或声明抛出。

FileInputStream类对象表示一个文件字节输出流,从向流中写入一个字节或一批字节。在生成FileOutputStream类的对象时,若指定的文件不存在则创建一个新的文件,若已存在,则清除原文件的内容。在文件读写操作时会产生IOException异常,该异常必须捕获或声明抛出。

FileInputStream类和FileOutputStream类的构造方法如下:

FileInputStream类的构造方法

构造方法 功能说明
public FileInputStream(String name) 以名为name的文件为数据源建立文件输入流
public FileInputStream(File file) 以文件对象file为数据源建立文件输入流
public FileInputStream(FileDescription fdObj) 以文件描述符对象fdObj为输入端建立一个文件输入流

FileOutputStream类的构造方法

构造方法 功能说明
public FileOutputStream(String name) 以名为name的文件为数据源建立文件输出流
public FileOutputStream(String name,boolean append) 以指定名字的文件为接收端建立文件输出流,并指定写入方式,append为true时输出字节被写到文件的末尾
public FileOutputStream(File file)
public FileOutputStream(FileDescription fdObj) 以文件描述符对象fdObj为输入端建立一个文件输出流
package 示例;
import java.io.*;

public class 示例 {
	public static void main(String[] args) {
		char ch1;//如果此处可改成int ch1,那么14行得把char去掉,类型保持一致。注意read()方法使用的对象是二进制
		int ch2;
		//存储
		try(
			FileInputStream fin = new FileInputStream(FileDescriptor.in);
			FileOutputStream fout = new FileOutputStream("E:/cqj/myfile.txt");
			)
		{
			System.out.print("请输入一串字符,并以#结束:");
			while((ch1=(char)fin.read())!='#')
					fout.write(ch1);
		}
		catch(FileNotFoundException e){
			System.out.print("文件没有找到!");
		}
		catch(IOException e) {
			System.out.print("命令行没有提供字符!!");
		}
		//投射到标准输出设备
		try(FileInputStream fin = new FileInputStream("E:/cqj/myfile.txt");
			FileOutputStream fout = new FileOutputStream(FileDescriptor.out);)
		{
			while(fin.available()>0) {//使用available来判断还有多少字节的内容可读取
				ch2=fin.read();
//				System.out.println((byte) ch2);
				fout.write(ch2);
				}
		}
		catch(IOException e) {
		}
	}
	
}
运行结果:
请输入一串字符,并以#结束:Java很棒!#
Java很棒!
package 利用FileIO实现二进制图像文件得复制;
import java.io.*;
public class j1102 {
	public static void main(String[] args)throws IOException
	{
		try(
				FileInputStream fi = new FileInputStream("风景.jpg");
				FileOutputStream fo = new FileOutputStream("风景1.jpg");
			)
		{
			System.out.println("文件的大小是:"+fi.available());
			byte[] b= new byte[fi.available()];//输出文件大小
			fi.read(b);//创建byte型的数组
			fo.write(b);//将图像文件读入b数组
			System.out.print("文件已被复制并更改");
		}
	}
}
//复制的文件在当前(F:\Java10)的文件夹下
//切记要把所复制的图片的也放入到同一个工程中
运行结果:
文件的大小是:715852
文件已被复制并更改
2.顺序输入流

顺序输入流类SequenceInputStream是InputStream的直接子类,其功能是将多个顺序连接在一起,形成单一的输入数据流,没有对应的输出数据流存在。顺序输入流有两个构造方法:
SequenceInputStrean类的构造方法

构造方法 功能说明
public SequenInputStream(Enumeration e) 创建一个串行输入流,连接枚举对象e的所有输出流
public SequenInputStream(inputStream s1,InputStream s2) 创建一个串行输入流,连接输入流s1和s2

SequenceInputStrean类的常用方法

常用方法 功能说明
public int available() 返回流中的可读取得字节数
public void close() 关闭输入流
public int read() 从输出流中读取字节,遇到EOF就转向下一个输入流
public int read(byte[] b,int off,int len) 将len个数据读到一个字节数组从off开始的位置
package Example;
import java.io.*;

public class Example6 {
	public static void main(String[] args)throws IOException
	{
		try (
            FileInputStream fis3 = new FileInputStream("a.txt");
            FileInputStream fis4 = new FileInputStream("b.txt");
            SequenceInputStream sis = new SequenceInputStream(fis3, fis4);
            FileOutputStream fos = new FileOutputStream("c.txt");)
           { 
            int b;
            while ((b = sis.read()) != -1) {
                fos.write(b);
            }            
//            sis.close();  // SequenceInputStream 的 close() 方法 会遍历关闭字节流对象
//            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
	}		
}
3.管道输入输出流

管道字节输入流PipedInputStream和管道字节输出流PipedOutputStream类提供了利用管道方式进行数据输入输出管理的类。管道流用来将一个程序或线程的输出连接到另一个程序或线程作为输入,使得相连线程能够通够PipedInputStream和PipedOuyoutStream流进行数据交换,从而可以实现程序内部线程间的通讯或不同程序间的通信。

PipedInputStream和PipedOuyoutStream类分别是InputStream和OutputStream的直接子类。这两个类必须结合使用,其中,管道输入流作为管道的接收端、管道输出流作为管道发送端,在程序设计中应注意数据的传输方法。

下面给出两种构造方法

第一种:
PipedInputStream(PipedOutputStream src),创建一个管道字节输入流,并将其连接到src指定的管道字节输出流。
PipedOutputStream(PipedInputStream src),创建一个管道字节输出流,并将其连接到src指定的管道字节输入流。
第二种:
利用管道字节输入输出流提供的connect()方法进行连接。

PipedInputStream类常用方法

常用方法 功能说明
public int available() 返回可以读取得字节数
public void close() 关闭管道输入流并释放系统资源
public int read() 从管道输入流中读取下一个字节数据
public int read(byte[] b,int off,int len) 从管道输入流中读取len字节数据到数组
protected void receive(int b) 从管道中接受1字节数据
public void connect(PipedOutputStream src) 连接指定输出流,管代输入流将从输出流接收数据

PipedOutputStream类常用方法

常用方法 功能说明
public void close() 关闭管道输出流并释放系统资源
public void connect(PipedInputStream snk) 连接指定输入流,管代输出流将从该输出入接收数据
public void write(int b) 写指定字节数据到管道输出流
public int write(byte[] b,int off,int len) 从数组off偏移处写len字节数据到管道输出流
public void flush() 刷新输出流并使用缓冲区数据全部写出

使用方法点击跳转查看(侵权立删)

4.过滤输入输出流

过滤宇节输人流类FltenpusSre和过德字节输出流类Fltotpusteram.分别实现了在数据的读、写操作的同时进行数据处理,它们是InpuStrem和OutpuStrem类的直接子类。

FilterInputStream 和FilterOutputStream也是两个抽象类,它们又分别派生出数据输人流类DataInputStream和数据输出流类DataOutputStream等子类。过滤字节输人输出流的主要特点是,过滤字节输入输出流是建立在基本输入输出流之上,并在输人输出数据的同时能对所传输的数据做指定类型或格式的转换,即可实现对二进制字节数据的理解和编码转换。

d.dat文件—>FileInputStream—>(字节的方式,在箭头上)DataInputStream—>(int型数据,在箭头上)
数据输入类DataInputStream和数据输出流类DataInputStream的构造方法分别是过滤字节输入输出流FilterInputStream和FilterOutputStream的子类。由于DataInputStream和DataInputStream分别实现了DataInput和DataOutput两个接口中定义二等独立于具体机器的带格式的读写操作,从而实现了对不同类型数据的读写。
DataInputStream和DataInputStream的构造方法如下:
1.DataInputStream(InputStream in),建立一个新的数据输入流,从指定的输入流in读数据。
2.DataOutputStream(OutputStream out),建立一个新的数据输出流,从指定的输出流out写数据。

由构造方式可以看出,作为过滤流,字节输入流和输出流分别作为数据输入流和数据输出流的构造方法的参数,即作为过滤流必须与相应的数据流相连。

DataInputStream类的常用方法

常用方法 功能说明
public boolean readBoolean() 从流中读1字节,若字节值非0返回true,否则返回false
public byte readByte() 从流中读取1字节,返回改该字节值
public char readChar() 从流中读取a、b 2字节,形成Unicode字符(char)((a<<8)或(b&0xff)
public short readShort() 从流中读入2字节的short值并返回
public int readInt() 从流中读入4字节的int值并返回
public float readFloat() 从流中读入4字节的float 值并返回
public long readLong() 从流中读入8字节的long 值并返回
public double readDouble() 从流中读入8字节的double 值并返回

DataInputStream类的常用方法

常用方法 功能说明
public void writeBoolean() 若v的值为true,则向流中写入(字节)1,否则写入(字节)0
public void writeByte() 向流中写入1字节。写入v的最低1字节,其他字节丢弃
public void writeChar() 向流中写入v的最低2字节,其他字节丢弃
public void writeShort() 向流中写入v的最低2字节,其他字节丢弃
public void writeInt() 向流中写入参数v的4字节
public void writeFloat() 向流中写入参数v的4字节
public void writeLong() 向流中写入参数v的8字节
public void writeDouble() 向流中写入参数v的8字节
package 利用数据流将不同类型的文件写到一个文件夹中;//并显示在屏幕上
import java.io.*;
public class jl103 {
	public static void main(String[] args)
	{
		try(FileOutputStream fout=new FileOutputStream("E:/cqj/myfile1.txt");
			DataOutputStream dout=new DataOutputStream(fout);
			)
		{
			dout.writeInt(10);
			dout.writeLong(123456);
			dout.writeFloat(3.14159926f);
			dout.writeDouble(987654321.321);
			dout.writeBoolean(true);
			dout.writeChars("GoodBye!");
		}
		catch(IOException e){}
		try
		(
			FileInputStream fin=new FileInputStream("E:/cqj/myfile1.txt");
			DataInputStream din=new DataInputStream(fin);
		)
		{
			System.out.println(din.readInt());
			System.out.println(din.readLong());
			System.out.println(din.readFloat());
			System.out.println(din.readDouble());
			System.out.println(din.readBoolean());
			char ch;
			while((ch=din.readChar())!='\0')
				System.out.print(ch);
		}
		catch(FileNotFoundException e)
		{
			System.out.println("文件我找到!");
		}
		catch(IOException e) {}
		
	}
}
运行结果:
10
123456
3.1415992
9.87654321321E8
true
GoodBye!
5.标准输入输出流

System.in、System.out、System.err这三个标准的输入与输出流对象定义在java.lang.System类中,与其他类导入程序必须用import不同,它们对象在Java源程序编译时被自动装载
1.标准输入:Java语言的标准输入System.in是BufferedInputStream类的对象。
2.标准输出:Java语言的标准输出System.out是打印输出流PrintStream类的对象。PrintStream类是过滤流字节输出流FilterOutputStream的子类。
3标准错误输出:标准错误输出System.err用于为用户显示错误信息。也是有PrintStream类派生的错误流类。

package jl104System.in与System.out的运用;
import java.io.*;

public class jl01 {
	public static void main(String[] args)
	{
		try
		{
			byte [] b=new byte[128];//设置缓冲区
			System.out.print("请输入字符:");
			int count=System.in.read(b);//读取标准输入流,将回车符和换行符也存放在b数组中
			System.out.println("输入的是:");
			for(int i=0;i<count;i++)
				System.out.print(b[i]+"   ");
			System.out.println();
			for(int i=0;i<count-2;i++)//不显示回车符与换行符
				System.out.print((char)b[i]+"   ");
			System.out.println();
			System.out.println("输入的字符个数为"+count);
			Class InClass=System.in.getClass();
			Class OutClass=System.out.getClass();
			System.out.println("in所在的类是:"+InClass);
			System.out.print("out所在的类是:"+OutClass);
		}
		catch(IOException e){}
	}
}
//输入123会显示有5个字符,因为把Enter键当成了"\r"(字符码13)+"\n"(10)两个字符
运行结果:
请输入字符:abc
输入的是:
97   98   99   13   10   
a   b   c   
输入的字符个数为5
in所在的类是:class java.io.BufferedInputStream
out所在的类是:class java.io.PrintStream

以上就是InputStream与OutputStream流类的方法及其子类的简要介绍和常用方法实现

你可能感兴趣的:(Java中基本类的常用方法实现)