IO是指Input/Output,即输入和输出。以内存为中心:
- Input指从外部读入数据到内存,例如,把文件从磁盘读取到内存,从网络读取数据到内存等等。
- Output指把数据从内存输出到外部,例如,把数据从内存写入到文件,把数据从内存输出到网络等等。
File对象
Java的标准库java.io
提供了File
对象来操作文件和目录
/**
* 常用方法
* exists 判断是否存在
* isFile 判断是不是文件
* isDirectory 判断是否文件夹
* createNewFile 创建文件
* mkdir 创建文件夹,mkdirs递归创建
* delete 删除文件
* canRead 是否可读
* canWrite 是否可写
* canExecute 是否可执行
* deleteOnExit jvm退出时删除
*/
@Test
public void demo1(){
//file对象可以传入目录,或者文件路径
File file = new File("D:\\test\\aa");
//遍历下面所有一级目录的文件
for(File f : file.listFiles()){
System.out.println(f.getName());
}
}
InputStream
InputStream是一个抽象类,是所有输入流的超类,具体实现由子类实现。
FileInputStream,从文件中读取输入流
@Test
public void demo2(){
InputStream inputStream = null;
try {
inputStream = new FileInputStream("D:\\test\\hello.txt");
//定义一个byte[]数组缓冲区,inputStream.read()方法读取字节到缓冲区
byte[] buffer = new byte[1024];
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()){
//read方法返回-1,读取完成
while (inputStream.read(buffer) != -1) {
outputStream.write(buffer);
}
System.out.println(outputStream.toString("GBK"));
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if(inputStream != null){
try {
inputStream.close(); // 关闭流,释放底层资源
} catch (IOException ignored) {
}
}
}
}
OutputStream
OutputStream是一个抽象类,是所有输出流的超类,具体实现由子类实现。
FileOutputStream文件输出流
/**
* 文件输出
*/
@Test
public void demo3(){
InputStream inputStream = null;
try {
inputStream = new FileInputStream("D:\\test\\hello.txt");
//定义一个byte[]数组缓冲区,inputStream.read()方法读取字节到缓冲区
byte[] buffer = new byte[1024];
try (OutputStream outputStream = new FileOutputStream("D:\\test\\hello-cp.txt")){
//read方法返回-1,读取完成
while (inputStream.read(buffer) != -1) {
outputStream.write(buffer);
}
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if(inputStream != null){
try {
inputStream.close(); // 关闭流,释放底层资源
} catch (IOException ignored) {
}
}
}
}
/**
* 字符串输出
*/
@Test
public void demo4(){
String str = "输出字符串\r\n" +
"字符串输出字\r\n";
try (OutputStream outputStream = new FileOutputStream("D:\\test\\out.txt")){
outputStream.write(str.getBytes());
outputStream.flush();
}catch (IOException e){
e.printStackTrace();
}
}
操作ZIP
/**
* 读取zip内容
*/
@Test
public void demo5(){
try(ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream("D:\\test\\ziptest.zip"))){
//ZipEntry表示一个压缩文件或目录
ZipEntry zipEntry = null;
while ((zipEntry = zipInputStream.getNextEntry()) != null){
String name = zipEntry.getName();
if(!zipEntry.isDirectory()){
System.out.println("文件名称:" + name);
InputStream inputStream = new ZipFile("D:\\test\\ziptest.zip").getInputStream(zipEntry);
//输出文件内容
printString(inputStream);
}else {
System.out.println("目录:" + name);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 压缩zip
* @throws Exception
*/
@Test
public void demo6() throws Exception{
ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream("D:\\test\\test.zip"));
File[] files = new File("D:\\test\\压缩测试文件目录").listFiles();//读取本地目录下的所有文件
for(File f: files){
//多一级目录mk
zipOutputStream.putNextEntry(new ZipEntry("mk\\"+ f.getName()));
InputStream in = new FileInputStream(f);
byte[] bytes = new byte[100];
while (in.read(bytes) != -1){
zipOutputStream.write(bytes);
}
zipOutputStream.closeEntry();
}
zipOutputStream.close();
}
private void printString(InputStream inputStream) {
try {
//定义一个byte[]数组缓冲区,inputStream.read()方法读取字节到缓冲区
byte[] buffer = new byte[1024];
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
//read方法返回-1,读取完成
while (inputStream.read(buffer) != -1) {
outputStream.write(buffer);
}
System.out.println(outputStream.toString("GBK"));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close(); // 关闭流,释放底层资源
} catch (IOException ignored) {
}
}
}
}
Reader
Reader跟InputStream的区别是,
InputStream是一个字节流,即以
byte为单位读取,而
Reader是一个字符流,即以
char为单位读取。
FileReader是Reader的子类,用于对文件的读取
/**
* 读取文件内容
* @throws Exception
*/
@Test
public void demo7() throws Exception{
//可以用InputStream构建
//Reader reader = new InputStreamReader(new FileInputStream("D:\\test\\out.txt"));
Reader reader = new FileReader("D:\\test\\out.txt");
char[] buffer = new char[100];
while (reader.read(buffer) != - 1){
//每次读取输出
System.out.println(new String(buffer));
}
reader.close();
}
Writer
Writer跟OutputStream的区别是,OutputStream是以字节(byte)为单位,Writer以字符(char)为单位。
@Test
public void demo8() throws Exception{
//用OutputStream构建
//Writer writer = new OutputStreamWriter(new FileOutputStream("D:\\test\\out.txt"));
Writer writer = new FileWriter("D:\\test\\out.txt");
writer.write("写入字符串123");
writer.flush();
writer.close();
}
PrintStream
PrintStream
是一种FilterOutputStream
,它在OutputStream
的接口上,额外提供了一些写入各种数据类型的方法
@Test
public void demo9() throws Exception{
PrintStream printStream = new PrintStream("D:\\test\\out.txt");
//输出string字符串到文件中
printStream.println("输出到文件里一个什么");
printStream.flush();
printStream.close();
}
Files
从Java 7开始,提供了Files
和Paths
这两个工具类,封装了很多读写文件的简单方法,极大地方便我们读写文件。
@Test
public void demo10() throws Exception{
//把文件内容全部读成byte数组
byte[] bytes = Files.readAllBytes(Paths.get("D:\\test\\out.txt"));
System.out.println(new String(bytes));
//文本文件按行返回内容
List<String> list = Files.readAllLines(Paths.get("D:\\test\\out.txt"));
list.forEach(System.out::println);
//写入操作byte数组
Files.write(Paths.get("D:\\test\\out.txt"),"写入".getBytes());
//复制文件
Files.copy(Paths.get("D:\\test\\out.txt"),new FileOutputStream("D:\\test\\out-cp.txt"));
//文件移动
Files.move(Paths.get("D:\\test\\out.txt"),Paths.get("D:\\test\\cp\\o.txt") ,StandardCopyOption.ATOMIC_MOVE);
}