文件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<String> lines = Arrays.asList("First line", "Second line", "Third line");
Files.write(path, lines); // 一行行写 byte[] data = Files.readAllBytes(path); // 读取所有字节

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<Path> paths = Files.newDirectoryStream(Paths.get("...."));
for (Path path : paths) {
if (Files.isDirectory(path)) {
System.out.println(path.getFileName());
}
} path:
Files.walkFileTree(path, EnumSet.noneOf(FileVisitOption.class), 1, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path selectedPath, BasicFileAttributes attrs) throws IOException {
System.out.println("d " + selectedPath.toAbsolutePath());
return FileVisitResult.CONTINUE;
} @Override
public FileVisitResult visitFile(Path selectedPath, BasicFileAttributes attrs) throws IOException {
System.out.println("f " + selectedPath.toAbsolutePath());
return FileVisitResult.CONTINUE;
}
}); 正则
path:
Path dir = Paths.get(filepath);
PathMatcher imageFileMatcher = FileSystems.getDefault().getPathMatcher("regex:.*(?i:jpg|jpeg|png|gif|bmp|jpe|jfif)");
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, entry -> imageFileMatcher.matches(entry.getFileName()))) {
for (Path path : stream) {
System.out.println(path.getFileName());
}
} 读图片
file:
Image img = ImageIO.read(new File("demo.png"));

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<String, String> env = new HashMap<>();
env.put("create", "true"); //required for creating a new zip file
env.put("encoding", "UTF-8"); //optional: default is UTF-8
URI uri = URI.create("jar:file:/path/to/file.zip");
try (FileSystem zipfs = FileSystems.newFileSystem(uri, env)) {
Path newFile = zipFs.getPath("/newFile.txt");
Files.write(newFile, "Hello world".getBytes());
} catch(IOException ex) {
ex.printStackTrace();
}

结语

本文章是java成神的系列文章之一

如果你想知道,但是本文没有的,请下方留言

我会第一时间总结出来并发布填充到本文

java成神之——文件IO的更多相关文章

  1. java成神之——Stream和Optional

    Stream流 基本使用 流关闭 平行流 流重用 iterator转换成流 分组计数 无限流 流转集合 压缩流 统计数值流 集合转换流遍历 流拼接 reduce 使用流生成随机字符串 流的包装流 几种 ...

  2. java成神之——properties,lambda表达式,序列化

    Properties 加载defaults.properties文件 写Properties到xml文件 读Properties从xml文件 Lambda表达式 自定义 内置 sort方法中使用Lam ...

  3. java成神之——ImmutableClass,null检查,字符编码,defaultLogger,可变参数,JavaScriptEngine,2D图,类单例,克隆,修饰符基本操作

    ImmutableClass null检查 字符编码 default logger 函数可变参数 Nashorn JavaScript engine 执行脚本文件 改变js文件输出流 全局变量 2D图 ...

  4. java成神之——注释修饰符

    注释修饰符 自定义注释 元注释 通过反射在runtime访问注释 内置注释 多注释实例 错误写法 使用容器改写 使用@Repeatable元注释 注释继承 使用反射获取注释 获取类的注释 获取方法的注 ...

  5. java成神之——java常识

    java常识 简单DOS命令 java基础名词 java编译和运行流程 Eclipse常用快捷键 Eclipse相关操作 java基本数据类型 java基本数据类型转换 java常用运算符 java流 ...

  6. 转载_2016,Java成神初年

    原文地址:http://blog.csdn.net/chenssy/article/details/54017826 2016,Java成神初年.. -------------- 时间2016.12. ...

  7. Java成神路上之设计模式系列教程之一

    Java成神路上之设计模式系列教程之一 千锋-Feri 在Java工程师的日常中,是否遇到过如下问题: Java 中什么叫单例设计模式?请用Java 写出线程安全的单例模式? 什么是设计模式?你是否在 ...

  8. java成神之——安全和密码

    安全和密码 加密算法 公钥和私钥加密解密 生成私钥和公钥 加密数据 解密数据 公钥私钥生成的不同算法 密钥签名 生成加密随机数 基本用法 指定算法 加密对象 SealedObject Signatur ...

  9. java成神之——网络编程基本操作

    网络编程 获取ip UDP程序示例 TCP程序 结语 网络编程 获取ip InetAddress id = InetAddress.getLocalHost(); // InetAddress id ...

随机推荐

  1. OpenCV几种边缘检测的简例

    简单记录一下OpenCV的几种边缘检测函数的用法. 边缘检测算法 以Sobel边缘检测算法为例. Sobel卷积核模板为: 偏导公式为: Gx(i,j)=[f(i+1,j−1)+2f(i+1,j)+f ...

  2. QT中给程序加上主界面的图标

    首先在源码目录下面新建一个 myapp.rc的文件,在里面填写如下: IDI_ICON1 ICON DISCARDABLE "myappico.ico" (名字看自己的图片,注意图 ...

  3. poi设置背景色

    headStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);    headStyle.setFillForegroundColor(HSSFCo ...

  4. Javascript+CSS实现影像卷帘效果

    用过Arcgis的筒子们对于Arcmap里面的一个卷帘效果肯定记忆很深刻,想把它搬到自己的WebGIS系统中去,抱着同样的想法,我也对这种比较炫的卷帘效果做了一下研究,吼吼,出来了,给大家汇报一下成果 ...

  5. [置顶] Git 配置SSH简单玩法?

    > 第一步下载git点击直接下载 他会检测您的系统当前是64bit还是32bit安装过程不再啰嗦反正就是Next Next Next Finish 第二步这里你可以下载TortoiseGit点击 ...

  6. SHELL 脚本----常用的命令

    一个很不错的bash脚本编写教程,至少没接触过BASH的也能看懂   建立一个脚本 Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行she ...

  7. PHP 去掉文文文件中的回车与空格

    文本文件fff.txt中去除回车与空格: $aa = file_get_contents('./fff.txt'); $bb = str_replace(array("\r\n", ...

  8. static才是对代码的提升

    static才是对代码的提升 static的作用有如下三条: 1):隐藏. 当编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性. 一个是a.c,另一个是main.c. 下面是a ...

  9. 【策略】一致性Hash算法(Hash环)的java代码实现

    [一]一致性hash算法,基本实现分布平衡. package org.ehking.quartz.curator; import java.util.SortedMap; import java.ut ...

  10. 洛谷 P2920 [USACO08NOV]时间管理Time Management

    传送门 题目大意: 每个工作有截至时间和耗费时间,n个工作求最小开始时间. 题解: 贪心 从n-1安排,让结束时间尽量的晚. 注意:优先级 cout<<st<0?-1:st;  (X ...