1. Java 中有几种类型的流
按照流的方向:输入流(inputStream)和输出流(outputStream)。
按照实现功能分:节点流(可以从或向一个特定的地方(节点)读写数据。如 FileReader)和处理流(是对一个 已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如 BufferedReader。处理流的构造方法总是要 带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。)
按照处理数据的单位:字节流和字符流。字节流继承于 InputStream 和 OutputStream,字符流继承于 InputStreamReader 和 OutputStreamWriter
这篇主讲字节流,下一篇会将字符流
字节流
一切的文本数据(文本,图片,视频)都是二进制存储,所以理论上字节流可以传输任何的数据。
字节输出流:
写出字节与字节数组
//(在项目根目录)创建流对象(如果没有文件就创建文件,存在就覆盖文件)
FileOutputStream fileOutputStream=new FileOutputStream("a.txt");
//写出一个字节
fileOutputStream.write(97);
//将字符串转换为字节数组
byte[] a="你好输出流".getBytes();
//写出字节数组
fileOutputStream.write(a);
//关闭流
fileOutputStream.close();
运行结果:在项目的根目录下生成了一个a.txt内容如下
以上的代码每次运行都会重新覆盖原有内容
数据追加续写与换行:
//true为开启数据追加
FileOutputStream fileOutputStream=new FileOutputStream("a.txt",true);
//换行
fileOutputStream.write("\r\n".getBytes());
byte[] a="追加内容".getBytes();
fileOutputStream.write(a);
运行结果:
以上为a.txt的内容
字节输入流:
//获取流对象
FileInputStream fileInputStream=new FileInputStream("a.txt");
//读到最后返回-1
//读取a.txt的内容输出
while (fileInputStream.read()!=-1){
//读取一个字节
int read=fileInputStream.read();
//将读取的字节输出
System.out.print((char) read);
以上代码为读取a.txt三个字节并将结果输出到控制台上
输出结果中有乱码
我们可以通过String来解决,String的构造方法有解码功能
FileInputStream inputStream=new FileInputStream("a.txt");
byte[] bytes=new byte[1024];
int len;
while ((len=inputStream.read(bytes))!=-1){
System.out.print(new String(bytes,0,len));
}
运行结果:
在使用字节输入流时还有一点要非常注意:
FileInputStream inputStream=new FileInputStream("b.txt");
byte[] bytes=new byte[2];
int len;
while ((len=inputStream.read(bytes))!=-1){
System.out.print(new String(new String(bytes)));
}
这个代码只是读取b.txt,然后输出结果
b.txt内容
运行结果:
以上的运行结果为什么多了一个d?
这是由于d没有被覆盖掉
由于每次读取两个字节
所以会将d也输出
复制本地图片:
try {
//读取根目录文件0.png
FileInputStream fis=new FileInputStream("0.png");
//设置字节数组大小与图片大小一至方便一次读取
byte[] arr2=new byte[23367130];
fis.read(arr2);
//在根目录写文件1.png
FileOutputStream fos=new FileOutputStream("1.png");
fos.write(arr2);
//关闭流
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
运行结果:在项目的根目录生成了一个与0.png一摸一样的图片1.png
需要将0.png复制到项目的根目录(也可以写绝对路径或相对路径)