java成神之——文件IO

Posted 叶家伟的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java成神之——文件IO相关的知识,希望对你有一定的参考价值。

文件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
b
c".getBytes());                                                      // 
换行                                      
    } 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的主要内容,如果未能解决你的问题,请参考以下文章

java成神之——enum枚举操作

java成神之——Stream和Optional

java成神之——HttpURLConnection访问api

springboot成神之——拦截器

成神之Java之路

java成神之——安全和密码