IO流机制

File类的使用

File类的构造方法

File(URI uri)

File(String pathname)

File(File parent, String child)

File(String parent, String child)

File类的常用方法

boolean exists():判断文件是否存在

boolean createNewFile() :创建一个新文件,只能创建一个文件,不能创建目录(文件夹),创建时先判断文件 是否存在 ,不存在则创建并返回true, 存在则返回false.

File getAbsoluteFile() File 类型的绝对路径File文件形式,相当于 File file =new File(绝对名称),

String getAbsolutePath() String类型的绝对路径的字符串形式

String getName() : 获取的是路径的最后一级的名称

String getPath() //获取的是相对路径的名称:打File对象事调用的就是getPath()方法

String Parent() //返回当前文件的上一级目录,若没有上一级目录返回null

bolean isDirectory() //判断是否是文件

bolean isFile() //判断是否是文件夹

bolean delete()//删除一个文件或文件夹

File[] listFiles()// 只能获取当前文件夹下的的所有文件

Long length() //获取点前文件夹的长度

public class Test01_01 {
public static void main(String[] args) throws IOException {
// 创建文件对象:绝对路径
File f1 = new File("d:/a.txt");
// 创建文件对象:相对路径
File f2 = new File("a.txt");
boolean b1 = f1.createNewFile();
boolean b2 = f2.createNewFile(); String path1 = f1.getAbsolutePath(); //d:\a.txt
String path2 = f2.getAbsolutePath(); //C:\idea_workspace\basic-java\a.txt
System.out.println(path1+" "+path2);
File fpath1 = f1.getAbsoluteFile(); //d:\a.txt
File fpath2 = f2.getAbsoluteFile(); //C:\idea_workspace\basic-java\a.txt
System.out.println(fpath1+" "+fpath2); String name1 = f1.getName(); //a.txt
String name2 = f2.getName(); //a.txt
System.out.println(name1+" "+name2);
/*
获取的是相对路径
*/
String p1 = f1.getPath();//d:\a.txt
String p2 = f2.getPath(); //d:\a.txt
System.out.println(p1+" "+p2);
File f3 = new File("d:/aaa/aa");
System.out.println(f3.getParent()+"f3....");
System.out.println(f2.getParent()+"f2....");
Boolean b = f3.mkdirs();
System.out.println(b);
File f4 = new File(f3,"a"); //在 aaa/aa文件夹下再创建一个文件目录a
String parent = f4.getParent();
System.out.println(parent);
f4.mkdir();
File f5 = new File("d:/aaa/aa/a","a.txt");
System.out.println(f5.getParent());
System.out.println(f4.getName()); //a
f5.createNewFile();//在d:/aaa/aa/a下创建一个a.txt文件
System.out.println(f5); //d:\aaa\aa\a\a.txt,实际是复写了toStirng()方法,在toStirng中调用了getPath()
//删除文件或文件夹delete()
f2.delete();
f1.delete(); } } public static void main(String[] args) {
// 创建文件对象
File f = new File("d:/aaa/b.txt");
// 获得文件名
String filename = f.getName();
// 获得文件大小
long filesize = f.length();
// 获得文件的绝对路径
String path = f.getAbsolutePath();
// 获得父文件夹路径,返回字符串
String parentPath = f.getParent();
// 获得父文件夹路径,返回文件对象
File parentFile = f.getParentFile();
// 输出信息
System.out.println("文件名:" + filename);
System.out.println("文件大小:" + filesize);
System.out.println("文件路径:" + path);
System.out.println("文件父路径:" + parentPath);
System.out.println("文件父路径:" + parentFile);
}

运行结果

判断是否是文件或文件夹

    public static void main(String[] args) {
// 创建文件对象
File f1 = new File("d:/b.txt");
// 判断是否是一个文件
if(f1.isFile()) {
System.out.println(f1.getName()+"是一个文件");
} else {
System.out.println(f1.getName()+"不是一个文件");
}
// 创建文件对象
File f2 = new File("d:/aaaa");
// 判断是否是一个文件夹
if(f2.isDirectory()) {
System.out.println(f2.getName()+"是一个文件夹");
} else {
System.out.println(f2.getName()+"不是一个文件夹");
}
}

运行结果:

获取当前文件夹下的所有文件列表

public class Test01_08 {
public static void main(String[] args) {
// 创建文件对象
File f = new File("d:/aaa");
// 获得文件夹下所有文件
File[] files = f.listFiles();
// 遍历文件数组
for (File file : files) {
// 将文件的名字打印到控制台
System.out.println(file.getName());
}
}
}

listFiles(FileFilter filter)、File listFiles(FilenameFilter filter)

、listFile的重写方法

File[] listFiles(FileFilter filter) //返回该文件夹下满足指定过滤器条件的文件和目录。

File listFiles(FilenameFilter filter)

FileFilter 和 FilenameFilter 是一个接口,接口中只定义了accept()一个方法,要使用该接口就要实现该方法

boolean accept(File pathname): FileFilter的方法,File pathname的File文件既有文件类型的也有目录类型的

boolean accept(File dir, String name) : FilenameFilter的方法,

注:File dir:的所有文件都被封装成了一个目录

File[] file = f.listFile(FileFilter filter)方法的执行步骤:

1.获取文件夹下的所有文件,将所有的文件都封装成File类型

2.遍历获取的文件,调用FileFilter的accept(File pathname)方法,将文件挨个传入,根据accept()中定义的规则筛选文件,判断方法的返回值, 若方法的返回值为true则把当前遍历的File文件存放在File[]数组中`

注: 调用boolean accept(File dir, String name)的原理大致相同,只是还多了一个功能,能接收的当前文件 夹的文件名,String name:接收的是文件名称,不是路径名称

public class Test01_09 {
public static void main(String[] args) {
File f = new File("d:/aaa/aa/a");
/**
* d:/aaa/aaa/a下有两个文件:一个_a文件夹,一个a.txt文件
* 要求:只获取d:/aaa/aaa/a下的文件,不获取文件夹
*/
File[] file = f.listFiles(new FilenameFilter() {
@Override
public boolean accept(File pathname, String name) {
System.out.println(name); //a.txt /_a
if(name.endsWith(".txt")){
return true;
}
return false;
}
});
System.out.println(file[0]);
} }

**注: 使用FilenameFilter filter,所有文件都被封装成目录即文案夹

流的分类

按流向分:

  • 输入流:从硬盘读取数据到内存
  • 输出流:从内存中读取数据到硬盘

按读取的类型分:

  • 字节流:读取时一次读取一个字节

    OutputStream: 输出字节流

    InPutStream: 输入字节流
  • 字符流:读取时一次读取一个字符

    Reader: 输入字符流

    Writer:输出字节流

InputStream&OutPutStram

InputStream: 字节输入流

FileInputStream:

从硬盘读取文件内容到内存的的字节输入流

构造方法:

FileInputStream(File file)

FileInputStream(String name)

常用方法:

int read() //返回的是对应的字节数据,当没有数据时返回-1

int read(byte[] b) //返回值为读取的字节个数,

一个一个字节读取到byte[]数组中,再将byte[]数组的内容传递给应用程序

int read(byte[] b, int off, int len) //返回值为从内存中读取的字节个数

一个一个字节读取,将字节数据存放在指定的数组位置

public class Test03 {
public static void main(String[] args) throws IOException {
// 创建字节输入流对象并关联文件
FileInputStream fis = new FileInputStream("d:/c.txt");
// 定义变量接收读取的字节
int len = -1;
byte[] bytes = new byte[6];
// 循环从流中读取数据
while((len = fis.read(bytes))>0) {
System.out.print(new String(bytes,0,len));
}
// 关闭流
fis.close();
}
}

程序读取流的流程:

java程序 -----》找到jvm虚拟机-------->通知Os操作系统-----》由OS去硬盘读取文件

os拿到文件的数据------》通知OS操作系统----->找到JVM虚拟机------》将数据返还给java程序

OutPutStram:字节输出流

FileOutputStream:从内存中读取数据到硬盘的输出流,读取的时候一个字节一个字节读取,输出的时候也是一个字节一个字节的输出

构造方法:

  • FileOutputStream(File file) //创建一个输出流,将流关联到指定的输出目的地
  • FileOutputStream(String name) //创建一个输出流,将流关联到指定的输出目的地
  • FileOutputStream(File file, boolean append) //创建一个输出流,将流关联到指定的输出目的地,并指定是否将数据添加到文件末尾

    append = true:当流对象再与目的文件关联时,将数据添加到原文件的末尾

    append = false :当流对象再与目的文件关联时,覆盖原文件
  • FileOutputStream(String name, boolean append) //创建一个输出流,将流关联到指定的输出目的地,并指定是否将数据添加到文件末尾 append = true:将数据添加到原文件的末尾 append = false :覆盖原文件

常用方法:

  • void write(int b) ://将一个字节写到指定目的地,数字>=255,写出的数据内容为空

  • void write(byte[] b) // 将一个字节数组的数据写到目的地,写出的形式也是一个字节一个字节的写出到硬盘中

  • void write(byte[] b, int off, int len) 将指定位置的字节数组的数据写到硬盘

  • void close() //关闭流对象

    FileOutputStream fos = new FileInputStream("d/a.txt")的语义:

1.首先创建了一个输出流对象

2.输出流对象指向输出的目的地址d:/a.txt

fos.write(97)的语义:

流对象获取字节数据,将数据输出到指定的目的文件中

注:write(97)的97 代表的是一个字节,当写如文件中,文件展示是会根据编码表对数据进行解码,97在编码表中对应的是小写字母a

public class Test01 {
public static void main(String[] args) throws IOException {
// 1.创建字节输出流FileOutputStream对象并指定文件路径。
FileOutputStream fos = new FileOutputStream("d:/a.txt");
// 2.调用字节输出流的write(int byte)方法写出数据
fos.write(254); //
byte[] bytes = {97,98};
fos.write(bytes);
// 3.关闭流
fos.close();
}
}

文件的换行:

public class Test02 {
public static void main(String[] args) throws IOException {
// 1.创建字节输出流FileOutputStream对象并指定文件路径,并追加方式
FileOutputStream fos = new FileOutputStream("d:/c.txt",true);
// 2.调用字节输出流的write方法写出数据
// 2.1 要输出的字符串
String content = "i love java \r\n";
for (int i = 0; i< 5; i++) {
fos.write(content.getBytes());
}
// 3.关闭流
fos.close();
}
}

程序写出流的流程:

java程序 -----》找到jvm虚拟机-------->通知Os操作系统-----》由OS去内存读取文件

os拿到文件的数据------》通知OS操作系统----->找到JVM虚拟机------》将数据写入到硬盘

Reader&Writer

Reader:字符输入流

FileReader: 操作文件的字符输入流

构造方法:

FileReader(File file)

FileReader(String fileName)

常用方法:

int read()

int read(char[] cbuf) //读取数据时是按字符读取的,单底层又将字符转为字节对象,因此,返回值是字节的个数 l

例如:读取好aaahhh,

返回的int值为8,一个中文字符占2个字节

int read(char[] cbuf, int off, int len)

Writer:字符输出流

FileWriter:操作文件的字符输出流

构造方法:

  • FileWriter(File file)
  • FileWriter(String fileName)
  • FileWriter(File file, boolean append)
  • FileWriter(String fileName, boolean append)

常用方法:

  • void write(int c)
  • void write(char[] cbuf)
  • void write(char[] cbuf, int off, int len)
  • void write(String str)
  • void write(String str, int off, int len)
  • void flush() //将内存缓冲区的数据刷到目的文件中
  • FileWriter的write()方法实现机制

首选,将要写出的字符数据转为字节数据,放到内存缓冲区中,使用flush()将缓冲区中的数据写入到文件中,因此文件的接收的还是字节数据,再根据文件的编码参照对应的编码表将字节转为对应的字符

Properties(属性集)的使用

Properties的作用:

  • load(InputStream instream): //读取键值对文件到Properties集合
  • store(OutputStream out, String comments)

    java的Io流机制的学习的更多相关文章

    1. java的Io流学习

      Java中io流的学习(一)File:https://blog.csdn.net/qq_41061437/article/details/81672859 Java中io流的学习(二)FileInpu ...

    2. Java基础——IO流

      今天刚刚看完java的io流操作,把主要的脉络看了一遍,不能保证以后使用时都能得心应手,但是最起码用到时知道有这么一个功能可以实现,下面对学习进行一下简单的总结: IO流主要用于硬板.内存.键盘等处理 ...

    3. java基础IO流综合加习题

      IO流初学者在学习时都有一点迷糊,今天我们就讲讲IO流,希望通过讲解可以帮助大家 IO流分为字节流,字符流,缓冲流.我们只要记住这三个就可以了. 1*字节流有:字节输入流(FileInputStrea ...

    4. JAVA中IO流总结

      本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42119261 我想你对JAVA的IO流有所了解,平时使用的 ...

    5. Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream)

      Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在我们学习字 ...

    6. Java 的 IO 流

      接着上一篇的 “Java 的 File 类” 的随笔,在File类的基础上,我们就走进Java的IO流吧. 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在 ...

    7. Java之IO流用法总结

      Java的IO流概述:1.I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理设备之间的数据传输.如读/写文件,网络通讯等.2.Java程序中,对于数据的输入/输出操作以“流( ...

    8. Java的IO流以及输入流与输出流的异同

      一:流的基本概念:           Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列.J ...

    9. java的IO流

      java的IO流继承四大抽象类分别是字节流 inputStream outputStream与字符流 read write.怎么理解记忆很重要. 直接连接读写对象的是结点流,例如对文件读取字节类的名字 ...

    随机推荐

    1. 在Python中,输出格式:%d , %6d , %-6d, %06d , %.6f的一些区分

      和C/C++编程语言一样 %d 普通的整数输出 i = 1 sum = 0 while i <= 100: sum += i i += 1 print("1到100的和为:%d&quo ...

    2. 18.Tomcat基本应用

      1.JVM基本介绍 JAVA编译型 ---> 编译 C 编译型---> linux --->编译一次 windows --->编译一次 macos ubuntu 跨平台 移值型 ...

    3. 15.Nginx动静分离Rewrite

      1.什么是动静分离? 将动态请求和静态请求区分访问, 2.为什么要做动静分离? 静态由Nginx处理, 动态由PHP处理或Tomcat处理.... 因为Tomcat程序本身是用来处理jsp代码的,但t ...

    4. linux系统状态网络、权限、用户大杂烩

      来来来,我们聊一下liunx系统相关的知识!! 首先从查询网络配置开始 ifconfig 查询.设置网卡和ip等参数 ifup,ifdown 脚本命令,更简单的方式启动关闭网络 ip命令是结合了ifc ...

    5. spring cloud(Greenwich SR)- Eureka

      spring cloud study 本次学习基于spring cloud Greenwich SR1 版本 学习要点: Spring Boot/Spring Cloud应用开发套路 加依赖 加注解 ...

    6. jupyter qtconsole 的安装

      Jupyter qtconsole最近开始研究人工智能算法,发现了一款基于python的科学计算的神器,jupyter qtconsole,简直就是ipython的加强版,每个命令都直接显示帮助信息, ...

    7. egg-mongoose --- nodejs

      项目 egg + mongoose 项目结构 配置 egg 安装模块 npm i egg-mongoose --save config/pulgin.js exports.mongoose = { e ...

    8. $POJ2942\ Knights\ of\ the\ Round\ Table$ 图论

      正解:图论 解题报告: 传送门! 一道,综合性比较强的题(我是萌新刚学$OI$我只是想练下$tarjan$,,,$QAQ$ 考虑先建个补图,然后现在就变成只有相互连边的点不能做邻居.所以如果有$K$个 ...

    9. 20190906_matplotlib_学习与快速实现

      20190906 Matplotlib 学习总结 第一部分: 参考连接: Introduction to Matplotlib and basic line https://www.jianshu.c ...

    10. Codeforces 游记

      早就对这个比赛平台有所耳闻(事实上,之前打过一场div2惨的一批……)今天去打了一场div3. 首先还是吐槽一下这个毛子时区的比赛时间,从十点三十五到零点三十五……这种时间要不是在家根本没法打嘛…… ...