IO
这里写目录标题
1、IO流
IO流用来处理设备之间数据传输的问题
常见应用:文件复制,文件上传,文件下载
IO流分类:
●按数据流向
输入流:读数据
输出流:写数据
●按照数据类型分类
字节流:字节输入流;字节输出流
字符流:字符输入流;字符输出流
一般按照数据类型分类,这两种流的适用情形
●如果数据通过windows自带的记事本软件打开,我们还能读懂其内容,就使用字符流,否则使用字节流。若不知使用哪种就用字节流。
2、字节流
2.1字节流写数据
2.1.1字节流写数据
字节流抽象积累
InputStream:这个抽象类表示字节输入流所有类的超类
OutputStream:这个抽象类表示字节输出流所有类的超类
FileOutputStream:文件输出流用于将数据写入file
●FileOutputStream(String name):创建文件输出流以指定的名称写入文件
使用字节输出流写数据的步骤:
1.创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)
2.调用字节输出流对象的写数据方法
3.释放资源(关闭此文件输出流并释放与此流相关的任何资源)
代码如下(示例):
public class FileOutputStreamDeam1 {
public static void main(String[] args) throws IOException {
//创建字节输出流对象
//FileOutputStream(String name) 创建文件输出流以指定的名称写入文件
FileOutputStream fos = new FileOutputStream("D:\\JavaProject\\czxJava\\fos.txt");
/*
完成的三件任务
A.调用系统功能创建了文件
B.创建了字节输出流对象
C.让字节输出流对象指向创建好的文件
*/
//void writr(int b)将指定的字节写入此文件输出流
fos.write(66);
// fos.write(54);
// fos.write(54); 1
//最后都要释放资源
//void close()关闭此文件输出流并释放与此流相关的任何资源
fos.close();
}
}
2.1.2字节流写数据的两个小问题
1.字节流写数据如何实现换行
- List item
- 写完数据后,加换行符
- windows:\r\n
- linux:\n
- mac:\r
2.字节流写数据如何实现追加
- public FileOutputStream(String name,boolean append)
- 创建文件输出流以指定的名称写入文件。如果第二个参数为true,则字节将写入文件的末尾而不是开头
2.2字节流读数据
2.2.1字节流读数据
FileInputStream(String name):通过打开与实际文件的连接来创建一个FileInputStream,该文件以文件系统中的路径名name命名
使用字节输出流写数据的步骤:
- 创建字节输入流对象
- 调用字节输入流对象的读数据方法
- 释放资源
代码如下(示例):
public class FileInputStreamDemo1 {
public static void main(String[] args) {
FileInputStream fis = null;
//加入finally来实现释放资源
try {
fis = new FileInputStream("D:\\JavaProject\\czxJava\\fos.txt");
// //第一次读取数据
// int data = fis.read();
// System.out.println(data);
// System.out.println((char)data);
// //第二次读取数据
// data = fis.read();
// System.out.println(data);
// System.out.println((char)data);
/*
int data = fis.read();
while(data != -1){
System.out.println((char)data);
data = fis.read();
}
*/
int data;
while ((data = fis.read()) != -1){
System.out.print((char) data);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
2.3练习
1.复制文本文件
需求:把"D:\JavaProject\czxJava\fos.txt"复制到当前模块中的"fosCopy.txt".
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyTxt {
public static void main(String[] args) {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("D:\\JavaProject\\czxJava\\fos.txt");
fos = new FileOutputStream("D:\\JavaProject\\czxJava\\fosCopy.txt");
int data;
while ((data = fis.read()) != -1){
fos.write(data);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (fis != null){
try {
fis.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
2.练习2
要求:把文件fos.txt中的内容读取出来在控制台输出
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputStreamDemo1 {
public static void main(String[] args) {
FileInputStream fis = null;
//加入finally来实现释放资源
try {
fis = new FileInputStream("D:\\JavaProject\\czxJava\\fos.txt");
// //第一次读取数据
// int data = fis.read();
// System.out.println(data);
// System.out.println((char)data);
// //第二次读取数据
// data = fis.read();
// System.out.println(data);
// System.out.println((char)data);
/*
int data = fis.read();
while(data != -1){
System.out.println((char)data);
data = fis.read();
}
*/
int data;
while ((data = fis.read()) != -1){
System.out.print((char) data);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
3.复制图片
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyPhoto {
public static void main(String[] args) {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("D:\\图片\\m.jpg");
fos = new FileOutputStream("D:\\JavaProject\\czxJava\\m.jpg");
byte[] bys = new byte[1024];
int len;
while ((len = fis.read(bys)) != -1){
fos.write(bys,0,len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fis.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.4字节缓冲流
2.4.1字节缓冲流
BufferedOutputStream:该类实现缓冲输出流。通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用
BufferedInputStream:将创建一个内部缓冲区数组。当聪流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流重新填充,一次很多字节。
构造方法
-
字节缓冲输出流:BufferedOutputStream(OutputStream out)
-
字节缓冲输入流:BufferedInputStream(InputStream in)
-
为什么构造方法需要的是字节流,而不是具体的文件或路径?
字节缓冲流仅仅提供缓冲区,而真正的读写数据还是要依靠基本的字节流对象进行操作
import java.io.*;
public class BufferStreamDemo {
public static void main(String[] args) throws IOException {
/*
FileOutputStream fos = new FileOutputStream("D:\\JavaProject\\czxJava\\fos.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
//写数据
bos.write("hello,you are so stupid\r\n".getBytes());
bos.write("i'm serious\r\n".getBytes());
bos.close();
*/
FileInputStream fis = new FileInputStream("D:\\JavaProject\\czxJava\\fos.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
// int data;
// while ((data = bis.read()) != -1){
// System.out.print((char)data);
// }
//一次读取一个字节数组
byte[] bys = new byte[1024];
int len;
while((len= bis.read(bys))!=-1){
System.out.println(new String(bys,0,len));
}
System.out.println();
bis.close();
}
}
2.4.2案例:复制视频
import java.io.*;
public class CopyAviDemo {
public static void main(String[] args) throws IOException {
//记录开始时间
long startTime = System.currentTimeMillis();
//复制视频
method4();
//记录结束时间
long endTime = System.currentTimeMillis();
System.out.println("共耗时"+(endTime-startTime)+"毫秒");
}
//基本字节流一次读写一个字节
//共耗时198211毫秒
public static void method1() throws IOException {
FileOutputStream fos = new FileOutputStream("D:\\JavaProject\\czxJava\\m.mp4");
FileInputStream fis = new FileInputStream("D:\\视频\\m.mp4");
int data;
while ((data=fis.read())!=-1){
fos.write(data);
}
fos.close();
fis.close();
}
//基本字节流一次读写一个字节数组
//共耗时188毫秒
public static void method2() throws IOException {
FileOutputStream fos = new FileOutputStream("D:\\JavaProject\\czxJava\\n.avi");
FileInputStream fis = new FileInputStream("D:\\视频\\n.avi");
byte[] bys = new byte[1024];
int len;
while ((len=fis.read(bys))!=-1){
fos.write(bys,0,len);
}
fos.close();
fis.close();
}
//字节缓冲流一次读写一个字节
//共耗时250毫秒
public static void method3() throws IOException {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\JavaProject\\czxJava\\m.mp4"));
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\视频\\m.mp4"));
int data;
while ((data=bis.read())!=-1){
bos.write(data);
}
bos.close();
bis.close();
}
//字节缓冲流一次读写一个字节数组
//共耗时31毫秒
public static void method4() throws IOException {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\JavaProject\\czxJava\\n.avi"));
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\视频\\n.avi"));
byte[] bys = new byte[1024];
int len;
while ((len=bis.read(bys))!=-1){
bos.write(bys,0,len);
}
bos.close();
bis.close();
}
}