InputStream 、OutputStream、FileOutputStream、FileInputStream
一、InputStream 、OutputStream
InputStream 、OutputStream是字节流的抽象基类,派生出来的子类名称都是以其父类名作为子类名的后缀
二、FileOutputStream
- 构造方法
FileOutputStream(File file)
FileOutputStream(String name) - 写出数据
public void write(int b):写一个字节 超过一个字节 砍掉前面的字节
public void write(byte[] b):写一个字节数组
public void write(byte[] b,int off,int len):写一个字节数组的一部分
import java.io.FileOutputStream;
import java.io.IOException;
public class Test1 {
public static void main(String[] args) throws IOException {
FileOutputStream outputStream = new FileOutputStream("e:\\test.txt");
outputStream.write(97);
outputStream.write(new byte[]{98,99});
byte[] bytes = {100, 101, 102, 103};
outputStream.write(bytes,0,3);
outputStream.close();
}
}
//文件写入abcdef
- FileOutputStream写出数据实现换行
- windows下的换行符只用是 \r\n
- Linux \n
- Mac \r
import javax.crypto.Mac;
import java.io.FileOutputStream;
import java.io.IOException;
public class MyTest4 {
public static void main(String[] args) throws IOException {
FileOutputStream out = new FileOutputStream("b.txt");
out.write("池塘边的榕树上知了在声声的叫着夏天".getBytes());
out.write("\r\n".getBytes());//写入一个换行符
out.write("黑板上老师的粉笔还在叽叽喳喳写个不停".getBytes());
out.write("\r\n".getBytes());//写入一个换行符
out.write("等待着下课,等待着放学,等待游戏的童年".getBytes());
out.write("\r\n".getBytes());//写入一个换行符
//释放资源
out.close();
}
}
- FileOutputStream写出数据实现追加写入
- FileOutputStream(File file, boolean append) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流
- FileOutputStream(String name, boolean append) 创建一个向具有指定 name 的文件中写入数据的输出文件流。
import java.io.FileOutputStream;
import java.io.IOException;
public class MyTest5 {
public static void main(String[] args) throws IOException {
//参数2:代表是否追加写入,true 追加写入 false 不追加
FileOutputStream out = new FileOutputStream("c.txt",true);
out.write("池塘边的榕树上知了在声声的叫着夏天".getBytes());
out.write("\r\n".getBytes());//写入一个换行符
out.write("黑板上老师的粉笔还在叽叽喳喳写个不停".getBytes());
out.write("\r\n".getBytes());//写入一个换行符
out.write("等待着下课,等待着放学,等待游戏的童年".getBytes());
out.write("\r\n".getBytes());//写入一个换行符
//释放资源
out.close();
}
}
三、FileInputStream
- 构造方法
- FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
- FileInputStream(String name) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。
- 读入数据
- public int read() 从此字节输入流中读取一个字节
- public int read(byte[] bytes) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中
- public int read(byte[] bytes, int off, int len) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中,从off开始,最多读len个
import java.io.FileInputStream;
import java.io.IOException;
public class MyTest3 {
public static void main(String[] args) throws IOException {
FileInputStream in = new FileInputStream("e.txt");
byte[] bytes = new byte[1024];
int len = in.read(bytes, 0, 4);//一次从文件中读取一部分字节,放到容器中 从0开始读取四个
System.out.println(len);
String s = new String(bytes, 0, len);
System.out.println(s);
in.close();
}
}
- 字节输入流与字节输出流实现复制文件
import java.io.*;
public class CopyDemo {
public static void main(String[] args) throws IOException {
File file = new File("e:\\JavaTest");
File file1 = new File("e:\\JavaTest1");
copyFloder(file,file1);
}
private static void copyFloder(File srcFile,File targetFile) throws IOException {
File[] files = srcFile.listFiles();
for (File file : files) {
if(file.isFile()){
if(!targetFile.exists()){
targetFile.mkdir();
}
copyFile(file, targetFile);
}else {
copyFloder(file,new File(targetFile,file.getName()));
}
}
}
private static void copyFile(File srcFile, File targetFile) throws IOException {
FileInputStream in = new FileInputStream(srcFile);
FileOutputStream out = new FileOutputStream(new File(targetFile,srcFile.getName()));
int len = 0;
byte[] bytes = new byte[1024 * 8];
while ((len = in.read(bytes))!=-1){
out.write(bytes,0,len);
out.flush();
}
out.close();
in.close();
}
}
}
四、BufferedOutputStream与BufferedInputStream
- 缓冲思想
字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,这是加入了数组这样的缓冲区效果,java本身在设计的时候,也考虑到了这样的设计思想,所以提供了字节缓冲区流
• BufferedOutputStream(OutputStream out) 需传入一个基本字节输出流
• BufferedInputStream(InputStream in) 需传入一个基本字节输入流