java使用字节流读数据_使用字节流读写数据

-------------siwuxie095

工程名:TestRWByteStream

包名:com.siwuxie095.bytestream

类名:ReadByteStream.java、WriteByteStream.java、CopyByByteStream.java

手动在工程上创建文件:

在工程名:TestRWByteStream 上,右键->New->Untitled Text File,

输入文本,保存路径选择 TestRWByteStream,命名为 text.txt

text.txt 的内容如下:

5d0dccd82d8b7da91fd8c8970faca9a3.png

打开资源管理器,在工程 TestRWByteStream 文件夹下,放入一张

GIF图片:cherry.gif

工程结构目录如下:

fb50d515ead76a1326bdf4e2c32245a0.png

ReadByteStream.java:

packagecom.siwuxie095.bytestream;

importjava.io.FileInputStream;

importjava.io.FileNotFoundException;

importjava.io.IOException;

public classReadByteStream {

public staticvoidmain(String[] args) {

//使用字节流读取文件

//这里读取的是文本数据,所以后面的操作中使用的是文本方式

//对当前读到的字节进行解码

//如果操作的是别的类型的文件,如:MP3,影片等,

//后续需要对读取到的字节使用另外的方式进行解码

try{

//创建一个文件输入流FileInputStream传入String型参数:text.txt

//(一般由Stream结尾是字节流)

//有异常抛出,用try catch捕获:Surround with try/catch

FileInputStream fis=newFileInputStream("text.txt");

//使用FileInputStream的read()方法读取数据,需要传入一个byte型数组参数

//根据字节数组的大小从文件中读取相应数量的数据放入到数组中

//要读取到字节数组中首先要创建一个字节数组,指定的字节数组的长度不能超过文件的大小

//执行读取操作fis.read()时会有异常抛出,

//添加到try catch语句中:Add catch clause to surrounding try

byteinput[]=newbyte[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=newString(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 时:

aead3904a06fa39f94c077fb6b9e6774.png

(2)当数组长度为 22 时:

fb4ccf65c5d7c54ca66fff79bd21352c.png

(3)当指定编码为

GBK 时:

eb0a1a6347a38f9f7bc95685d4bd0eac.png

WriteByteStream.java:

packagecom.siwuxie095.bytestream;

importjava.io.FileNotFoundException;

importjava.io.FileOutputStream;

importjava.io.IOException;

public classWriteByteStream {

public staticvoidmain(String[] args) {

//使用字节流写入文件

try{

//创建一个文件输出流FileOutputStream实例

//传入字符串,为当前的文件输出流指定文件

//有异常抛出,使用try catch语句捕获:Surround with try/catch

FileOutputStream fos=newFileOutputStream("textx.txt");

//使用FileOutputStream的write()方法写出数据

//这里选择写出字节数组的方法,需要有一个字节数组作参数

//因为要写出的数据是文本数据,先创建一个String

String outString="write:123456写出数据";

//可以直接从当前的String对象中获取它的字节数组

//同时可以使用字符串指定字符编码

byteoutput[]=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();

}

}

}

运行后,工程结构目录一览:

fb9c1c9962fb1473be75299bb40d4878.png

textx.txt 的内容:

8fb1aae0d346eeb421ecb14a4f78678f.png

CopyByByteStream.java:

packagecom.siwuxie095.bytestream;

importjava.io.FileInputStream;

importjava.io.FileNotFoundException;

importjava.io.FileOutputStream;

importjava.io.IOException;

public classCopyByByteStream {

/**

*文件的拷贝:

*

*字节流能将文件的数据读取到本地的字节数组当中,

*而且字节流也能将本地的字节数组写入到文件当中,

*

*如果将这个字节数组作为中间的链接,同时使用输入流和输出流,

*就可以实现文件的拷贝

*

* @param args

*/

public staticvoidmain(String[] args) {

//通过字节的输入流和输出流,实现文件读取、文件写入、文件拷贝

try{

//会有异常抛出,选中下面一段代码,右键->Surround With->Try/catch Block

//创建一个文件输入流,读取文件数据

//(这里是一张樱花飘落的GIF图:28 KB--29256 byte)

FileInputStream fis=newFileInputStream("cherry.gif");

//再创建一个文件输出流,作为文件的拷贝对象

FileOutputStream fos=newFileOutputStream("cherry_new.gif");

//文件输入流直接将数据读取到一个字节型数组:input数组中,直接将该数组写出到新的文件

//FileInputStream的read()方法可以将文件数据读取到一个字节型的数组当中

//先创建一个字节型的数组,并指定大小为50

byteinput[]=newbyte[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();

}

}

}

运行一览:

15f1f27ab9ad6de4b5453ccceb920852.png

运行后,工程结构目录一览:

7ae3598cff1fbca2c81b66f5d92f834e.png

【made by siwuxie095】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值