使用字节流读写数据
-------------siwuxie095
工程名:TestRWByteStream
包名:com.siwuxie095.bytestream
类名:ReadByteStream.java、WriteByteStream.java、CopyByByteStream.java
手动在工程上创建文件:
在工程名:TestRWByteStream 上,右键->New->Untitled Text File,
输入文本,保存路径选择 TestRWByteStream,命名为 text.txt
text.txt 的内容如下:
打开资源管理器,在工程 TestRWByteStream 文件夹下,放入一张
GIF图片:cherry.gif
工程结构目录如下:
ReadByteStream.java:
package com.siwuxie095.bytestream;
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException;
public class ReadByteStream {
public static void main(String[] args) {
//使用字节流读取文件 //这里读取的是文本数据,所以后面的操作中使用的是文本方式 //对当前读到的字节进行解码 //如果操作的是别的类型的文件,如:MP3,影片等, //后续需要对读取到的字节使用另外的方式进行解码
try {
//创建一个文件输入流 FileInputStream 传入String型参数:text.txt //(一般由 Stream 结尾是字节流) //有异常抛出,用 try catch 捕获:Surround with try/catch FileInputStream fis=new FileInputStream("text.txt");
//使用 FileInputStream的read()方法读取数据,需要传入一个byte型数组参数 //根据字节数组的大小从文件中读取相应数量的数据放入到数组中 //要读取到字节数组中首先要创建一个字节数组,指定的字节数组的长度不能超过文件的大小 //执行读取操作 fis.read() 时会有异常抛出, //添加到try catch语句中:Add catch clause to surrounding try byte input[]=new byte[20]; fis.read(input);
//将数组读取到input数组中后,由于知道读取的目标是一个文本文档 //可以把当前读取到的数据转换成字符串 // //创建一个String对象,传入数组input,此时数组长度为20, //(1)打印发现出现问号,这是因为在读取时,假如每一个汉字占两个字节, //如果当前读取到汉字的第一个字节就结束的话,数据就被损坏了 //(2)此时将数组的长度改为22,就正常显示了 // //这里并没有出现乱码的问题,因为在系统的默认情况下,Java会以当前系统的默认字符集作为解码方式 //由于默认字符集就是 UTF-8,和写入文件 text.txt 时使用的字符集相同,所以没有乱码 // //如果只传入数组input的同时,手动指定字符集,如果指定错误就会乱码 //(3)当前文本 text.txt 是UTF-8,如果强制当前String使用GBK方式来解码,输出就会乱码 //String inputString=new String(input,"GBK"); String inputString=new String(input,"UTF-8"); System.out.println(inputString);
//当输入输出流操作完毕后,要将流关闭 fis.close();
//流的打开(new)、流的读取/写入、流的关闭 //才是一个完整的流的操作过程
} catch (FileNotFoundException e) { //FileInputStream 的 catch e.printStackTrace(); } catch (IOException e) { //fis.read() fis.close() 的catch e.printStackTrace(); } }
} |
运行一览:
(1)当数组长度为 20 时:
(2)当数组长度为 22 时:
(3)当指定编码为 GBK 时:
WriteByteStream.java:
package com.siwuxie095.bytestream;
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException;
public class WriteByteStream {
public static void main(String[] args) {
//使用字节流写入文件
try {
//创建一个文件输出流 FileOutputStream 实例 //传入字符串,为当前的文件输出流指定文件 //有异常抛出,使用 try catch语句捕获:Surround with try/catch FileOutputStream fos=new FileOutputStream("textx.txt");
//使用 FileOutputStream 的 write() 方法写出数据 //这里选择写出字节数组的方法,需要有一个字节数组作参数 //因为要写出的数据是文本数据,先创建一个String String outString="write:123456写出数据";
//可以直接从当前的String对象中获取它的字节数组 //同时可以使用字符串指定字符编码 byte output[]=outString.getBytes();
//在这里由于写出的是文本文件,所以在写出数组之前,是将String获取为字节数组 //如果需要写出别的类型的数据,如:音乐、电影、图片等,需要使用对应的方法将 //那些数据同样转换为字节型的数组,然后再进行写出
//传入output,同时有异常抛出,使用 try catch包围 //Add catch clause to surrounding try fos.write(output);
//当输入输出流操作完毕后,要将流关闭 fos.close();
//流的打开(new)、流的读取/写入、流的关闭 //才是一个完整的流的操作过程
} catch (FileNotFoundException e) { //FileOutputStream 的 catch e.printStackTrace(); } catch (IOException e) { //fos.write() fos.close() 的 catch e.printStackTrace(); } }
} |
运行后,工程结构目录一览:
textx.txt 的内容:
CopyByByteStream.java:
package com.siwuxie095.bytestream;
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException;
public class CopyByByteStream {
/** * 文件的拷贝: * * 字节流能将文件的数据读取到本地的字节数组当中, * 而且字节流也能将本地的字节数组写入到文件当中, * * 如果将这个字节数组作为中间的链接,同时使用输入流和输出流, * 就可以实现文件的拷贝 * * @param args */ public static void main(String[] args) {
//通过字节的输入流和输出流,实现文件读取、文件写入、文件拷贝
try {
//会有异常抛出,选中下面一段代码,右键->Surround With->Try/catch Block //创建一个文件输入流,读取文件数据 //(这里是一张樱花飘落的GIF图:28 KB--29256 byte) FileInputStream fis=new FileInputStream("cherry.gif"); //再创建一个文件输出流,作为文件的拷贝对象 FileOutputStream fos=new FileOutputStream("cherry_new.gif");
//文件输入流直接将数据读取到一个字节型数组:input数组中,直接将该数组写出到新的文件
//FileInputStream 的 read() 方法可以将文件数据读取到一个字节型的数组当中 //先创建一个字节型的数组,并指定大小为50 byte input[]=new byte[50];
//但当前的文件是 28 KB,50个字节只能读取一小部分,远远不够 //需要循环将文件里的数据读取并写入到新的文件中 //FileInputStream 的 read() 方法,返回一个int型值, //这个int值代表从文件读取到数组中的数据长度,如果返回-1, //则说明文件中已经没有数据了,即读取到文件末尾了 //有异常抛出:Add catch clause to surrounding try while (fis.read(input)!=-1) { //读取到数组中后,再写入到新的文件中 fos.write(input); }
//写出之后,关闭流 fis.close(); fos.close(); System.out.println("done");
} catch (FileNotFoundException e) { //FileInputStream FileOutputStream 的 catch e.printStackTrace(); } catch (IOException e) { //fis.read() fos.write() fis.close() fos.close() 的 catch e.printStackTrace(); }
}
} |
运行一览:
运行后,工程结构目录一览:
【made by siwuxie095】
posted on 2017-03-25 22:36 siwuxie095 阅读(2802) 评论(0) 编辑 收藏 举报