java 输入输出流 一个类中只能使用一次吗? 流关闭后 就不能再打开吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 输入输出流 一个类中只能使用一次吗? 流关闭后 就不能再打开吗?相关的知识,希望对你有一定的参考价值。

public class InputUserInformation
/*从键盘输入,返回一个字符串*/
public String inputName ()
int count;
byte[] b = new byte[256];
String str = "";
DataInputStream din = new DataInputStream(System.in);
BufferedInputStream in = new BufferedInputStream(din);
try
count = in.read(b);
str = new String(b,0,count);
catch (IOException e)
e.printStackTrace();
System.out.print("发送I/O错误!");
finally
try
din.close();
in.close();
catch (IOException e)
e.printStackTrace();


return str;


public String inputPassword ()
int count;
byte[] b = new byte[256];
String str = "";
DataInputStream din = new DataInputStream(System.in);
BufferedInputStream in = new BufferedInputStream(din);
try
count = in.read(b);
str = new String(b,0,count);
catch (IOException e)
e.printStackTrace();
System.out.print("发送I/O错误!");
finally
try
din.close();
in.close();
catch (IOException e)
e.printStackTrace();


return str;

流关闭后不能在打开,可以重新new一个。 参考技术A 好像是的,得重新启动,除非你用循环追问

是不是 就是不断重新new 一个

参考技术B 流关闭后不能在打开

java.IO输入输出流:过滤流:buffer流和data流

 

java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题。

字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流。

问题引入:缓冲流为什么比普通的文件字节流效率高?

不带缓冲的操作,每读一个字节就要写入一个字节。

由于涉及磁盘的IO操作相比内存的操作要慢很多,所以不带缓冲的流效率很低。

带缓冲的流,可以一次读很多字节,但不向磁盘中写入,只是先放到内存里。

等凑够了缓冲区大小的时候一次性写入磁盘,这种方式可以减少磁盘操作次数,速度就会提高很多!

这就是两者的区别。

大概过程:

没有缓存区,那么每read一次,就会发送一次IO操作;

有缓存区,第一次read时,会一下读取x个字节放入缓存区,然后后续的read都会从缓存中读取,当read到缓存区末尾时,会再次读取x个字节放入缓存区。

很明显,第二种方式,会减少IO操作,效率更高,缺点就是,内存占用的多。

 

java输入输出流采用了多层封装的方式进行设计

  最底层 InputStream和OutputStream 基于字节流,没有缓存机制,一般用BufferInputStream和BufferOutputStream进行封装后使用。

  BufferInputStream的read方法是阻塞线程的,BufferInputStream.read(buf) 会将输入流内的全部读入buf之后才返回。

  BufferOutputStream.write(buf);会将buf中的内容输出到输出流,但是记得要flush;

  还有个比较好用的PrintStream 和PrintWriter相似 可以自动刷新 只不过是对于字节流而言。

  字节流一般用于传送二进制文件之类 至于字符流常常用reader进行包装后使用。

  最常用的有BufferInputStreamReader和PrintWrinter ,BufferInputStreamReader的readline方法很实用 遇到\r\d会自动flush。

  PrintWrinter 只要在构造函数中设置了刷新属性为true则其println方法可以自动刷新 不用flush。

 

FilterInputStream和FilterOutputStream:过滤流,buffer流和data流均继承于此。

  对于buffer流,只有缓冲区满时,才会将数据真正到输出流,但可以使用flush()方法人为的将尚未填满的缓冲区中的数据送出;不能确定文件的编码方式,在网络上难以应用。

  实际中用的最多的还是:data流可以让发送方和接收方按照同一的编码去处理。

  DataInputStream和DataOutputStream:可以接受一行的数据,可以对其进行编码,也可以是套接流,可以套接文件字节流和网络字节流,读写的顺序要一致,否则读取会出现异常。

  DataInputStream 是用来装饰其它输入流,它“允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型”。应用程序可以使用DataOutputStream(数据输出流)写入由DataInputStream(数据输入流)读取的数据。

 

 

 

以上是关于java 输入输出流 一个类中只能使用一次吗? 流关闭后 就不能再打开吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 z/OS Assembler 中,我可以读取 JCL 输入流两次吗?

java.IO输入输出流:过滤流:buffer流和data流

JAVA基础——IO流字符流

Java IO5:字符流

深入理解JAVA I/O系列三:字符流详解

标准输入流和输出流分别是啥,高效字符流的方法