FileOutputStream & FileInputStream 字节流
File只是能操作文件或文件夹 , 但是并不能操作文件中的内容 , 要想操作文件的内容就需要使用文件IO流 , 其操作文件的内容主要有两种方式:以字节的方式和以字符的方式 。而该小节主要讲以字节文件流的形式操作文件内容 , 以字符文件流的方式操作我留到下一小节进行说明 。
在Java中以字节流的形式操作文件内容的类主要是FileOutputStream 和 FileInputStream 。分别是 OutputStream(字节输出流) 和 InputStream(字节输入流) 抽象基类的子类 。下面以图片的复制来展示下该流的用法 。
File sourceFile = new File("sourceFile.jpg"); File destFile = new File("destFile.jpg");FileInputStream fis=null; // 读取源文件的流FileOutputStream fos = null; // 输出到目标文件的流try { fis = new FileInputStream(sourceFile); fos = new FileOutputStream(destFile); byte[] bytes= new byte[1024]; int len = 0; while((len=fis.read(bytes))!=-1) { fos.write(bytes, 0, len); }}catch(IOException ex) {}finally { try { fis.close();} catch(IOException ex) {}try { fos.close();} catch(IOException ex) {} }在使用 FileOutputStream 和 FileInputStream 的过程中需要注意的地方:
FileInputStream 所要操作的文件必须存在 , 否则就会抛出异常 。而 FileOutputStream 写入的目的文件则不需要存在 , 当不存在时会被创建 , 存在的时候会被覆盖 , 也可以使用 FileOutputStream 造函数的第二个参数 , 来实现追加文件内容 。在使用 FileInputStream 读取字节的时候 , 当读取到字节的末尾 , 再继续读取 , 无论多少次都会返回 -1 , 而返回值len表示本次读取了多少个字节 。通常情况下每次读取1024个字节 , 可以达到空间和时间的平衡 。但是具体情况也是需要具体分析的 。字节流是不存在缓冲区的 , 所以不需要使用flush操作刷新缓冲区 , 字节的读取和写入都是通过操作系统来实现的 。只要是流就是需要关闭的 , 无论是否在异常情况下都需要关闭流 , 防止占用系统资源 , 导致其他程序无法对该文件进行操作 。但是在关闭流的时候也有可能会报异常 , 所以也需要 try…catch 。FileOutputStream 和 FileInputStream主要用来操作字节表现形式的文件 , 例如图片 , 可执行程序等 。当然操作字符表现形式的文件也是没有问题的 , 只不过这么干不规范 。
OutputStreamWriter & InputStreamReader
这小节主要讲以字符流的形式操作文件 , 在Java中对应操作的主要类为 OutputStreamWriter 和 InputStreamReader。有时候又称它们为转换流 , 具体原因一会在说 , 先看一个例子 。
File sourceFile = new File("sourceFile.txt");File destFile = new File("destFile.txt"); FileInputStream fis= new FileInputStream(sourceFile);FileOutputStream fos = new FileOutputStream(destFile); InputStreamReader reader=null;OutputStreamWriter writer=null;try { reader= new InputStreamReader(fis,"utf-8"); writer =new OutputStreamWriter(fos,"gbk"); char[] cbuf =new char[1024]; int len=0; while((len=reader.read(cbuf))!=-1) { System.out.println(String.copyValueOf(cbuf,0,len)); writer.write(cbuf, 0, len); }}catch(IOException ex) { try{reader.close();}catch(IOException ex) { } try{writer.close();}catch(IOException ex) { }}上述示例主要实现了一个文件的复制 , 与字节流的使用方式不同的是 , 字符流的构造函数需要传递字节流和编码格式 。这是因为操作文件内容都是以字节的形式来操作的 。字符输入流根据编码表对字节流读取的字节转义成字符 , 同时也说明了传递编码表格式参数的重要性 。如果被读取文件编码格式是UTF-8且不传递这个参数 , 那么这个参数为操作系统的默认编码表(对于Windows而言是GBK) , 如果默认的编码表与UTF-8不同(与系统编码表格式相同 , 可不传递此参数) , 在转义为字符的过程中就会出现问题 。假如文件内容为“好” , 在UTF-8中对应的字节为-10-20-30 。那么就以系统的默认编码表来转义 , 假如默认为GBK , “好”字的编码为-50-60 , 由原来3个字节表示汉字 , 现在变成了2个字节表示汉字 , 又由于编码表不兼容 , 所以导致出现乱码 。而在使用字符输出流的时候 , 将字符按照编码表参数转化为字节后再写入对应编码格式的文件中去 。如果输出的内容是以追加的方式 , 那么需要保证前后两个输出文件内容的编码格式一样 , 否则也会出现乱码 。假如之前的输出文件是GBK格式 , 你使用字符输出流输出的字符格式为UTF8并追加到文件中去 , 这个时候乱码就产生了 。综上过程 , 也就知道大家为什么又称 FileOutputStream 和 InputStreamReader 为转换流了 。
以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!
「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助:- java入门基础知识 java算法题面试
- java解压各种类型的文件 java解压zip文件为空
- 讲解java部署jar还是war优劣 jar运行命令
- java程序员必备的基础知识 java截取字符串后几位
- 哪个培训班靠谱?想要培训Java的应该如何选择? 程序员编程培训
- 自学java坚持不下去了,要找Java培训机构吗 程序员编程培训
- 简单好玩的编程代码 javascriptvoid怎么解决
- 教你javascript实时获取鼠标位置 js获取鼠标点击的位置
- 你做 Java 程序员真的是因为热爱吗? 程序员编程培训
- Java基本数据类型 java字符串拆分为数组