⑴ java 的输入输出流 如果在程序中没有close掉 那么关闭程序之后 流会自动关闭吗
一般会自动关闭的,程序关闭时,会自动把流关闭
但是,这并不意味着你可以不用自己关闭输入输出流,那样的话,可能导致数据丢失……
养成好习惯,有打开就有关闭,这样才是最好的,最安全的……
⑵ Java:写文件时除了流以外,File也需要关闭
file就不需要了吧,反正你看到有close的方法的,就写下吧,我就这样,不过我好像记得file不需要的。把流就够了
⑶ java直接return的文件流如何关闭
代码如下:
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.IOException;
publicclassApp{
publicstaticvoidmain(String[]args)throwsIOException{
//第一种方式,稍嫌麻烦
FileOutputStreamoutputStream=null;
try{
outputStream=newFileOutputStream(newFile("data.txt"));
outputStream.write(newbyte[]{0x11,0x22,0x33,0x44});
//在这里可以直接return,会调用finally中的代码
}finally{
if(outputStream!=null){
try{
outputStream.close();
}catch(IOExceptione){
}
}
}
//第二种方式,比较简洁,不用显式调用close(),会自动调用close();
try(FileInputStreaminputStream=newFileInputStream(newFile("data.dat"))){
byte[]buf=newbyte[4];
inputStream.read(buf);
//可以在这里调用return,在这个{}代码块结束时,close会自动执行,
}
}
}
⑷ Java:这里的两个流都需要关闭吗
ois.close();这个一定要,每次构造ObjectInputStream都先回向流中读那4个标志字节,你只new 了一次ObjectInputStream,所以只向流中读一次那4个字节,所以读完第一个对象后,流中接下来的4个字节是标志字节,不是对象的序列化信息,所以用再用readObject()会出现StreamCorruptedException异常。
is.close();也要,文件流一直打开着。
哦你说关闭ois的时候会将is也一同关闭吗?不会的,刚好理解反了。
先有了文件流,打开了文件,然后在这个基础上输入输出流,你光把输入输出关了,文件流又没变,只不过就是你开着文件不去读写罢了,流还是在的。都要关闭的。
⑸ JAVA中文件流和字符流操作完成后,如不关闭,会出现什么情况
字符流不关闭是没关系的 垃圾收集到最后会自动为你回收
只不过要多占用内存一会而已
但如果文件流布关闭(尤其是独占模式下)
则会出现异常 对外的程序也打不开这个文件
因此要记得关闭它
⑹ java;怎么关闭流文件
最好声明在一个特定的作用域里面,这样作用域一到自己就释放掉了,也就不存在什么你来关闭了,因为很多内置类析构函数都是有很完整的系统垃圾回收机制。不要做重复的事,当然如果你需要关闭之后在打开,你可以使用手动关闭。
⑺ 关于java中io流的关闭问题,部分代码,这种情况用不用关闭new FileReader(file)
是的,你的new FileReader(file)是一个匿名对象。
JVM中对于那些打开了没有关闭的IO文件流,会在不再被使用的情况下,等到下次做Full GC的时候把他们全部回收,尽量少使用这种写法。文章来自:http://blog.csdn.net/kongxx/article/details/6405914
⑻ 为什么在java中打开流后一定要关闭流好像关不关没有不同,程序的结果都是一样的。。。
这跟资源的占用有关
比如你将一个100MB的word文档转换成流,然后进行分析存储到数据库一样
它是将这100MB的东西读到内存,然后进行处理,如果你在使用的时候不关闭
那么java就认为你是一直在使用
而不进行垃圾回收
那么就占你100MB的内存
这样有可能导致内存溢出
⑼ java的几种IO流读取文件方式
一、超类:
字节流: InputStream(读入流) OutputStream(写出流)
字符流: Reader(字符 读入流) Writer (字符写出流)
二、文件操作流
字节流: FileInputStream ,FileOutputStream
字符流: FileReader, FileWriter(用法与字节流基本相同,不写)
//1.指定要读 的文件目录及名称
File file =new File("文件路径");
//2.创建文件读入流对象
FileInputStream fis =new FileInputStream(file);
//3.定义结束标志,可用字节数组读取
int i =0 ;
while((i = fis.read())!=-1){
//i 就是从文件中读取的字节,读完后返回-1
}
//4.关闭流
fis.close();
//5.处理异常
//1.指定要写到的文件目录及名称
File file =new File("文件路径");
//2.创建文件读入流对象
FileOutputStream fos =new FileOutputStream(file);
//3.定义结束标志
fos.write(要写出的字节或者字节数组);
//4.刷新和关闭流
fos.flush();
fos.close();
//5.处理异常
三、缓冲流:
字节缓冲流: BufferedInputStream,BufferedOutputStream
字符缓冲流:BufferedReader ,BufferedWriter
缓冲流是对流的操作的功能的加强,提高了数据的读写效率。既然缓冲流是对流的功能和读写效率的加强和提高,所以在创建缓冲流的对象时应该要传入要加强的流对象。
//1.指定要读 的文件目录及名称
File file =new File("文件路径");
//2.创建文件读入流对象
FileInputStream fis =new FileInputStream(file);
//3.创建缓冲流对象加强fis功能
BufferedInputStream bis =new BufferedInputStream(fis);
//4.定义结束标志,可用字节数组读取
int i =0 ;
while((i = bis.read())!=-1){
//i 就是从文件中读取的字节,读完后返回-1
}
//5.关闭流
bis.close();
//6.处理异常
//1.指定要写到的文件目录及名称
File file =new File("文件路径");
//2.创建文件读入流对象
FileOutputStream fos =new FileOutputStream(file);
//3.创建缓冲流对象加强fos功能
BufferedOutputStream bos=new BufferedOutputStream(fos);
//4.向流中写入数据
bos.write(要写出的字节或者字节数组);
//5.刷新和关闭流
bos.flush();
bos.close();
//6.处理异常
四、对象流
ObjectInputStream ,ObjectOutputStream
不同于以上两种类型的流这里只能用字节对对象进行操作原因可以看上篇的编码表比照原理
ObjectOutputStream对象的序列化:
将java程序中的对象写到本地磁盘里用ObjectOutputStream
eg:将Person类的对象序列化到磁盘
创建Person类
注1:此类要实现Serializable接口,此接口为标志性接口
注2:此类要有无参的构造函数
注3:一旦序列化此类不能再修改
class Person implements Serializable{
public Person(){}
}
2.创建对象流对象
注:要增强功能可以将传入文件缓冲流
ObjectOutputStream oos =new ObjectOutputStream(
new FileOutputStream(new File("文件路径")));
3.写入对象 ,一般会将对象用集合存储起来然后直接将集合写入文件
List<Person> list =new ArrayList<>();
list.add(new Person());
...(可以添加多个)
oos.writeObject(list);
4.关闭流,处理异常
oos.flush();
oos.close();
五、转换流:
这类流是用于将字符转换为字节输入输出,用于操作字符文件,属于字符流的子类,所以后缀为reader,writer;前缀inputstream,outputstream;
注 :要传入字节流作为参赛
InputStreamReader: 字符转换输出流
OutputStreamWriter:字符转换输入流
//1.获取键盘输入的字节流对象
inInputStream in =Stream.in;
/*2.用转换流将字节流对象转换为字符流对象,方便调用字符缓冲流的readeLine()方法*/
InputStreamReader isr =new InputStreamReader(in);
/*5.创建字符转换输出流对象osw,方便把输入的字符流转换为字节输出到本地文件。*/
OutputStreamWriter osw =new OutputStreamWriter(new
FileOutputStream(new File("文件名")));
/*3.现在isr是字符流,可以作为参数传入字符缓冲流中*/
BufferedReader br =new BufferedReader(isr);
/*4.可以调用字符缓冲流br的readLine()方法度一行输入文本*/
String line =null;
while((line =br.readLine()){
osw.write(line);//osw是字符流对象,可以直接操作字符串
}
注:InputStreamReader isr =new InputStreamReader(new "各种类型的字节输入流都行即是:后缀为InputStream就行");
OutputStreamWriter osw =new OutputStreamWriter(new
"后缀为OutputStream就行");
六、区别记忆
1.对象流是可以读写几乎所有类型的只要是对象就行,而字节字符流,只能读写单个字节字符或者字节字符数组,以上没有读写字节字符数组的;注意对象流只有字节流!
2.字符和字节循环读入的结束条件int i=0; (i =fis.read())!=-1
用字符数组复制文件(fr 读入流 ,fw写出流),字节流也是相同的用法
int i = 0; char[] c = new char[1024];
while((i = fr.reade()) !=-1)){
fw.write(c,0,i);
}
123456
3.对象流里面套缓冲流的情景:
new ObjectInputStream(new BufferedInputStream(new FileInputStream(new File(“文件路径”))));
4.记忆流及其功能的方法:
前缀表示功能,后缀表示流的类型;
比如说FileInputStream 前缀:File,表示操作的磁盘,后缀:intputstream,表示是字节输入流。
同理 FileReader:表示操作文件的字符流
ObjectInputStream :操作对象的字节输入流
5.拓展:获取键盘输入的字符的缓冲流的写法:
new BufferedReader(new InputStreamReader(System.in)));
将字节以字符形式输出到控制台的字符缓冲流的写法:
new BufferedWriter( new OutputStreamWriter(System.out))