今天学了三个小时把,FPX比赛赢了,美滋滋,明天下午要去五个小时的图书馆,加油OVO
Day25
今日小知识
Method copyFile should have no parameters。调用的方法不可以放在上面加@Test
IO流
分类:
1.数据单位不同:字节流(8 bit),字符流(18 bit),非文本的数据用字节流。
2.流向不同: 输入流,输出流
3.流的角色不同: 节点流,处理流。
IO流体系
抽象基类: 节点流(文件流) 缓冲流(处理流的一种)
字节输入流结尾-----InputStream FileInputStream BufferedInputStream
字节输出流结尾-----OutputStream FileOutputStram BufferedOutputStream
字符输入流结尾-----Reader FileReader BufferedReader
字符输出流结尾-----Writer FileWriter BufferedWriter
FileReader
package com.sorrymaker.IO;
import org.junit.Test;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
/**
* @author 喜
* 1.read()理解。返回读入的一个字符,如果达到文件末尾,返回-1
* 2.异常的处理:为了保证流资源一定可以执行关闭操作,需要使用try/catch/finally来处理
* 3.要读入的文件一定要存在,否则就会报FileNotFoundException。
*
*/
public class FileReadWriterTest {
@Test
public void test() {
FileReader fr = null;
try {
//1.实例化File类的对象,指明要操作的文件
//相较于当前的Module下
File file =new File("src/com/sorrymaker/IO/hello.txt");
//2.提供具体的流,使用字符流
fr = new FileReader(file);
//3.数据的读入
//read()返回读入的一个字符,如果达到文件末尾,返回-1
//方式一:
// int data = fr.read();
// while (data !=-1){
// System.out.println((char) data);
// data =fr.read();
// }
//方式二:
int data;
while((data =fr.read())!=-1){
System.out.println((char) data);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.流的关闭。
try {
if(fr!=null) {
fr.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//对read()操作升级,使用read()重载方法,
@Test
public void testFileReader1() {
FileReader fr = null;
try {
//1.File类的实例化
File file =new File("src/com/sorrymaker/IO/hello.txt");
//2.FileReader流的实例化
fr = new FileReader(file);
//3.读入操作。
//read(char[] cbuf):返回每次读入cbuf数组中的字符的个数,如果达到文件末尾,返回-1
char[] cbuf =new char[5];
int len;
while ((len = fr.read(cbuf)) != -1) {
//这里for循环不能是i<cbuf.length。
//因为会出现bug,当取到文件末尾时,长度不足数组长度,就会把长度差值所剩下的字符输出出来,重复输出部分数字。
// 错误的写法。
// for (int i = 0; i < cbuf.length; i++) {
// System.out.print(cbuf[i]);
// }
//方式一:正确的写法。使用len,每次读进去多少个数字,就遍历多少个数字。
// for (int i = 0; i < len; i++) {
// System.out.print(cbuf[i]);
// }
//方式二:
//错误的写法,跟上面那个错的一样。
// String str =new String(cbuf);
// System.out.println(str);
//正确的写法,从0开始,每次取len个。
String str =new String(cbuf,0,len);
System.out.print(str);
}
//4.流资源的关闭。
} catch (IOException e) {
e.printStackTrace();
} finally {
if(fr !=null) {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
FileInputOutputStreamTest
package com.sorrymaker.IO;
import org.junit.Test;
import java.io.*;
/** 1.对于文本文件(.txt,java,c,cpp),使用字符流处理
* 2.对于非文本文件(.jpg,mp3,mp4,avi,doc,ppt),使用字节流处理
*测试FileInputStream 和FileOutputStream
*/
public class FileInputOutputStreamTest {
//使用字节流来处理,可能会出现bug
@Test
public void FileInputStreamTest() {
FileInputStream fis = null;
try {
//1,造文件
File file =new File("src/com/sorrymaker/IO/hello.txt");
//2.造流
fis = new FileInputStream(file);
//3.读数据
byte[] buffer =new byte[5];
int len;
while((len = fis.read(buffer))!=-1){
String str =new String(buffer,0,len);
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.关闭资源
if (fis!=null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//实现图片的复制操作
@Test
public void FileInputStreamTest1() {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
File file1 =new File("src/com/sorrymaker/IO/01.png");
File file2 =new File("src/com/sorrymaker/IO/02.png");
fis = new FileInputStream(file1);
fos = new FileOutputStream(file2);
byte[] buffer =new byte[5];
int len;
while((len=fis.read(buffer))!=-1){
fos.write(buffer,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis!=null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos!=null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//指定路径下文件的复制。
public void copyFile(String srcPath,String destPath){
FileInputStream fis = null;
FileOutputStream fos = null;
try {
File file1 =new File(srcPath);
File file2 =new File(destPath);
fis = new FileInputStream(file1);
fos = new FileOutputStream(file2);
byte[] buffer =new byte[1024];
int len;
while((len=fis.read(buffer))!=-1){
fos.write(buffer,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis!=null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos!=null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@Test
public void testCopyFile(){
long start = System.currentTimeMillis();
String srcPath="D:\\Desktop\\MarkDown\\day01.md";
String destPath="D:\\Desktop\\MarkDown\\day0000.md";
copyFile(srcPath,destPath);
long end = System.currentTimeMillis();
System.out.println("复制操作需要"+(end-start)+"s");
}
}