java成神之——文件IO
2021-05-15 18:30
标签:自定义 反序 resolve env jar ams ade regex streams java成神之——文件IO 标签:自定义 反序 resolve env jar ams ade regex streams 原文地址:https://www.cnblogs.com/ye-hcj/p/9750328.html
文件I/O
Path
resolve 拼接路径
normalize 格式化
getFileName 获取文件名
getNameCount 获取路径段个数
getName(0) 获取指定路径段的名称
getParent 获取父级目录
Path path = Paths.get("C:\\Users\\26401\\Desktop\\");
Path path1 = Paths.get("demo.txt");
path.resolve(path1).normalize().toString(); // "file:///C:/Users/26401/Desktop/demo.txt"
Files
Path path = Paths.get("C:\\Users\\26401\\Desktop\\demo.txt");
Files.exists(path);
Files.notExists(path);
Files.isDirectory(path); // 是否是目录
Files.isRegularFile(path); // 是否是文件
Files.isReadable(path); // 是否可读
Files.isWritable(path); // 是否可写
Files.isExecutable(path); // 是否可执行
Files.isHidden(path); // 是否可隐藏
Files.probeContentType(path);// 获取MIME类型
Files.readAllLines(path, StandardCharsets.UTF_8); // 读取所有行
List
File类
String separator = File.pathSeparator; // 文件路径分隔符
String separator = File.separator; // 文件名分隔符
File file = new File("C:\\Users\\26401\\Desktop\\java");
File file = new File("C:\\Users\\26401\\Desktop\\java", "demo.txt");
File fileFather = new File("C:\\Users\\26401\\Desktop\\java");
File file = new File(fileFather, "demo.txt");
try {
boolean b = file.createNewFile(); // 创建文件
boolean b = file.mkdir(); // 创建文件夹
boolean b = file.mkdirs(); // 创建多级文件夹
boolean b = file.delete(); // 删除文件或者文件夹
String s = file.getName(); // 获取文件或者文件夹名
String s = file.getPath(); // 获取文件或者文件夹路径
long s = file.length(); // 获取文件大小
String s = file.getAbsolutePath(); // 获取文件或者文件夹绝对路径
File s = file.getAbsoluteFile(); // 获取文件或者文件夹绝对路径
File s = file.getParentFile(); // 获取文件或者文件夹父路径
boolean b = file.exists(); // 判断文件或者文件夹是否存在
boolean b = file.isDirectory(); // 判断文件夹是否存在
boolean b = file.isFile(); // 判断文件是否存在
String[] arr = file.list(); // 获取文件夹下的文件名和文件夹名
File[] arr = file.listFiles(); // 获取文件夹下的文件和文件夹
} catch (Exception e) {
e.printStackTrace();
}
File和Path的区别和联系
文件路径操作
path:
Path path = new File("demo.txt").toPath();
file:
File file = Paths.get("demo.txt").toFile();
删除文件
file:
file.delete();
path:
Files.deleteIfExists(path);
写数据
file:
FileOutputStream outputStream = new FileOutputStream(file);
outputStream.write("写入数据".getBytes(StandardCharsets.UTF_8));
path:
OutputStream outputStream = Files.newOutputStream(path, StandardOpenOption.WRITE);
outputStream.write("写入数据".getBytes(StandardCharsets.UTF_8));
遍历目录
file:
for (File selectedFile : folder.listFiles()) {
System.out.println((selectedFile.isDirectory() ? "d" : "f") + " " + selectedFile.getAbsolutePath());
}
或者
DirectoryStream
FileFilter
过滤文件
class myFilter implements FileFilter {
public boolean accept(File pathname) {
String name = pathname.getName();
return name.endsWith(".txt");
}
}
File fileFather = new File("C:\\Users\\26401\\Desktop\\java");
File file = new File(fileFather, "demo");
try {
File[] arr = file.listFiles(new myFilter());
for (File file2 : arr) {
System.out.println(file2);
}
} catch (Exception e) {
e.printStackTrace();
}
FileOutputStream
写入数据
FileOutputStream f = null;
try {
f = new FileOutputStream("C:\\Users\\26401\\Desktop\\java\\demo\\demo.txt"); // 创建并覆盖文件
f = new FileOutputStream("C:\\Users\\26401\\Desktop\\java\\demo\\demo.txt", true); // 续写文件流
f.write(100); // 写一个字节
byte[] bs = {49, 48, 48};
f.write(bs); // 写字节数组
f.write("abc".getBytes()); // 写字节数组
f.write("a\r\nb\r\nc".getBytes()); // \r\n换行
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(f != null) f.close();
} catch (IOException e) {
e.printStackTrace();
}
}
FileInputStream
读取数据
一个一个字节读
try(FileInputStream f = new FileInputStream("C:\\Users\\26401\\Desktop\\java\\demo\\demo.txt")) {
int i;
while((i = f.read()) != -1) {
System.out.println((char)i);
}
}
利用字节数组缓冲区读
try(FileInputStream f = new FileInputStream("C:\\Users\\26401\\Desktop\\java\\demo\\demo.txt")) {
int len;
byte[] b = new byte[1024];
while((len = f.read(b)) != -1) {
System.out.println(new String(b, 0, len));
}
}
利用FileOutputStream和FileInputStream复制文件
try(
FileInputStream fi = new FileInputStream("C:\\Users\\26401\\Desktop\\java\\demo\\demo.txt");
FileOutputStream fo = new FileOutputStream("C:\\Users\\26401\\Desktop\\java\\demo\\demo1.txt")
) {
int len;
byte[] b = new byte[1024];
while((len = fi.read(b)) != -1) {
fo.write(b, 0, len);
}
}
FileWriter
try(FileWriter fo = new FileWriter("C:\\Users\\26401\\Desktop\\java\\demo\\demo1.txt")){
byte[] b = {‘a‘, ‘b‘, ‘c‘};
fo.write(new String(b, 0, 2, "UTF-8"));
}
FileReader
try(FileReader fo = new FileReader("C:\\Users\\26401\\Desktop\\java\\demo\\demo1.txt")){
char[] b = new char[1];
while((fo.read(b)) != -1) {
System.out.println(new String(b));
}
}
BufferedWriter
Path path = Paths.get("C:\\Users\\26401\\Desktop\\demo.txt");
String str = "写入一行数据";
try (BufferedWriter bw = Files.newBufferedWriter(path)) {
bw.write(str);
bw.newLine();
bw.write(str);
bw.flush();
}
或者是BufferedWriter bw = new BufferedWriter(new FileWriter("path"));
BufferedReader
基本用法
try (BufferedReader br = Files.newBufferedReader(path)) {
char[] b = new char[20];
while((br.read(b)) != -1) {
System.out.println(new String(b));
}
}
或者是BufferedReader br = new BufferedReader(new FileReader("path"));
BufferedReader 用来读字符,可以一次读一行
用法一
int ch;
while ((ch = br.read()) != -1) {
...
}
用法二
String line = null;
while ((line = reader.readLine) != null) {
...
}
用法三
按行生成集合
br.lines().collect(Collectors.toList());
StringWriter
StringWriter writer = new StringWriter();
char[] ary = new char[1024];
BufferedReader buffer = new BufferedReader(new InputStreamReader(new FileInputStream("...");, "UTF-8"));
int x;
while ((x = buffer.read(ary)) != -1) {
writer.write(ary, 0, x);
}
writer.toString();
InputStreams转换成字符串
StringWriter writer = new StringWriter();
char[] buffer = new char[1024];
try (Reader reader = new BufferedReader(new InputStreamReader(new FileInputStream("C:\\Users\\26401\\Desktop\\demo.txt"), "UTF-8"))) {
int n;
while ((n = reader.read(buffer)) != -1) {
writer.write(buffer, 0, n);
}
}
writer.toString();
BufferedInputStream
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("..."))) {
byte data;
while ((data = (byte) bis.read()) != -1) {
System.out.println((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
ObjectOutputStream
序列化对象
class Demo implements Serializable {
String Name;
int Age;
static transient String Sex; // transient禁止实例序列化,static是类属性,实例无法序列化
static final long serialVersionUID = 1243543523L; // 自定义类唯一序列号标识
public void fn() {
System.out.println(this.Name + "|" + this.Age + "|" + this.Sex);
}
public Demo(String Name, int Age, String Sex) {
this.Name = Name;
this.Age = Age;
this.Sex = Sex;
}
}
try(
FileOutputStream fo = new FileOutputStream("C:\\Users\\26401\\Desktop\\java\\demo.txt");
ObjectOutputStream foo = new ObjectOutputStream(fo);
){
Demo d = new Demo("叶家伟", 18, "女");
foo.writeObject(d);
}
ObjectInputStream
反序列化对象
try(
FileInputStream fi = new FileInputStream("C:\\Users\\26401\\Desktop\\java\\demo.txt");
ObjectInputStream fii = new ObjectInputStream(fi)
){
Demo d = (Demo)fii.readObject();
System.out.println(d.Age);
}
PrintWriter
用法一:
try(
PrintWriter pw = new PrintWriter("C:\\Users\\26401\\Desktop\\java\\demo.txt")
){
pw.println("affsddfq");
pw.flush();
}
用法二:
try(
FileOutputStream fo = new FileOutputStream("C:\\Users\\26401\\Desktop\\java\\demo.txt");
PrintWriter pw = new PrintWriter(fo)
){
pw.println("wrqr3");
pw.flush();
}
用法三:
try(
FileOutputStream fo = new FileOutputStream("C:\\Users\\26401\\Desktop\\java\\demo.txt");
PrintWriter pw = new PrintWriter(fo, true); // 第二个参数,表示自动刷新,也就是可以省略flush语句
){
pw.println("wrqr3");
}
利用PrintWriter复制文件
try(
BufferedReader fo = new BufferedReader(new FileReader("C:\\Users\\26401\\Desktop\\java\\demo.txt"));
PrintWriter pw = new PrintWriter(new FileWriter("C:\\Users\\26401\\Desktop\\java\\demo1.txt"), true)
){
String line = null;
while((line = fo.readLine()) != null) {
pw.println(line);
}
}
PrintStream
写数据
try(PrintStream ps = new PrintStream(filepath)){
ps.println("...");
ps.println();
ps.println("I love Java!");
ps.printf("Today is: %1$tm/%1$td/%1$tY", LocalDate.now());
ps.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Channel
配合Buffer读文件
FileInputStream fis = new FileInputStream("C:\\Users\\26401\\Desktop\\demo.txt");
FileChannel fileChannel = fis.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
while (fileChannel.read(buffer) > 0) {
buffer.flip(); // 重置指针位置
while (buffer.hasRemaining()) {
byte b = buffer.get();
System.out.print((char) b);
}
buffer.clear();
}
fileChannel.close();
写文件
FileOutputStream fos = new FileOutputStream(outputFile);
FileChannel fileChannel = fos.getChannel();
ByteBuffer buffer = ByteBuffer.wrap(text.getBytes());
fileChannel.write(buffer);
利用Channel复制文件
File sourceFile = new File("C:\\Users\\26401\\Desktop\\demo.txt");
File destFile = new File("C:\\Users\\26401\\Desktop\\demo1.txt");
if (!sourceFile.exists() || !destFile.exists()) {
System.out.println("Source or destination file doesn‘t exist");
}
try (
FileChannel sourceChannel = new FileInputStream(sourceFile).getChannel();
FileChannel destChanel = new FileOutputStream(destFile).getChannel()
) {
sourceChannel.transferTo(0, sourceChannel.size(), destChanel);
}
System.out和System.err流重定向
System.setOut(new PrintStream(new FileOutputStream(new File("C:\\Users\\26401\\Desktop\\demo.txt"))));
System.setErr(new PrintStream(new FileOutputStream(new File("C:\\Users\\26401\\Desktop\\demo1.txt"))));
System.out.println("输出数据1");
System.out.println("输出数据2");
System.err.println("错误数据1");
System.err.println("错误数据2");
访问zip文件
读
Path pathToZip = Paths.get("file.zip");
try(FileSystem zipFs = FileSystems.newFileSystem(pathToZip, null)) {
Path root = zipFs.getPath("/");
...
} catch(IOException ex) {
ex.printStackTrace();
}
创建
Map
结语
本文章是java成神的系列文章之一
如果你想知道,但是本文没有的,请下方留言
我会第一时间总结出来并发布填充到本文