使用字节流读写数据

来源:互联网 发布:小黑屋写作软件 编辑:程序博客网 时间:2024/06/18 18:06

-------------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 staticvoid main(String[] args) {

 

//使用字节流读取文件

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

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

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

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

 

try {

 

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

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

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

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

 

 

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

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

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

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

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

byte input[]=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=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 staticvoid 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 staticvoid 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[]=newbyte[50];

 

 

//但当前的文件是 28 KB50个字节只能读取一小部分,远远不够

//需要循环将文件里的数据读取并写入到新的文件中

//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】

0 0
原创粉丝点击