字节流
先上图片:
InputStream
然后常用FileInputStream来实例化对象
看看这个字节输入流的体系
OutputStream(和InputStream一样,就是input换成Output)
用字节流实现一段文字复制粘贴到文件中
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestFileInputStream {
public static void main(String[] args) throws IOException {
//创建源字符串以及接收的文件,参数位路径
String info = "hello";
File fileDest = new File("D:\\dest.txt");
//创建输出流,参数为文件也可以是文件的路径直接用字符串表示。
FileOutputStream fos = new FileOutputStream(fileDest);
//获取当前时间
long start = System.currentTimeMillis();
byte [] b = info.getBytes(); //用字节的方式保存源字符串,,因为下面要用write(byte [] b)
for( int i = 0; i < info.length(); i++ ) {
fos.write(b[i]); //一次读一个字节
}
//获取当前时间
long end = System.currentTimeMillis();
//输出看看
System.out.println("一起用时:" + (end - start) +"毫秒,已完成。");
}
}
用字节流来完成文件的复制粘贴
方法一
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestFileInputStream {
public static void main(String[] args) throws IOException { //方法一这个是将所有异常抛出
//创建源文件以及接收的文件,参数位路径
File fileSrc = new File("D:\\src.txt");
File fileDest = new File("D:\\dest.txt");
//创建输入输出流,参数为文件也可以是文件的路径直接用字符串表示。
FileInputStream fis = new FileInputStream(fileSrc); //先抛出异常
FileOutputStream fos = new FileOutputStream(fileDest);
//获取当前时间
long start = System.currentTimeMillis();
//输入流用read方法,读取一个字节到n里面,当n为-1时就读到了末尾
int n = fis.read();
while(n != -1) {
//输出流用write方法来写入文件
fos.write(n);
//读一个字节
n = fis.read();
}
//获取当前时间
long end = System.currentTimeMillis();
//输出看看
System.out.println("一起用时:" + (end - start) +"毫秒,已完成。");
}
}
方法二
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestFileInputStream {
public static void main(String[] args) throws IOException {
//创建源文件以及接收的文件,参数位路径
File fileSrc = new File("D:\\src.txt");
File fileDest = new File("D:\\dest.txt");
//创建输入输出流,参数为文件也可以是文件的路径直接用字符串表示。
FileInputStream fis = new FileInputStream(fileSrc); //先抛出异常
FileOutputStream fos = new FileOutputStream(fileDest);
//获取当前时间
long start = System.currentTimeMillis();
//输入流用read方法,每次读取1024字节到byte数组里面,当n为-1时就读到了末尾
byte [] b = new byte [1024];
int n = fis.read(b);
while(n != -1) {
//输出流用write方法来写入文件
fos.write(b);
//读一个字节
n = fis.read(b);
}
//获取当前时间
long end = System.currentTimeMillis();
//输出看看
System.out.println("一起用时:" + (end - start) +"毫秒,已完成。");
}
}
方法三
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestFileInputStream {
public static void main(String[] args) throws IOException {
//创建源文件以及接收的文件,参数位路径
File fileSrc = new File("D:\\src.txt");
File fileDest = new File("D:\\dest.txt");
//创建输出流,参数为文件也可以是文件的路径直接用字符串表示。
FileInputStream fis = new FileInputStream(fileSrc);
FileOutputStream fos = new FileOutputStream(fileDest);
//获取当前时间
long start = System.currentTimeMillis();
byte [] b = new byte [1024]; //每次读1024个字节,速度更快
int n = fis.read(b);
while( n != -1) {
fos.write(b, 0, b.length); //三个参数分别是写入数组名,写的起始偏移量,0也就是从第一个下标开始读,第三个参数读到哪里终止
n = fis.read(b);
}
//获取当前时间
long end = System.currentTimeMillis();
//输出看看
System.out.println("一起用时:" + (end - start) +"毫秒,已完成。");
}
}
字符流
Reader和Writer这两个是java中最基本的字符输入输出流。
看下原码
Reader的结构,常用FileReader这个子类来实例化对象。
Writer和Reader类似,直接上结构。
用基本字节流来实现文本的复制粘贴
错误示例如下
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class TestReader {
public static void main(String[] args) throws IOException {
//创建源文件以及接收的文件,参数位路径
File fileSrc = new File("D:\\src.txt");
File fileDest = new File("D:\\dest.txt");
//创建输出流,参数为文件也可以是文件的路径直接用字符串表示。
FileReader reader = new FileReader(fileSrc);
FileWriter writer = new FileWriter(fileDest);
//获取当前时间
long start = System.currentTimeMillis();
char [] b = new char [1024];
int n = reader.read(b);
while( n != -1) {
writer.write(b, 0, b.length);
n = reader.read(b);
}
//获取当前时间
long end = System.currentTimeMillis();
//输出看看
System.out.println("一起用时:" + (end - start) +"毫秒,已完成。");
}
}
方法1
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class TestReader {
public static void main(String[] args) throws IOException {
//创建源文件以及接收的文件,参数位路径
File fileSrc = new File("D:\\src.txt");
File fileDest = new File("D:\\dest.txt");
//创建输出流,参数为文件也可以是文件的路径直接用字符串表示。
FileReader reader = new FileReader(fileSrc);
FileWriter writer = new FileWriter(fileDest);
//获取当前时间
long start = System.currentTimeMillis();
char [] b = new char [1024];
int n = reader.read(b);
while( n != -1) {
writer.write(b, 0, b.length);
writer.flush(); //输出流要手动刷新,不然写不进去的。
n = reader.read(b);
}
//获取当前时间
long end = System.currentTimeMillis();
//输出看看
System.out.println("一起用时:" + (end - start) +"毫秒,已完成。");
}
}
方法2
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class TestReader {
public static void main(String[] args) throws IOException {
//创建源文件以及接收的文件,参数位路径
File fileSrc = new File("D:\\src.txt");
File fileDest = new File("D:\\dest.txt");
//创建输出流,参数为文件也可以是文件的路径直接用字符串表示。
FileReader reader = new FileReader(fileSrc);
FileWriter writer = new FileWriter(fileDest);
//获取当前时间
long start = System.currentTimeMillis();
char [] b = new char [1024];
int n = reader.read(b);
while( n != -1) {
writer.write(b, 0, b.length);
writer.flush(); //输出流要手动刷新,不然写不进去的。
n = reader.read(b);
}
//获取当前时间
long end = System.currentTimeMillis();
//输出看看
System.out.println("一起用时:" + (end - start) +"毫秒,已完成。");
writer.close();
reader.close();
}
}
字节流和字符流的不同点以及相同点
相同点
- 都是底层的流,十分重要,包装流(也叫处理流依赖于底层流)。
不同点
- 字节流可以处理二进制文件,像音乐,图片,视频等文件,而字符流有局限只能处理文本。
- 同等条件下,字节流速度比字符流慢。
所以是传输文本,就首选字符流。其他情况只用字节流