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,一经查实,立即删除!

相关文章

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

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

红黑树插入时的自平衡

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

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…

【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;但缺点在…

画刷的使用

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…

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 Server-数据类型(七)

前言 前面几篇文章我们讲解了索引有关知识&#xff0c;这一节我们再继续我们下面内容讲解&#xff0c;简短的内容&#xff0c;深入的理解&#xff0c;Always to review the basics。 数据类型 SQL Server支持两种字符数据类型&#xff0c;一种是常规&#xff0c;另外一种则是Un…

pb retrieve时停止工作_大佬们挂在嘴边的PE、PB是什么?

在紧锣密鼓地准备科创50ETF的发行工作间隙&#xff0c;今天小夏先带你读懂最简单的PE、PB估值指标这两大指标。01、什么是PE&#xff08;市盈率&#xff09;PE&#xff0c;也就是市价盈利比率&#xff0c;简称市盈率。市盈率是指股票价格与每股收益&#xff08;每股收益&#x…

【设计模式 01】简单工厂模式(Simple factory pattern)

简单工厂模式 可以根据参数的不同返回不同类的实例 参考&#xff1a; CSDN|简单工厂模式 简单工厂通过传给工厂类的参数的不同&#xff0c;返回不同的对象&#xff0c;包括三部分组成&#xff1a; 具体的”产品“工厂类&#xff08;实例化并返回”产品“&#xff09;客户端&am…

用Visual Studio 2019连接 WSL来编译调试C/C++项目

因为有作业要在Linux环境下写&#xff0c;用虚拟机直接卡成PPT&#xff0c;VS code又不会调试&#xff0c;就搞一下VS 2019吧。 环境 windows 10 WSL(Ubuntu 18.04.4) Visual Studio Community 2019 Linux 里要有C/C环境&#xff08;gcc等&#xff09;VS要有 适用于 Linux…

系统移植的四大步骤

最近在学习系统移植的相关知识&#xff0c;在学习和调试过程中&#xff0c;发现了很多问题&#xff0c;也解决了很多问题&#xff0c;但总是对于我们的开发结果有一种莫名其妙的感觉&#xff0c;纠其原因&#xff0c;主要对于我们的开发环境没有一个深刻的认识&#xff0c;有时…

display:flex

flex&#xff1a;弹性布局 常用属性介绍&#xff1a; flex-direction: column &#xff08;设置主容器主轴方向&#xff09; flex-flow: row wrap &#xff08;第一个参数为flex-direction&#xff0c;第二个为flex-wrap&#xff09; align-items: flex-start &#xff08;设…

Linux(Ubuntu 19.10)下 Qt5 连接 MySQL(QMYSQL driver not loaded)

Linux&#xff08;Ubuntu 19.10&#xff09;下 Qt5 连接 MySQL 安装好 MySQL 和 Qt Qt 连接 MySQL 的代码 QSqlDatabase dQSqlDatabase::addDatabase("QMYSQL");//加载mysql驱动&#xff0c;这个字符串是固定的 d.setHostName("127.0.0.1"); d.setDatabas…

Wpf 数据绑定简介、实例1

简介&#xff1a;1.WPF绑定使用的源属性必须是依赖项属性&#xff0c;这是因为依赖项属性具有内置的更改通知支持&#xff0c;元素绑定表达式使用了Xaml扩展标记&#xff0c; WPF绑定一个控件是使用Binding.ElementName, 绑定非控件对象时使用Source,RelativeSource,DataContex…

【设计模式 04】代理模式

代理模式 代理模式( Proxy)&#xff1a;为其他对象提供一种代理以控制对这个对象的访问。 参考&#xff1a;refactoringguru | proxy 什么是代理模式 有时候如果想要访问某个对象&#xff0c;但又没办法直接访问或不方便直接访问&#xff0c;可以使用代理模式&#xff0c;代理…

css 大于号 标签_CSS设计基础选择器篇

点击上方 Java项目学习 &#xff0c;选择 星标 公众号重磅资讯、干货&#xff0c;第一时间送达前言&#xff1a;如果将CSS样式应用于特定的网页对象上&#xff0c;需要先找到目标元素。在CSS样式中执行这一任务的部分被称为选择器。1 标签选择器优点&#xff1a;为页面中同类型…

crontab 提示 command not found 解决方案

crontab 提示 command not found 解决方案 今天遇见一个问题&#xff0c;crontab的定时任务会报错&#xff1a;java command not found&#xff0c;但是手动执行脚本一直能成功。 猜想是环境变量的问题。 在crontab里添加个打印环境变量的任务&#xff1a; * * * * * echo $PAT…

【设计模式 05】工厂方法模式

工厂方法模式 define an interface or abstract class for creating an object but let the subclasses decide which class to instantiate. 参考&#xff1a; refactoringguru | factory-methodjavatpoint | factory-method-design-pattern博客园| 工厂方法 简单工厂的问题 …

LinkedList类源码浅析(二)

1、上一节介绍了LinkedList的几个基本的方法&#xff0c;其他方法类似&#xff0c;就不一一介绍&#xff1b; 现在再来看一个删除的方法&#xff1a;remove(Object o) remove方法接受一个Object参数&#xff0c;这里需要对参数做空与非空处理&#xff1b; 但是删除一个Object元…