09 IO 流之——深入了解字节流
上传文件和下载文件(Java程序操作硬盘数据)
IO流是进行数据间传输的
流向(参照物 :程序)
输入 读 Reader
输出 写 write
数据类型
字节流
字节输入流 读取数据 InputStreame(抽象类)
字节输出流 写入数据 OutPutStreame(抽象类)
字符流
字符输入流 读取数据 Reader(抽象类)
FileOutputStream(File file)
字符输出流 写入数据 write(抽象类)
若文本文件能读懂就用字符流,其中字符流是以字节流为基础的
三: FileOutputStream(字节输出流OutPutStreame的子类)的构造方法
FileOutputStream(String name)
package io;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* IO流是进行数据间传输的
* 流向(参照物 :程序)
* 输入 读 Reader
* 输出 写 write
* 数据类型
* 字节流
* 字节输入流 读取数据 InputStreame
* 字节输出流 写入数据 OutPutStreame
* 字符流
* 字符输入流 读取数据 Reader
* 字符输出流 写入数据 write
*
* 若文本文件能读懂就用字符流,其中字符流是以字节流为基础的。
*
* 需求:需要往一个文本文件中输入一hello io;
* FileOutputStream的构造方法
* FileOutputStream(File file)
* FileOutputStream(String name)
*/
public class FileOutputStreamDemo {
public static void main(String[] args) throws IOException {
/*//第一种构造方法FileOutputStream(File file)
File file = new File("file.txt");
FileOutputStream fos = new FileOutputStream("file");*/
//第二种构造方法
FileOutputStream fos = new FileOutputStream("file.txt");
/*
* 创建字节输出流对象做了几件事情
* A: 调用系统功能去创建文件
* B:创建fos对象
* C:把fos对象指向这个文件
* */
fos.write("hello.io".getBytes());
//释放资源
//关闭此文件输出流并释放与此流有关的所有系统资源
fos.close();
//为什么要用close()那?
//A:让流对象变成垃圾,因为这样就能被垃圾回收器回收啦。
//B:通知系统去释放跟该文件相关的资源
}
}
四:字节流写数据的三种方式
public void write(int b) 写一个字节
public void write(byte[] b) 写一个字节数组
public void write(byte[] b,int off,int len) 写一个字节数组的一部分
五:字节流写数据常见的几个问题
1)创建字节输出流到底做了哪些事情?
A : 创建字节输出流对象 B:写数据 C:释放资源
2)数据写成功后,为什么要close()?
A:让流对象变成垃圾,因为这样就能被垃圾回收器回收啦 B:通知系统去释放跟该文件相关的资源
3)如何实现数据的换行?
windows:\r\n linux:\n Mac:\r 而一些高级记事本软件可以识别任意换行符号。
4)如何实现数据的追加写入?
用构造方法带第二个参数是true的情况即可。
FileOutputStream fos = new FileOutputStream("fos.txt",ture);
六 字节输入流操作步骤
A:创建字节输入流对象
B:调用read()方法读取数据,并把数据显示在控制台
C:释放资源
七 读取数据的方式
package io;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 字节输入流操作步骤
* A:创建字节输入流对象
* B:调用read()方法读取数据,并把数据显示在控制台
* C:释放资源
* 读取的方法
* public int read() 一次读取一个字节
* public int read(byte[] b) 一次读取一个字节数组
*/
public class IoDemo04 {
public static void main(String[] args) throws IOException {
//创建字节输入流对象
FileInputStream fis = new FileInputStream("fos.txt");
//调用read()方法读取数据,并把数据显示在控制台
int red = 0;
//读取 赋值 判断
while((red = fis.read())!= -1){
System.out.print((char)red);
}
//释放资源
fis.close();
}
}
八 练习题
package io;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 1 把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中
* 先读 FileInputStream a.txt
* 后写 FileoutputStream b.txt
* 2 把c:\\a.txt内容复制到h:\\b.txt中
* 3 把f:\\华清宫.jpg内容复制到当前项目目录下的mn.jpg中
* 4 把f:\\哥有老婆.mp4复制到当前项目目录下的copy.mp4中
*/
public class IoDemo05 {
public static void main(String[] args) throws IOException {
/* 第一题
封装数据源
FileInputStream fis = new FileInputStream("a.txt");
封装目的地
FileOutputStream fos = new FileOutputStream("b.txt");
//1 把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中
//先读取
int red =0;
while ((red = fis.read())!= -1){
//再写入
fos.write(red);
}*/
/**********************************************************************/
/*第二题
把c:\\a.txt内容复制到h:\\b.txt中
封装数据源
FileInputStream fis = new FileInputStream("c:\\a.txt");
封装目的地
FileOutputStream fos = new FileOutputStream("h:\\b.txt");
//先读取
int red =0;
while ((red = fis.read())!=-1){
//再写入
fos.write(red);
}*/
/**********************************************************************/
/*第三题
把f:\\华清宫.jpg内容复制到当前项目目录下的mn.jpg中
FileInputStream fis = new FileInputStream("f:\\华清宫.jpg");
FileOutputStream fos = new FileOutputStream("mn.jpg");
//先读取
int red =0;
while ((red = fis.read())!=-1){
//再写入
fos.write(red);
}*/
/**********************************************************************/
// 第四题
// 把f:\\哥有老婆.mp4复制到当前项目目录下的copy.mp4中
FileInputStream fis = new FileInputStream("f:\\哥有老婆.mp4");
FileOutputStream fos = new FileOutputStream("copy.mp4");
//先读取
int red =0;
while ((red = fis.read())!=-1){
//再写入
fos.write(red);
}
//释放资源
fis.close();
fos.close();
}
}
九:注意:计算机中中文的存储分两个字节
第一个字节肯定是负数
第二个字节常见的是负数,可能有正数,但是没影响
package io;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 一次读取一个字节数组 int read(byte[] b) int是实际读取的数据个数
*/
public class IoDemo06 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("TransLog.java");
// FileOutputStream fos = new FileOutputStream("zxx.txt");
/* //第一次读取
byte[] by = new byte[5];
int len = fis.read(by);
System.out.println(len);
System.out.println(new String(by));
//第二次读取
len = fis.read(by);
System.out.println(len);
System.out.println(new String(by));
//第三次读取
len = fis.read(by);
System.out.println(len);
System.out.println(new String(by));*/
//释放资源
byte[] by = new byte[1024];
int len = 0;
while((len = fis.read(by))!= -1){
System.out.print(new String(by, 0,len));
}
fis.close();
// fos.close();
}
}
十 带缓冲区的字节类,这种类又被称为缓冲类(高效类)BufferedOutputStream 写数据
BufferedInputStream 读数据
构造方法可以指定缓冲区的大小,默认缓冲区的大小就足够了
为什么不传递一个具体的文件或文件路径,而是传递OutputStream对象呢?
原因很简单,字节缓冲区流仅仅提供缓冲区,为高效设计的,但是呢,真正的读写操作还是靠基本的流对象实现。
上一篇: typescript - 3
下一篇: java集合----TreeSet