Java IO 系统

Java IO系统

File类

用来处理文件目录,既可以代表一个特定文件的名称,也可以代表一组文件的名称,如果代表的是一个文件组,可以调用File.list()方法返回一个字符数组。

list()不传递任何参数时返回该目录下所有文件或文件名的字符数组(不会递归遍历目录里面的内容【只返回第一层】)如果想要过滤返回结果,可以传递给它一个FilenameFilter对象,该接口只有一个方法accept, 接收一个代表某个特定文件所在目录的File对象 dir 和一个包含了文件名的String name, list会对dir中的每个文件执行accept ,如果accept结果为true, 就把这个name加入list的结果中。

@FunctionalInterface
public interface FilenameFilter {boolean accept(File dir, String name);
}
public String[] list(FilenameFilter filter) {// 策略模式,根据filter是否为null,具有不同的策略String names[] = list();if ((names == null) || (filter == null)) {return names;}// 内部使用了ArrayListList<String> v = new ArrayList<>();for (int i = 0 ; i < names.length ; i++) {if (filter.accept(this, names[i])) {v.add(names[i]);}}return v.toArray(new String[v.size()]);}

例:

package Note.iosystem;import java.io.File;
import java.io.FilenameFilter;
import java.util.regex.Pattern;class DirFilter implements FilenameFilter {private Pattern pattern;DirFilter (String regex){pattern = Pattern.compile(regex);}@Overridepublic boolean accept(File dir, String name) {return pattern.matcher(name).matches();}
}public class DirList {public static void main(String[] args) {File file = new File("./src/Note/iosystem");String filter = ".*\\.java";String [] filenames = file.list(new DirFilter(filter));assert filenames != null;for (String filename:filenames) {System.out.println(filename);}}
}

使用匿名内部类使得代码更加简洁

package Note.iosystem;import java.io.File;
import java.io.FilenameFilter;
import java.util.regex.Pattern;public class DirList2 {public static void main(String[] args) {File file = new File("./src/Note/iosystem");String filter = ".*\\.java";String [] filenames = file.list(new FilenameFilter() {private Pattern pattern  = Pattern.compile(filter);@Overridepublic boolean accept(File dir, String name) {return pattern.matcher(name).matches();}});assert filenames != null;for (String filename:filenames) {System.out.println(filename);}}
}

其他常用方法

1. 构造方法

File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 通过将给定的路径名字符串转换为抽象路径名来创建新的File实例。 如果给定的字符串是空字符串,则结果是空的抽象路径名。

public static void main(String[] args) {// Java 中一个 “\” 表示转义开始File file = new File("E:\\桌面文件\\JAVA\\src\\demo.txt");}

File(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File实例。

File file1 = new File("E:\\桌面文件\\JAVA\\src", "demo.txt");

第一个参数传入父级路径字符串,第二个参数传入相对父级路径的子路径名

File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例。

File file2 = new File("E:\\桌面文件\\JAVA\\src");
File file3 = new File(file2, "demo.txt");

File(URI uri) 通过将给定的 file: URI转换为抽象路径名来创建新的 File实例。

2 成员方法

2.1 创建
成员方法功能参数介绍返回值介绍异常备注
public boolean createNewFile()创建文件,如果存在就不创建——创建成功返回true,文件存在或创建失败返回falseIOException路径不存在抛出IOException异常
public boolean mkdir()创建文件夹返回是否创建成功IOException父路径不存在返回false
public boolean mkdirs()创建多级目录返回是否成功IOException路径不存在就创建
2.2 删除
成员方法功能参数介绍返回值介绍异常备注
public boolean delete()删除文件或文件夹返回是否删除成功1. 文件不存在返回false 2. 删除文件夹时只能删除空文件夹
2.3 重命名或移动
成员方法功能参数介绍返回值介绍异常备注
public boolean renameTo(File dest)重命名文件dest:重命名文件的新的抽象路径名返回是否重命名成功可以使用这个方法实现移动(剪贴)功能
2.4 判断
成员方法功能参数介绍返回值介绍异常备注
public boolean isDirectory()判断是否是目录返回是否是目录只有是目录且目录存在时返回true
public boolean isFile()判断是否是文件返回是否是文件
public boolean isHidden()判断是否是隐藏文件··UNIX中,以.开头的是隐藏文件,而window中,特殊标记过的是隐藏文件
public boolean exists()判断文件或目录是否存在返回是否存在
public boolean canWrite()判断文件是否可写返回是否可写
public boolean canRead()判断文件是否可读返回是否可读
public boolean isAbsolute()判断路径是否是绝对路径在UNIX系统上,如果前缀为"/" ,路径名是绝对的。 在Windows系统上,前面是盘符或///为绝对路径
2.5 获取功能
成员方法功能参数介绍返回值介绍异常备注
public String getName()返回文件或目录名称String这个方法只是对路径字符串的分割操作,不检查路径是否存在
public String getParent()返回文件或文件夹父路径名字符串String也只是字符串的分割操作,不检查路径或文件是否真实存在
public File getParentFile()返回文件或文件夹的父路径的File对象File内部调用的是getParent()方法
public String getPath()返回文件路径String
public String getAbsolutePath()返回绝对路径String同样不关心文件是否存在
public File getAbsoluteFile()返回绝对形式的File对象File
public String getCanonicalPath()返回文件规范路径名字符串StringIOException先转换成绝对路径,然后删除.,..等冗余名称等。。
public File getCanonicalFile()返回文件规范路径名的File对象IOException
public long lastModified()返回文件上次修改时间Long 返回一个时间戳如果文件不存在返回0
public long length()返回文件长度Long 文件长度,以字节为单位文件不存在返回0
public String[] list([FilenameFilter filter])返回该目录下所有文件和目录的数组可以传入一个FilenameFilter filter,表示列出满足过滤器的文件或目录名
public File[] listFiles([FilenameFilter filter])类似于上面

流总览

流对象代表任何有能力产出数据的源对象或任何有能力消费数据的目标对象,Java中IO类分为输入和输出两部分,对应输入流和输出流任何继承自InputStreamReader的类都包含基本方法read()用来读字节或字节数组(字符),任何继承自OutputStreamWriter的类都包含基本方法write()用来写字节或字节数组。

输入输出是相对于当前程序而言的

InputStream和OutputStream

Java1.0中,所有输入相关的类都从InputStream继承而来,所有输出相关的类都从OutputStream继承而来,也就是字节流。

InputStream

InputStream用来表示从不同输入源产生输入的类,这些输入源包括:

  1. 字节数组
  2. String对象
  3. 文件
  4. 管道
  5. 一个由其他种类的流组成的序列,我们可以把它们合并到同一个流里
  6. 其他数据源,如Interest连接等

每种数据源都对应一个具体的InputStream的子类
在这里插入图片描述

OutputStream

他的子类决定了输出要去往的目标,包括:

  1. 字节数组
  2. 管道
  3. 文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fkHU1P7l-1585581131272)(image/Java11_IO系统/image-20200328131236501.png)]

Reader 和 Writer

Java1.1 中加入了 Reader 和 Writer类,来提供兼容Unicode和面向字符的IO功能,对于数据的来源和去向,字节流中有的字符流差不多都有对应的。

因此,最明智的做法是尽量尝试使用Reader和Writer,一旦编译无法通过,我们会发现不得不使用面向字节的类库。

——《Java编程思想》

在这里插入图片描述

常用流

文件流

FileInputStream,FileOutputStream,FileReader, FileWriter

package Note.iosystem;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class CopyFile {private String sourcePath, targetPath;CopyFile (String source, String target) {sourcePath = source;targetPath = target;}public void copy() throws IOException {FileInputStream fis = new FileInputStream(this.sourcePath);// 构造器第二个参数append传递true表示开启追加写模式FileOutputStream fos = new FileOutputStream(this.targetPath, true);byte [] bytes = new byte[1024];int readResult = 0;while(readResult >= 0) {// read方法传递一个长度为n的字节数组,每次读取n位, 返回实际读取的位数,读到// 文件结束符返回 -1readResult  = fis.read(bytes);if(readResult > 0) {// write方法可以传递一个偏移量和长度,表示写比特数组的0位开始,// 长度为readResult的数据fos.write(bytes, 0, readResult);}}// 记得要关闭流对象fis.close();fos.close();}public static void main(String[] args) throws IOException {CopyFile copyFile = new CopyFile("E:\\桌面文件\\媒体\\生而为人.m4a","E:\\桌面文件\\生而为人.m4a");copyFile.copy();}}
package Note.iosystem;import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class CopyFileByChar {private String sourcePath, targetPath;CopyFileByChar (String source, String target) {sourcePath = source;targetPath = target;}public void copy() throws IOException {FileReader fr = new FileReader(this.sourcePath);FileWriter fw = new FileWriter(this.targetPath, true);int readResult = 0;char [] chars = new char[1024];while(readResult >= 0) {readResult = fr.read(chars);if(readResult > 0){fw.write(chars, 0, readResult);}}fr.close();fw.close();}public static void main(String[] args) throws IOException {CopyFileByChar copyFileByChar = new CopyFileByChar("./src/Note/iosystem/DirList.java","./src/Note/iosystem/DirListCopyByChar.txt");copyFileByChar.copy();}
}

缓冲流

BufferedReader, BufferedWriter, BufferedInputStream, BufferedOutputStream

package Note.iosystem;import java.io.*;public class BufferDemo {private String from, to;public BufferDemo(String from, String to) {this.from = from;this.to = to;}public void copy() throws IOException {BufferedReader bfr = new BufferedReader(new FileReader(this.from));
//        char [] chars = new char[1024];
//        bfr.read(chars);BufferedWriter bfw = new BufferedWriter(new FileWriter(this.to));String line = bfr.readLine();while (line != null) {bfw.write(line);bfw.newLine();line = bfr.readLine();}bfr.close();bfw.close();}public static void main(String[] args) throws IOException {BufferDemo bd = new BufferDemo("./src/Note/iosystem/DirList.java","./src/Note/iosystem/DirListCopyByChar.txt");bd.copy();}
}

转化流

InputStreamReader, OutputStreamWriter 允许设置编码方式,将字节流转换为字符流

package Note.iosystem;import java.io.*;public class ConversionStream {public static void main(String[] args) throws IOException {String filePath = "./src/Note/iosystem/DirList.java";String filePathGBK = "./src/Note/iosystem/DirListGBK.java";InputStreamReader isr = new InputStreamReader(new FileInputStream(filePath));OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filePathGBK), "GBK");char [] chars = new char[1024];int result = isr.read(chars);while (result >= 0) {osw.write(chars);result = isr.read(chars);}isr.close();osw.close();}
}

序列化流

  1. 想要将一个对象序列化,必须实现Serializable接口(他是一个标记接口)

  2. 反序列化时,对象对应的class文件必须存在,否则抛出ClassNotFoundException

  3. 类实现Serializable接口后,Java文件编译成class文件时,会添加一个作为唯一标识的serialVersionUID,这个序列号在序列化时会写入序列化文件,用来在反序列化时判断class文件是否一致, 如果在序列化之后修改了类的定义但没有重新序列化对象,在反序列化时就会抛出InvalidClassException异常,因为修改类定义会重新生产序列号。

    • 可以给定一个确定的序列化来解决这个问题,必须是static final long 的:

          private final static long serialVersionUID = 1L;
      
  4. 用static修饰的属性值不会被序列化(静态属性优先加载),除此之外如果不想序列化某个属性的值,可以使用transient修饰

package Note.iosystem.serialization;import java.io.Serializable;public class Person implements Serializable {private String name;private transient int age;@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}public Person(String n, int a) {this.age = a;this.name = n;}
}
package Note.iosystem.serialization;import java.io.*;public class ObjectOSDemo {public static void main(String[] args) throws IOException, ClassNotFoundException {String outputPath = "./src/Note/iosystem/objectOutput";Person person = new Person("zhangSan", 17);ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(outputPath));oos.writeObject(person);oos.close();ObjectInputStream ois = new ObjectInputStream(new FileInputStream(outputPath));Person p = (Person) ois.readObject();System.out.println(p);ois.close();}
}

… more …

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457483.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux Crontab 任务管理工具命令以及示例

Crontab 是 Linux 平台下的一款用于循环执行例行任务的工具,Linux 系统由 cron (crond) 这个系统服务来控制任务 , Linux系统本来就有很多的计划任务需要启动 , 所以这个系统服务是默认开机启动的 。 Linux 为使用者提供的计划任务的命令就是 Crontab Crontab 是 Linux 下用来周…

Linux 网络编程详解一(IP套接字结构体、网络字节序,地址转换函数)

IPv4套接字地址结构 struct sockaddr_in {uint8_t sinlen;&#xff08;4个字节&#xff09;sa_family_t sin_family;&#xff08;4个字节&#xff09;in_port_t sin_port;&#xff08;2个字节&#xff09;struct in_addr sin_addr;&#xff08;4个字节&#xff09;char sin_zer…

地籍cad的lisp程序大集合_AutoCAD-LISP程序100例

{:soso_e179:}AutoCAD-LISP程序100例.JPG (143.82 KB, 下载次数: 28)2011-10-18 14:42 上传有说明很好&#xff01;顶如果您使用 AutoCAD,下面的内容对您一定有帮助。在某些方面能大大提高您的工作效率。下面的程序均以源程序方式给出&#xff0c;您可以使用、参考、修改它。bg…

javascript中数组的22种方法

前面的话数组总共有22种方法&#xff0c;本文将其分为对象继承方法、数组转换方法、栈和队列方法、数组排序方法、数组拼接方法、创建子数组方法、数组删改方法、数组位置方法、数组归并方法和数组迭代方法共10类来进行详细介绍对象继承方法数组是一种特殊的对象&#xff0c;继…

javascript/jquery高度宽度详情解说分析

为什么80%的码农都做不了架构师&#xff1f;>>> 一、window对象表示浏览器中打开的窗口 二、window对象可以省略 一、document对象是window对象的一部分 二、浏览器的HTML文档成为Document对象 window.location和document.location window对象的location属性引用的…

农用地包括哪些地类_土地地类一览表

一级类二级类三级类含义编号三大类名称编号名称编号名称1农用地指直接用于农业生产的土地&#xff0c;包括耕地&#xff0c;园地&#xff0c;林地&#xff0c;牧草地及其他的农业用地11耕地指种植农作物、土地&#xff0c;包括熟地、新开发复垦整理地&#xff0c;休闲地、轮歇地…

红黑树插入时的自平衡

红黑树插入时的自平衡 红黑树实质上是一棵自平衡的二叉查找树&#xff0c;引入带颜色的节点也是为了方便在进行插入或删除操作时&#xff0c;如果破坏了二叉查找树的平衡性能通过一系列变换保持平衡。 红黑树的性质 每个节点要么是红色&#xff0c;要么是黑色根节点必须是黑…

说一下自己对于 Linux 哲学的理解

查阅了一些资料&#xff0c;官方的哲学思想貌似是&#xff1a; 一切皆文件由众多单一目的的小程序&#xff0c;一个程序只实现一个功能&#xff0c;多个程序组合完成复杂任务文本文件保存配置信息尽量避免与用户交互什么&#xff0c;你问我的理解&#xff1f;哲学思想&#xff…

UWP学习记录

微软{X:Bind}、{Binding}资料网站 &#xff1a; https://msdn.microsoft.com/windows/uwp/xaml-platform/x-bind-markup-extension在View的ItemTemplate中绑定ViewModel的方法&#xff1a;1 <ItemsControl Name"XX" ItemsSource"{x:Bind VM.XXModels,ModeOne…

dw1000信标码_DW1000方案工牌型UWB标签,助力10厘米高精度室内定位!

DW1000方案工牌型UWB标签&#xff0c;助力10厘米高精度室内定位&#xff01;发布日期&#xff1a;2019-04-01 浏览次数&#xff1a;244次微能信息(95power)推出一款工牌型UWB标签VDU1510 &#xff0c;广泛应用于超宽带UWB定位系统&#xff0c;最高可实现10cm高精度人员定位。工…

【Java】HashMap源码(1.7)

Life is not a ridiculous number of life, the meaning of life lies in life itself HashMap源码 散列集 数组和链表可以保持元素插入的顺序&#xff0c;对数组来说&#xff0c;他的优点是拥有连续的存储空间&#xff0c;因此可以使用元素下标快速访问&#xff0c;但缺点在…

Docker 基本用法

1.安装&#xff1a; wget http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm rpm -ivh epel-release-6-8.noarch.rpm yum install docker-io -y2.获取镜像 pull docker pull ubuntu docker pull ubuntu:14.043.运行这个镜像&#xff0c;在其中运行bash应用…

画刷的使用

1.画刷的定义&#xff1a; HBRUSH hBrush; windows 自定义的画刷&#xff1a; WHITE_BRUSH、LTGRAY_BRUSH、GRAY_BRUSH、DKGRAY_BRUSH、BLACK_BRUSH和NULL_BRUSH &#xff08;也叫HOLLOW_BRUSH&#xff09; 获取方法如下&#xff1a; hBrush (HBRUSH) GetStockObject (GRAY_BR…

dataframe 控对象_iOS知识 - 常用小技巧大杂烩

1&#xff0c;打印View所有子视图po [[self view]recursiveDescription]2&#xff0c;layoutSubviews调用的调用时机* 当视图第一次显示的时候会被调用。* 添加子视图也会调用这个方法。* 当本视图的大小发生改变的时候是会调用的。* 当子视图的frame发生改变的时候是会调用的。…

【Java】jdk 1.8 新特性——Lambda表达式

Lambda表达式 jdk 1.8 新加入的特性&#xff0c;简化了简单接口的实现 函数式接口 函数式中只有一个待实现的方法&#xff0c;可以使用FunctionalInterface注解标注函数式接口.这个接口中只能有一个待实现的方法&#xff0c;但可以包含默认方法&#xff0c;静态方法以及Obje…

【Todo】Java8新特性学习

参考这篇文章吧&#xff1a; http://blog.csdn.net/vchen_hao/article/details/53301073 还有一个系列转载于:https://www.cnblogs.com/charlesblc/p/6123380.html

jsp调整字体大小font_html font标签如何设置字体大小?

首先我们先来看看htmlfont标签是如何来设置字体大小的&#xff1a;都只到htmlfont标签是个专门用来设置字体的标签&#xff0c;虽然在html5中用的会很少(因为都用css样式来设置font标签里面的属性)&#xff0c;但是个人觉得font标签还是相当强大的标签的&#xff0c;为什么这么…

runtime官方文档

OC是一种面向对象的动态语言&#xff0c;作为初学者可能大多数人对面向对象这个概念理解的比较深&#xff0c;而对OC是动态语言这一特性了解的比较少。那么什么是动态语言&#xff1f;动态语言就是在运行时来执行静态语言的编译链接的工作。这就要求除了编译器之外还要有一种运…

【Java】synchronized关键字笔记

Java Synchronized 关键字 壹. Java并发编程存在的问题 1. 可见性问题 可见性问题是指一个线程不能立刻拿到另外一个线程对共享变量的修改的结果。 如&#xff1a; package Note.concurrency;public class Demo07 {private static boolean s true;public static void mai…

sql语句分析是否走索引_MySql 的SQL执行计划查看,判断是否走索引

在select窗口中&#xff0c;执行以下语句&#xff1a;set profiling 1; -- 打开profile分析工具show variables like %profil%; -- 查看是否生效show processlist; -- 查看进程use cmc; -- 选择数据库show PROFILE all; -- 全部分析的类型show index from t_log_account; ##查看…