IO
1. File类的作用
File类封装了文件或目录,可以实现对文件和目录的获取、创建、删除等功能。
2. File类中常用方法的使用介绍
- createNewFile():创建文件,创建成功返回true。
- exists():File对象表示的文件名或路径是否存在,存在返回true。
- canRead():File对象表示的文件名或路径存在且可读,存在返回true。
- canWrite():File对象表示的文件名或路径存在且可写,存在返回true。
- isFile():File对象是一个文件,返回true。
- isDirectory():File对象表示的是一个目录,返回true。
- isAbsolute():File对象表示的文件是使用绝对路径名创建的,返回true。
- getAbsolutePath():返回File对象表示的文件或目录的绝对路径。
- getName():返回File对象表示的文件或目录的名称。
- getPath():返回File对象表示的文件或目录的完整路径。
- getParent():返回File对象表示的文件或目录的父目录的完整路径。
- lastModified():返回File对象表示的文件或目录的最后一次修改时间。
- length():返回File对象表示的文件或目录的长度。
- listFiles():如果返回File对象表示的是一个目录,则返回该目录下所有的文件和目录。
- delete():删除File对象表示的文件或目录。
- renameTo(File file):重命名。
3. 使用File类操作文件和文件夹
使用上述File类常用方法操作文件和文件夹:
package com.myh.day0718;
import java.io.File;
import java.io.IOException;
public class FileTest {
public static void main(String[] args) {
//对文件进行操作
File file1 = new File("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/text.txt");
try {
System.out.println(file1.createNewFile());
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(file1.canRead());
System.out.println(file1.canWrite());
System.out.println(file1.isFile());
System.out.println(file1.isDirectory());
System.out.println(file1.isAbsolute());
System.out.println(file1.getAbsoluteFile());
System.out.println(file1.getName());
System.out.println(file1.getPath());
System.out.println(file1.getParent());
System.out.println(file1.lastModified());
System.out.println(file1.length());
System.out.println(file1.listFiles());
System.out.println(file1.renameTo(new File("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/text1.txt")));
System.out.println("================================");
//对文件夹进行操作
File file2 = new File("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718");
try {
System.out.println(file1.createNewFile());
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(file2.canRead());
System.out.println(file2.canWrite());
System.out.println(file2.isFile());
System.out.println(file2.isDirectory());
System.out.println(file2.isAbsolute());
System.out.println(file2.getAbsoluteFile());
System.out.println(file2.getName());
System.out.println(file2.getPath());
System.out.println(file2.getParent());
System.out.println(file2.lastModified());
System.out.println(file2.length());
System.out.println(file2.listFiles());
System.out.println(file2.renameTo(new File("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/text1.txt")));
}
}
true
true
true
true
false
true
/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/text.txt
text.txt
/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/text.txt
/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718
1658107574994
0
null
true
================================
true
true
true
false
true
true
/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718
day0718
/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718
/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh
1658107618641
160
[Ljava.io.File;@610455d6
false
使用深度优先搜索对文件夹下的文件进行搜索:
package com.myh.day0718;
import java.io.File;
// 统计src文件夹下.java文件的数量
public class FileFindDemo {
public static int findFile(File file) {
int num = 0;
File[] files = file.listFiles();
for (File file1 : files) {
if(file1.isDirectory()) {
num += findFile(file1);
}
else if(file1.getName().endsWith(".java")) {
num++;
}
}
return num;
}
public static void main(String[] args) {
File file = new File("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src");
System.out.println("src目录下有" + findFile(file) + "个.java文件");
}
}
src目录下有28个.java文件
4. 相对路径和绝对路径的介绍
- 绝对路径:从根目录为起点到某个目录的路径,与当前位置无关
- 相对路径:从当前目录为起点到某个目录的路径,与当前位置有关。
5. IO流的概念和工作原理
流:数据在设备间的传输称为流,是内存与存储设备之间传输数据的通道。
IO流:对于数据的传输,可以看做是一种数据的流动。按照流动的方向,分为输入input和输出output,即输入流和输出流。
6. IO流的分类
IO流按照流动的方向,分为输入流和输出流;按照操作单元划分,分为字节流和字符流。
输入流:将内容读入到内存中。
输出流:将内存中的内容读出。
字节流:操作单位为1个字节。
字符流:操作单位为2个字节的Unicode字符。
7. 文件流的使用
输入流:FileInputStream(字节流)和FileReader(字符流)
输出流:FileOutputStream和FileWriter
由于FileReader和FileInputStream的使用方法类似,FileWriter 和FileOutputStream的使用方法类似,所以下面只用FileInputStream和FileOutputStream举例。
使用文件流实现文件内容的拷贝:
package com.myh.day0718;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamDemo {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/text.txt");
FileOutputStream fos = new FileOutputStream("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/text1.txt");
byte[] bytes = new byte[1024];
int hasRead = 0;
while ((hasRead = fis.read(bytes)) > 0) {
fos.write(bytes, 0, hasRead);
}
// 要记得关闭输入输出流
fis.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
8. 缓冲流的使用
输入流:BufferedInputStream和BufferedReader
输出流:BufferedOutputStream和BufferedWriter
使用缓冲流实现文件的拷贝:
package com.myh.day0718;
import java.io.*;
public class BufferedStreamDemo {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/text.txt");
FileOutputStream fos = new FileOutputStream("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/text1.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
byte[] bytes = new byte[1024];
int hasRead = 0;
while ((hasRead = bis.read(bytes)) > 0) {
bos.write(bytes, 0, hasRead);
}
// 此时只需关闭缓冲流的输入输出,java会自动关闭fis和fos
bis.close();
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
9. 内存流的使用
输入流:ByteArrayInputStream和CharReader
输出流:ByteArrayOutputStream和CharWriter
package com.myh.day0718;
import java.io.*;
public class ByteArrayStreamDemo {
public static void main(String[] args) {
String msg = "Hello, world!";
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write(msg.getBytes());
baos.flush();
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
byte[] bytes = new byte[1024];
int len = bais.read(bytes);
System.out.println(new String(bytes, 0, len));
} catch (IOException e) {
e.printStackTrace();
}
}
}
Hello, world!
10. 使用流实现文件内容的拷贝
见11
11. 分别使用字符流、字节流、NIO读写中文CSV文件
使用字节流读写中文csv文件
package com.myh.day0718.work;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 使用字节流读、写中文csv文件
*/
public class ByteIODemo {
public static void main(String[] args) {
try (
FileInputStream fis = new FileInputStream("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/work/data1.csv");
FileOutputStream fos = new FileOutputStream("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/work/data_byte.csv")
) {
byte[] bytes = new byte[1024];
int hasRead = 0;
while ((hasRead = fis.read(bytes)) > 0) {
fos.write(bytes, 0, hasRead);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用字符流读写中文csv文件
package com.myh.day0718.work;
import java.io.*;
/**
* 使用字符流读写csv文件
*/
public class CharIODemo {
public static void main(String[] args) {
try (
FileReader fis = new FileReader("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/work/data1.csv");
FileWriter fos = new FileWriter("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/work/data_char.csv")
) {
char[] chars = new char[1024];
int hasRead = 0;
while ((hasRead = fis.read(chars)) > 0) {
fos.write(chars, 0, hasRead);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用NIO读写中文csv文件
package com.myh.day0718.work;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/**
* 使用NIO读写文件
*/
public class NIODemo {
public static void main(String[] args) {
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
try (
FileInputStream fis = new FileInputStream("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/work/data1.csv");
FileOutputStream fos = new FileOutputStream("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/work/data_nio.csv");
FileChannel fisChannel = fis.getChannel();
FileChannel fosChannel = fos.getChannel()
) {
int hasRead = 0;
while ((hasRead = fisChannel.read(byteBuffer)) > 0) {
byteBuffer.flip(); //从读模式转换为写模式
fosChannel.write(byteBuffer);
byteBuffer.clear(); //清空并等待下次读入
}
} catch (IOException e) {
e.printStackTrace();
}
}
}