Fork me on GitHub

使用字节流读写数据

-------------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");

 

 

//使用 FileInputStreamread()方法读取数据,需要传入一个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 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】

posted on 2017-03-25 22:36  siwuxie095  阅读(2802)  评论(0编辑  收藏  举报

导航