使用字节流读写数据
来源:互联网 发布:小黑屋写作软件 编辑:程序博客网 时间: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");
//使用 FileInputStream的read()方法读取数据,需要传入一个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 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】
- 使用字节流读写数据
- java 使用字节流读写数据
- JAVA IO :使用带缓冲的字节流读写数据
- java17.IO操作------使用字节流读写数据
- java-IO操作——使用字节流读写数据
- IO学习之使用字节流读写数据
- 使用带有缓冲的字节流读写数据
- 使用缓冲字节流:BufferedInputStream与BufferedOutputStream读写数据
- 使用字节流读写中文字符
- 使用字节流对象读写文件
- java18.IO操作------使用带缓冲的字节流读写数据
- 利用字节流字符流操作数据读写
- 使用基本字节输入流,字节输出流一次读写一个字节来复制文本 文件
- 使用字符流读写数据
- 使用字节流、字符流读写文件基础
- 使用字符/字节流对文件进行读写操作
- Java使用字节流读取数据
- Java 字节流读写文件
- MFC键盘按键的表示
- <计算机网络总结>
- 欢迎使用CSDN-markdown编辑器
- 2017跟着小虎玩着去软考--项目管理师上午考试试题之四(解析2016下半年项目管理师上午试题12-15题)
- Effective Java 读书笔记(一):使用静态工厂方法代替构造器
- 使用字节流读写数据
- jquery的$().each,$.each的区别
- JUnit学习
- Android线程池(四)ThreadPoolExecutor类源码解析
- 笔试知识点:面试常考点static
- MySQL忘记root密码
- 1007. 素数对猜想 (20)
- 2017 JAVA方向实习要求汇总
- 模拟实现string