一、File
Linux 中操作/home/fleming/project 时,
java 程序编写时要正常使用斜杠
Windows 中操作文件目录 G:\桌面源\study\src\com\google\study\throwable 时,
java 程序中应使用双反斜杠,因为第一个反斜杠会被当作转义字符
package com.google.study.file;
import org.junit.Test;
import java.io.File;
import java.sql.SQLOutput;
public class FileTest {
@Test
public void fileTest(){
File dir = new File("G:\\桌面源\\study\\src\\com\\google\\study\\throwable");
// 得到文件所处的父目录
System.out.println(dir.getParent());
// G:\桌面源\study\src\com\google\study
// 查看是否为文件
System.out.println(dir.isFile());
// false
// 查看文件是否存在
System.out.println(dir.exists());
// true
// 获取文件大小,以字节进行计算
System.out.println(dir.length());
// 4096
// 获取文件名称
System.out.println(dir.getName());
// throwable
// 遍历返回文件夹下面的文件名
String[] list = dir.list();
for (String name:
list) {
System.out.println(name);
}
/* ErrorCode.java
ExcepTest.java
Exception.java
FlemingCodeEnum.java
FlemingException.java
FlemingExceptionTest.java
*/
}
}
二、I/O Stream
Stream | 流动 | |
---|---|---|
I | input | 输入 |
O | output | 输出 |
I/O 流是指一个过程
I/O 流是一个相对的过程
- input stream to read data
- output stream to write data
三、InputStream 和 OutputStream
(字节流)
InputStream 和 OutputStream 是两个抽象类
它们有两个典型的子类 FileInputStream 和 FileOutputStream
四、FileInputStream
从 1.txt 文件中读取数据,读取出的内容为 byte 类型:
package com.google.study.io;
import com.sun.org.apache.xpath.internal.operations.String;
import org.junit.Test;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.Arrays;
public class IoTest {
@Test
public void inputFile() throws IOException {
FileInputStream fileInputStream = new FileInputStream("file/1.txt");
int by = 0;
while ((by = fileInputStream.read()) != -1) {
//System.out.print(by);
System.out.print((char)by);
}
System.out.println();
fileInputStream.close();
FileInputStream fis = new FileInputStream("file/1.txt");
byte[] buf = new byte[3];
int len = fis.read(buf);
System.out.println(len + "..." + Arrays.toString(buf));
fis.close();
}
}
F:\DevSoftware\Java\jdk8\bin\java.exe...
1001021151001021310971001021001151021310971151001021001021310100971001310102131097100102131013109711510010213109713101151001021151310
/*
dfsdf
adfdsf
asdfdf
dad
f
adf
asdf
a
sdfs
*/
3...[100, 102, 115]
Process finished with exit code 0
五、FileOutputStream
将“fleming”字符串写入 2.txt 文件中:
package com.google.study.io;
import com.sun.org.apache.xpath.internal.operations.String;
import org.junit.Test;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.Arrays;
public class IoTest {
@Test
public void outputFile() throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("file/2.txt");
byte[] bytes = "fleming".getBytes();
for (int i = 0; i < bytes.length; i++) {
fileOutputStream.write(bytes[i]);
}
fileOutputStream.close();
}
}
六、buff 缓冲复制文件
利用缓冲区批量读写:
public void copyFileBase() throws IOException {
FileInputStream fileInputStream = new FileInputStream("file/1.jpg");
FileOutputStream fileOutputStream = new FileOutputStream("file/target.jpg");
// 缓冲区
byte[] buff = new byte[1024];
int by;
while ((by = fileInputStream.read(buff)) != -1) {
fileOutputStream.write(buff, 0, by);
}
fileInputStream.close();
fileOutputStream.close();
}
七、buffered 字节缓冲流和装饰设计模式
装饰设计模式,类似于提升成 vip 服务
FileInputStream 是每次单个字节的进行读入
使用 BufferedInputStream 进行提升可以一次读入多字节
@Test
public void bufferFileBase() throws IOException {
FileInputStream fileInputStream = new FileInputStream("file/1.txt");
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("file/3.txt"));
int by;
while ((by = bufferedInputStream.read()) != -1) {
bufferedOutputStream.write(by);
}
bufferedInputStream.close();
bufferedOutputStream.close();
}
源码中限定缓冲区中一次读入了 8192 个字节:
八、FileReader 和 FileWriter
(字符流)FileReader 和 FileWriter,是用来操作 txt 文件的
FileReader 继承于 InputStreamReader
@Test
public void fileReaderTest() throws IOException {
FileReader fileReader = new FileReader("file/1.txt");
int ch;
while ((ch = fileReader.read()) != -1) {
System.out.println((char)ch);
}
fileReader.close();
}
FileWriter 继承于 OutputStreamReader
@Test
public void fileWriteTest() throws IOException {
FileWriter fileWriter = new FileWriter("file/4.txt");
fileWriter.write("Hello,FileWriter");
fileWriter.close();
}
九、BufferedReader 和 BufferedWriter
java.io.BufferedReader 和 BufferedWriter 类各拥有 8192 字符的缓冲区,会先尽量从文件中读入字符数据并置入缓冲区。而之后若使用 read()方法,会先从缓冲区中进行读取,如果缓冲区数据不足,才会再从文件中读取:
@Test
public void bufferedWriterTest() throws IOException {
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file/5.txt"));
bufferedWriter.write("123");
bufferedWriter.newLine();
bufferedWriter.write("456");
bufferedWriter.close();
}
@Test
public void bufferedReaderTest() throws IOException {
BufferedReader bufferedReader = new BufferedReader(new FileReader("file/5.txt"));
String str;
while ((str = bufferedReader.readLine()) != null) {
System.out.println(str);
}
}
十 、Apache Commons IO
导入 Apache Commons IO 的 jar 包
新建一个 Stuent 类:
package com.google.study.io;
import org.junit.experimental.theories.DataPoint;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "name='" + name + '\'' +
", age=" + age ;
}
}
使用 Apache Comment IO 写文件:
package com.google.study.io;
import org.apache.commons.io.FileUtils;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
public class ApacheIoTest {
@Test
public void writeTest() throws IOException {
File fileB = new File("file/6.txt");
if (!fileB.exists()) {
fileB.createNewFile();
}
ArrayList<Student> arrayList = new ArrayList<>();
arrayList.add(new Student("Fleming", 123));
// 将内容·写入文件B中
FileUtils.writeLines(fileB, arrayList, true);
}
}
十一、Java NIO File
进行文件拷贝、删除等可以还使用 Java NIO Files 类
Java 中实现某个目标时可以通过多种实现方式进行
我们在项目编写时可以有所取舍自行选择各种方法