文件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. Codeforces Round #299 (Div. 2)D. Tavas and Malekas

    KMP,先预处理按每个节点标记,扫一遍更新每个匹配位置,最后kmp判断是否有重合而且不相同的地方 注意处理细节,很容易runtime error #include<map> #includ ...

  2. 四十九 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页

    逻辑处理函数 计算搜索耗时 在开始搜索前:start_time = datetime.now()获取当前时间 在搜索结束后:end_time = datetime.now()获取当前时间 last_t ...

  3. Java Maven项目使用CXF插件生成WebService代理

    CXF生成代理类插件名称:cxf-codegen-plugin 实现功能: 指定代理类所在的包 生成soapheader 操作: eclipse中run as -> maven build -& ...

  4. Microsoft Edge Certified with EBS 12.1 and 12.2

    I am very pleased to announce that Microsoft Edge is certified as a new browser for Oracle E-Busines ...

  5. About GCC

    GCC used to stand for the GNU C Compiler, but since the compiler supports several other languages as ...

  6. android 删除SD卡或者手机的缓存图片和目录

    public static final String TEMP_PHOTO_FILE_NAME = "temp_photo.jpg"; private static String ...

  7. 前端之JavaScript 03

    window对象 所有浏览器都支持 window 对象.概念上讲.一个html文档对应一个window对象.功能上讲: 控制浏览器窗口的.使用上讲: window对象不需要创建对象,直接使用即可. W ...

  8. MS SQL Server2000转换成MySQL

    按计划今天着手进行将后台数据库从MS SQL Server2000转换成MySQL5.1.3.目的是便于发布软件的测试版本. 1. 驱动: mysql-connector-odbc-5.1.11-wi ...

  9. CS与BS区别

    简介:CS即Client/Server(客户机/服务器)结构,C/S结构在技术上很成熟,它的主要特点是交互性强.具有安全的存取模式.网络通信量低.响应速度快.利于处理大量数据.但是该结构的程序是针对性 ...

  10. [ArgumentException: 可能证书“CN=JRNet01-PC”没有能够进行密钥交换的私钥,或者进程可能没有访问私钥的权限。有关详细信息,请参见内部异常。]

    堆栈跟踪: [CryptographicException: 密钥集不存在. ] System.Security.Cryptography.Utils.CreateProvHandle(CspPara ...