java 中对输入输出流类型重复调用,只对最后一次调用进行关闭,之前的调用不关闭,会有啥后果?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 中对输入输出流类型重复调用,只对最后一次调用进行关闭,之前的调用不关闭,会有啥后果?相关的知识,希望对你有一定的参考价值。

比如:
一个类里面定义一个全局变量public static InputStream in = null;
类的方法A,直接使用in = con.getInputStream();
类的方法B,使用in = con.getInputStream();
类的方法C,里面也用到in ,他的值是从B返回来的
大概就是这样的
1、主要是我想把方法区分开来,比如一个方法A是专门获取in的作为return的值,然后返回给另一个方法B,在这个方法里面使用,如果A关闭了,那传给B的in就已经关闭了,取不到数据
2、 bianqiwei的说法是定义全局变量,那如果方法A的in返回给B之后,in进行操作后可以不关闭然后重新进行赋值吗?

不是很理解 随便说说
你当然可以不关闭 之所以用完就关闭 是防止占用连接资源以及连接冲突 有些连接你不关闭的话 其他地方就不能使用了 并不是一定需要关闭 有些时候为了重用 是特意不关闭的 比如说数据库连接池 他就是打开指定数目的数据连接 不关闭 程序需要使用数据库连接了从连接池获取 连接池负责管理连接 比如说保证给程序的是一个可用连接等等
一般情况下上层流关闭的同时也会将下层流关闭 比如说你在InputStream上套一个缓冲流 那么你将缓冲流关闭了 InputStream同时也会关闭的 你如果套了好几个的话 那么只要关闭一个 其他所有流都没办法使用了 因为它们作为基本的流已经关闭了
参考技术A 很负责的告诉你,因为是一个实例,所以,只需要进行一次close,所以,没问题.
不过,用的时候最好这么用
public static InputStream in = null;
public static InputStream getIn()
if(in == null)
//初始化in

return in;

public void test1()
InputStream in = getIn();
in 执行操作

组后的方法 记得把 in.close()掉
参考技术B 这个……你试试看?
一般都是用完了就关了吧

JAVA IO流常见问题

1、字节流和字符流的区别

(1)读写单位不同:字节流以字节(8 bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。

(2)处理对象不同:字节流能处理所有类型的数据(如图片、avi 等),而字符流只能处理字符类型的数据。

(3)字节流没有缓冲区,是直接输出的,而字符流是输出到缓冲区的。因此在输出时,字节流不调用 colse() 方法时,信息已经输出了,而字符流只有在调用 close() 方法关闭缓冲区时,信息才输出。要想字符流在未关闭时输出信息,则需要手动调用 flush() 方法。

2、什么是节点流,什么是处理流,它们各有什么用处,处理流的创建有什么特征

节点流

  • 文件流:FileInputStream,FileOutputStrean,FileReader,FileWriter,它们都会直接操作文件,直接与 OS 底层交互。因此他们被称为节点流 ,注意:使用这几个流的对象之后,需要关闭流对象,因为 java 垃圾回收器不会主动回收。不过在 Java7 之后,可以在 try() 括号中打开流,最后程序会自动关闭流对象,不再需要显示地 close。
  • 数组流:ByteArrayInputStream,ByteArrayOutputStream,CharArrayReader,CharArrayWriter,对数组进行处理的节点流。
  • 字符串流:StringReader,StringWriter,其中 StringReader 能从 String 中读取数据并保存到 char 数组。
  • 管道流:PipedInputStream,PipedOutputStream,PipedReader,PipedWrite,对管道进行处理的节点流。

处理流

处理流是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如 BufferedReader。

处理流的构造方法总是要带一个其他的流对象做参数。

常用处理流(通过关闭处理流里面的节点流来关闭处理流)

  • 缓冲流 :BufferedImputStrean,BufferedOutputStream,BufferedReader ,BufferedWriter,需要父类作为参数构造,增加缓冲功能,避免频繁读写硬盘,可以初始化缓冲数据的大小,由于带了缓冲功能,所以就写数据的时候需要使用 flush 方法,另外,BufferedReader 提供一个 readLine( ) 方法可以读取一行,而 FileInputStream 和 FileReader 只能读取一个字节或者一个字符,因此 BufferedReader 也被称为行读取器。
  • 转换流:InputStreamReader,OutputStreamWriter,要 inputStream 或 OutputStream 作为参数,实现从字节流到字符流的转换,我们经常在读取键盘输入(System.in)或网络通信的时候,需要使用这两个类。
  • 数据流:DataInputStream,DataOutputStream,提供将基础数据类型写入到文件中,或者读取出来。

注意:处理流的构造器必须要传入节点流的子类

3、什么叫对象序列化,什么是反序列化,实现对象序列化需要做哪些工作

  • 对象序列化:将对象以二进制的形式保存在硬盘上;
  • 反序列化:将二进制的文件转化为对象读取;
  • 实现 serializable 接口可以实现对象序列化,其中没有需要实现的方法,implements Serializable 只是为了标注该对象是可被序列化的。

例如,在 web 开发中,如果对象被保存在了 Session 中,tomcat 在重启时要把 Session 对象序列化到硬盘,这个对象就必须实现 Serializable 接口。如果对象要经过分布式系统进行网络传输,被传输的对象就必须实现 Serializable 接口。

4、什么是 Filter 流有哪些

FilterStream 是一种 IO 流,主要作用是用来对存在的流增加一些额外的功能,像给目标文件增加源文件中不存在的行数,或者增加拷贝的性能等。在 java.io 包中主要由 4 个可用的 filter Stream。两个字节 filter stream,两个字符 filter stream.

分别是:FilterInputStream,FilterOutputStream,FilterReader and FilterWriter. 这些类是抽象类,不能被实例化的。

FilterInputStream 流的子类:

  • DataInputStream 可以把包括基本类型在内的数据和字符串按顺序从数据源读入,它有一些特殊的方法如 readInt(),readDouble() 和 readLine() 等可以读取一个 int,double 和一个 string。
  • BufferedInputStream 增加性能。
  • PushbackInputStream 推送要求的字节到系统中。
  • 注:其它子类见 Java io 分类图。

5、说说 RandomAccessFile?

它在 java.io 包中是一个特殊的类,既不是输入流也不是输出流,它两者都可以做到。他是 Object 的直接子类。通常来说,一个流只有一个功能,要么读,要么写。但是 RandomAccessFile 既可以读文件,也可以写文件。

总结

很多初学者刚刚学习 java 的 IO 时会比较茫然,确实 IO 类很多,不容易记忆,不过我们可以尝试对其进行总结记忆,把流式部分概括为:两对应一桥梁一随机。

两个对应指:

  1. 字节流(Byte Stream)和字符流(Char Stream)的对应;
  2. 输入和输出的对应。
  3. 一个桥梁指:从字节流到字符流的桥梁。对应于输入和输出为InputStreamReader和OutputStreamWriter;
  4. 一个随机是:RandomAccessFile。可以随机读取文件。

以上是关于java 中对输入输出流类型重复调用,只对最后一次调用进行关闭,之前的调用不关闭,会有啥后果?的主要内容,如果未能解决你的问题,请参考以下文章

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

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

JAVA基础——IO流字符流

Java基础教程(25)--I/O流

剑指offer——字符流中第一个不重复的字符

剑指offer——字符流中第一个不重复的字符