java socket close关闭输入流 close()问题

博客分类:
最近在复习java的IO流,发现zip流这块还是空白,所以补补课,发现一片比较好的文档,所以转载了,出处:,个人觉得写的比较好,其中的方法我也按照它的思路测试过,没有问题。
1、了解压缩流的主要作用
2、了解JAVA IO 支持的三种压缩格式
3、掌握ZipOutputStream、ZipFile、ZipInputStream 三个类的作用
经常可以看见各种压缩文件:zip、jar、GZ、
正常情况下在IO 操作中,所有的类库都是在 IO 包中。
在实例化ZipEntry 的时候,要设置名称,此名称实际上就是压缩文件中每一个元素的名称。
1、ZipOutputStream
此类的功能就是完成ZIP格式输出的。
继承关系:
java.util.zip.ZipOutputStream
从定义可以发现,就是一个字节的输出流。
public void putNextEntry( e)
在压缩文件中,每一个压缩的内容都可以用一个ZipEntry 表示,所以在进行压缩之前必须通过putNextEntry 设置一个ZipEntry 即可。
import java.io.F
import java.io.FileInputS
import java.io.InputS
import java.util.zip.ZipE
import java.util.zip.ZipOutputS
import java.io.FileOutputS
public class ZipOutputStreamDemo01{
public static void main(String args[]) throws Exception{
File file = new File("d:" + File.separator + "mldn.txt") ;
File zipFile = new File("d:" + File.separator + "mldn.zip") ;
InputStream input = new FileInputStream(file) ;
ZipOutputStream zipOut = null ;
zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ;
zipOut.putNextEntry(new ZipEntry(file.getName())) ;
zipOut.setComment("www.mldnjava.cn") ;
int temp = 0 ;
while((temp=input.read())!=-1){
zipOut.write(temp) ;
input.close() ;
zipOut.close() ;
以上的操作代码完成的只是一个文件的压缩,如果要完成一个文件夹呢?
import java.io.F
import java.io.FileInputS
import java.io.InputS
import java.util.zip.ZipE
import java.util.zip.ZipOutputS
import java.io.FileOutputS
public class ZipOutputStreamDemo02{
public static void main(String args[]) throws Exception{
File file = new File("d:" + File.separator + "mldn") ;
File zipFile = new File("d:" + File.separator + "mldndir.zip") ;
InputStream input = null ;
ZipOutputStream zipOut = null ;
zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ;
zipOut.setComment("www.mldnjava.cn") ;
int temp = 0 ;
if(file.isDirectory()){
File lists[] = file.listFiles() ;
for(int i=0;i&lists.i++){
input = new FileInputStream(lists[i]) ;
zipOut.putNextEntry(new ZipEntry(file.getName()
+File.separator+lists[i].getName())) ;
while((temp=input.read())!=-1){
zipOut.write(temp) ;
input.close() ;
zipOut.close() ;
3.2 ZipFile
是一个专门表示压缩文件的类。
ZipFile 在实例化的时候必须接收File 类的实例。此File 类的实例是指向一个压缩 *.zip 文件。
第一步:为 ZipFile 实例化
实例化时需要接收File
import java.io.F
import java.io.FileInputS
import java.io.InputS
import java.util.zip.ZipE
import java.util.zip.ZipOutputS
import java.util.zip.ZipF
import java.io.FileOutputS
public class ZipFileDemo01{
public static void main(String args[]) throws Exception{
File file = new File("d:" + File.separator + "mldn.zip") ;
ZipFile zipFile = new ZipFile(file) ;
System.out.println("压缩文件的名称:" + zipFile.getName()) ;
通过ZipFile 文件,为mldn.zip 进行解压缩操作。
import java.io.F
import java.io.FileInputS
import java.io.InputS
import java.util.zip.ZipE
import java.util.zip.ZipOutputS
import java.io.FileOutputS
public class ZipOutputStreamDemo02{
public static void main(String args[]) throws Exception{
File file = new File("d:" + File.separator + "mldn") ;
File zipFile = new File("d:" + File.separator + "mldndir.zip") ;
InputStream input = null ;
ZipOutputStream zipOut = null ;
zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ;
zipOut.setComment("www.mldnjava.cn") ;
int temp = 0 ;
if(file.isDirectory()){
File lists[] = file.listFiles() ;
for(int i=0;i&lists.i++){
input = new FileInputStream(lists[i]) ;
zipOut.putNextEntry(new ZipEntry(file.getName()
+File.separator+lists[i].getName())) ;
while((temp=input.read())!=-1){
zipOut.write(temp) ;
input.close() ;
zipOut.close() ;
以上的操作中,有一个问题,必须知道压缩文件中的每一个压缩实体的名称才可以进行解压缩操作,而如果现在在假设是一个文件夹呢? 3、ZipInputStream
java.util.zip.ZipInputStream
import java.io.F
import java.io.FileInputS
import java.io.InputS
import java.util.zip.ZipE
import java.util.zip.ZipInputS
import java.io.FileInputS
public class ZipInputStreamDemo01{
public static void main(String args[]) throws Exception{
File zipFile = new File("d:" + File.separator + "mldn.zip") ;
ZipInputStream input = null ;
input = new ZipInputStream(new FileInputStream(zipFile)) ;
ZipEntry entry = input.getNextEntry() ;
System.out.println("压缩实体名称:" + entry.getName()) ;
input.close() ;
利用此特性并结合 ZipFile 就可以完成解压缩文件夹的功能。
ZipFile 对象,可以找到每一个ZipEntry 的输入流。但是ZipInputStream 并不能得到每一个输入流,所以需要使用ZipFile,但是ZipInputStream
在取得每一个ZipEntry 的时候,不需要每一个ZipEntry 的时候,不需要每一个ZipEntry 的名称。
import java.io.F
import java.io.OutputS
import java.io.InputS
import java.util.zip.ZipE
import java.util.zip.ZipF
import java.util.zip.ZipInputS
import java.io.FileInputS
import java.io.FileOutputS
public class ZipInputStreamDemo02{
public static void main(String args[]) throws Exception{
File file = new File("d:" + File.separator + "mldndir.zip") ;
File outFile = null ;
ZipFile zipFile = new ZipFile(file) ;
ZipInputStream zipInput = null ;
OutputStream out = null ;
InputStream input = null ;
ZipEntry entry = null ;
zipInput = new ZipInputStream(new FileInputStream(file)) ;
while((entry = zipInput.getNextEntry())!=null){
System.out.println("解压缩" + entry.getName() + "文件。") ;
outFile = new File("d:" + File.separator + entry.getName()) ;
if(!outFile.getParentFile().exists()){
outFile.getParentFile().mkdir() ;
if(!outFile.exists()){
outFile.createNewFile() ;
input = zipFile.getInputStream(entry) ;
out = new FileOutputStream(outFile) ;
int temp = 0 ;
while((temp=input.read())!=-1){
out.write(temp) ;
input.close() ;
out.close() ;
input.close() ;
如果目录不存在,则应该进行创建操作。
1、压缩文件中的每一个压缩实体都使用ZipEntry 保存,一个压缩文件中可能包含一个或多个的ZipEntry 对象。
2、在JAVA中可以进行zip、jar、gz、三种格式的压缩支持,操作流程基本上是一样的
3、ZipOutputStream 可以进行压缩输出,但是输出的位置不一定是文件。
4、ZipFile 表示每一个压缩文件,可以得到每一个压缩实体的输入流
5、ZipInputStream 可以得到每一个实体,但是却无法得到每一个实体的输入流。
附件为我个人测试用的代码,和文章中提到的方法和思路基本是一致的。
附加一段拷贝文件夹的代码:
package com.fit.test.io.
import java.io.F
import java.io.FileInputS
import java.io.FileOutputS
import java.io.IOE
public class Test {
private static void copy(File originalFile, File goalFile)
throws IOException {
if (!goalFile.exists()) {
goalFile.mkdirs();
if (originalFile.isFile()) {
copy(originalFile, new File(goalFile, originalFile.getName()));
if (originalFile.isDirectory()) {
copyDirectory(originalFile, goalFile);
private static void copyDirectory(File originalFile, File goalFile)
throws IOException {
File toInDir = new File(goalFile, originalFile.getName());
toInDir.mkdir();
File[] fileList = originalFile.listFiles();
if (fileList == null || fileList.length == 0) {
for (int i = 0; i & fileList. i++) {
if (fileList[i].isDirectory()) {
copyDirectory(fileList[i], toInDir);
} else if (fileList[i].isFile()) {
copyFile(fileList[i], new File(toInDir, fileList[i].getName()));
private static void copyFile(File originalFile, File goalFile)
throws IOException {
FileInputStream fis =
FileOutputStream fos =
fis = new FileInputStream(originalFile);
fos = new FileOutputStream(goalFile);
int temp = -1;
byte[] b = new byte[1024];
while ((temp = fis.read(b)) != -1) {
fos.write(b, 0, temp);
fos.flush();
fos.close();
fis.close();
public static void main(String[] args) throws IOException {
File originalFile = new File("F:\\Work\\apache-ant-1.9.2-bin");
File goalFile = new File("F:\\Work\\back");
copy(originalFile, goalFile);
System.out.println("拷贝完成");
下载次数: 26
浏览 11315
beijishiqidu
浏览: 98476 次
来自: 深圳
int temp = 0 ;
while(( ...
学习了,这块自己还得深挖下
这个写的最详细了,赞一个
hanmiao 写道http://yangguangfu.it ...
http://yangguangfu.iteye.com/bl ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'在finally代码块中关闭流的问题【java吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:713,872贴子:
在finally代码块中关闭流的问题收藏
在学习I/O部分的时候,自己动手时一直有个问题没有想明白,向大家请教一下。首先,很多书中都说关闭流资源尽量在finally代码块中关闭,网上很多网友也是这么建议的。可是我实际进行操作的时候却出现了问题。见图这里其实有这样几个问题:1.
fis声明在try代码块外,没有赋初值,如果try代码块执行失败,fis将是没有被初始化的变量,在finally块中调用fis.close()必然失败。如果将fis赋初值null,同样将抛出NullPointerException异常。2.
fis.close()本身会抛出IOException异常,而在finally代码块中如果再写一个try...catch...来处理这个异常感觉代码就很臃肿了。因为这两个问题,我一般就习惯在try代码块的最后关闭资源,但是据说这样的方法不安全,因为如果中途出现了异常就可能导致资源未被关闭。当然,这些问题在jdk7中可以使用try(FileInputStream fis = new ...)这样的方式来避免。但是我想知道,在jdk7之前,大家是通过什么样的方式避免以上的两个问题的?
软件培训公司,博为峰软件培训免费试听,0元入学,签署就业保障协议,不就业不收费!博为峰,真正的为年轻人服务的企业,14年间培训15万余名软件工程师,成绩斐然!
程序出问题的情况下你准备怎么关闭流
if 流不为空,才关闭
初始为null
你可以直接写在try后面C++就是这么做的,因为你的异常并没有向往抛出到别的类上面,所以没什么不安全的,程序的控制权还是在你这个类里面。至于不安全的情况是怕碰到发生没有捕捉到的异常或者这个类在发生异常把异常抛出导致程序的控制权移交到别的类,你这个类就执行到这里就断了。但是你仅仅只是在打印,并没有向别的类移交控制权,所以你可以直接写在catch后面他一定会执行的。接下来说一说close,他也是会发生异常的,最明显的异常就是nullpointer,因为File对象为null。java过于严谨的语法规则就是需要你显式处理所有可预见异常。所以close也需要try...cache,很臃肿吧,可是没办法就是这么规定的,好在java被oracle收购了之后开始学习别的语言好的东西了,比如吸收了C++11标准中的lambda和python特有的with (就是你写的try(...))。从而向着灵活读更高的方向上发展了。
我来灌个水!...try {...Stream stream = new Stream()try {...} finally { stream.close() }...} catch (IOException) { ... }...
要我就再try一遍了、同求更好的处理方式
程序出问题的情况下你准备怎么关闭流
我一般是写一个静态方法 专门用来关闭各种closeable 捕获所有异常 放在finally块里执行
没看懂。如果try代码块执行失败,fis将是没有被初始化的变量
要么直接在try里 要么再try catch一遍。看你自己
刚刚查了一下书,也正如大家说的,采用的方法就是再多写一个try...catch...捕捉异常。自己对一些基础的东西理解得还是不够透彻啊。。。
正确答案五楼
好吧,我把自己的问题明确一下,顺便也把大家的答案总结一下,写在下面。大家看看对不对,也避免误导别人。首先,fis必须初始化,否则(1)语句发生异常时,fis保持为未初始化的变量。对于存在可能尚未初始化变量的代码会导致编译错误。第二,如果(1)语句抛出异常,则输入流没有创建成功,在finally块中跳过关闭阶段。第三,如果(1)语句正常,(2)语句抛出异常,则在finally块中将关闭fis输入流。因为关闭流同样可能引发异常,故需对16-20行继续使用try...catch...语句。第四,如果不使用finally块,而把fis.close()放置于(2)语句之后,则当(2)语句发生异常时,fis.close()将无法执行,fis输入流没有关闭。
用过jdbc就不会有这样的疑问了!
if(fis!=null){try{
fis.close();}catch(IOException e){}fis=}如果在关闭时出现了异常,将其值为null,交由垃圾处理器处理!
据说jdk7可以这样写,就可以自动关闭了
空指针异常判断一下,IOExcpetion直接丢出去,这样你就不用写try catch了,然后在另一个类里调用,因为原类里的IO异常通通被抛了出来,所以在调用的类里就只需要一个try catch把调用方法阔起来就行了
楼主所说的“当然,这些问题在jdk7中可以使用try(FileInputStream fis = new ...)”是什么意思。
确实是要try
初始化对象赋null
登录百度帐号Java中Scanner的输入流的关闭问题
时间: 22:44:47
&&&& 阅读:565
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&为什么Scanner in语句只能关闭一次,且对于其他任何Scanner输入流也关闭?
import&java.util.S&&
public&class&ScannerTest&{&&
&&&&public&static&void&main(String[]&args)&{&&
&&&&&&&&Scanner&inputA&=&new&Scanner(System.in);&&
&&&&&&&&Scanner&inputB&=&new&Scanner(System.in);&&
&&&&&&&&int&numberA&=&input1.nextInt();&&
&&&&&&&&int&numberB&=&input1.nextInt();&&
&&&&&&&&inputA.close();&&
&&&&&&&&System.out.println(numberA);&&
&&&&&&&&System.out.println(numberB);&&
运行后java报错“java.util.NoSuchElementException.”
查阅API后可知&System.in“标准”输入流。此输入流已打开并准备提供输入数据。通常,此输入流对应键盘输入、由主机环境或用户指定的另一个输入源。&当inputA调用close()方法后,System.in这个流将会关闭,而这种关闭将是永久性的,导致之后将不能接受任何数据,从而引发java.util.NoSuchElementException的错误,而且将“Scanner inputB = new Scanner(System.in);”这行代码移动到“inputA.close();”后面依旧是同样的错误,则说明当流关闭一次后就再也无法重新打开了。
& & & & & & & & & & & & & & & & & & & & & & &--youhow
& & & & & & & & & & & & & & & & & & & & & & &如有错误敬请批评指正!谢谢!标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&原文:http://www.cnblogs.com/Sunrises/p/7277162.html
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!java中一个关于输入流中read(byte b[])方法的问题_百度知道
java中一个关于输入流中read(byte b[])方法的问题
代码如下:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
public class Example11_1{
public static void main(String args[]){
new NetWin();
class NetWin ex...
先谢谢一楼的回答。那就是说这个read方法读出来的长度是不确定的?那总有一定的规律的吧(输入yahoo网址的时候第一次循环老是读出26个啊)?还是完全是巧合?能说清楚一点吗,本人刚学java不久,谢谢了。
我有更好的答案
谁说是尽量填满???b只是当个缓冲区用。这个read方法返回实际读取的长度。如果每次都一样,那就根本不用返回了。每次都一样长,那还叫流
采纳率:15%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 java close 的文章

 

随机推荐