CUMT--Java复习--文件及IO流

目录

一、文件

1、文件系统和路径

2、File类

3、FilenameFilter接口

二、IO流

1、流的分类

2、流的体系结构

三、字节流 

1、InputStream

2、OutputStream

四、字符流

1、Reader

2、Writer 

五、过滤流和转换流

1、过滤流

2、转换流

六、序列化

1、对象序列化与反序列化

2、ObjectInputStream和ObjectOutputStream

七、NIO 

1、Buffer

2、Channel


一、文件

1、文件系统和路径

        一个文件系统包含三类对象:文件、目录和符号链接。

        文件系统中的对象用路径来作为唯一的识别,路径有绝对路径(根目录为参照)和相对路径(当前目录为基础)两种。

2、File类

        java.io包提供了一系列用于文件处理的接口和类,如下图。

        代码实例:

(1)File变量不一定初始化一个文件名,也可以是一个路径,“.”表示当前路径,在vscode环境下,代表当前项目的根目录,而不是当前包的路径。

(2)try...catch语句当File初始化的file变量路径不存在是生成一个该文件夹或文件,如果File初始化的是一个文件,那么如果该文件不存在,则在他应在的路径位置上生成一个该文件,若文件夹不存在,则生成一个该文件夹。

(3)对于vscode编译环境,使用file.list()生成“.”路径下的文件列表,输出是.vscode,bin,src这一类的项目根目录下的文件夹。file.listroots()生成的绝对路径文件列表,输出为C:/,D:/的系统根路径下目录。

import java.io.File;
import java.io.IOException;public class Demo {public static void main(String[] args){File file=new File(".");                       //"."是指当前路径System.out.println(file.getName());            //获取文件名System.out.println(file.getParent());          //父路径System.out.println(file.getAbsolutePath());    //绝对路径System.out.println(file.exists());             //file是否存在try{file.createNewFile();                      //如果file不存在则在当前路径下创建  }catch(IOException e){e.printStackTrace();}String[] list=file.list();                     //当前路径的文件列表for(String name:list)System.out.println(name);File[] listroots=file.listRoots();             //电脑根目录下的文件列表for(File name:listroots)System.out.println(name);}
}

3、FilenameFilter接口

        FilenameFilter接口是一个文件过滤器接口,可以将符合条件的文件筛选出来,FilenameFilter接口只有一个accept(File dir,String name)方法,用于筛选符合条件的文件返回true。

        上面File类提到的list()方法也可以接受FilenameFilter类型的参数。

        下面实例返回后缀为.zip和.txt的符合条件的文件列表。

String[] filterFileNames=file.list(new FilenameFilter() {public boolean accept(File dir,String name){return(name.endsWith(".zip")||name.endsWith(".txt")); //过滤特定后缀}}
);
for(String name:filterFileNames)System.out.println(name);

二、IO流

        IO流是实现数据输入和输出的基础,流的优势在于使用统一的方式对数据进行操作或传递,简化代码操作。

1、流的分类

按流的流向来分类:

        输入流:只能从输入流中读取数据

        输出流:只能从输出流中写入数据

按流所操作的基本数据单元来分类:

        字节流:所操作的基本数据单元是8位的字节(byte)

        字符流:所操作的基本数据单元是16位的字符(unicode)

按流的角色来分类:

        节点流:用于从/向一个特定IO设备中读/写数据的流

        处理流:对一个已经存在的流进行连接或封锁,通过封锁后的流来实现数据的读/写功能

2、流的体系结构

        在使用IO流时,如果内容是文本内容,则使用字符流,若内容是二进制内容,如图像,则使用字节流。

        Java的IO流体系如下:

三、字节流 

         字节流的最基本的两个抽象类是InputStream和OutputStream,这两个都是抽象类,不能进行实例化,所以必须用子类(如FileInputStream和FileOutputStream)来进行实例化。

1、InputStream

        InputStream字节输入流的方法:

        InputStream子类:

        读取文件的实例:(注意缓冲区的设置) 

public class stream {public static void main(String[] args){FileInputStream fin=null;try{fin = new FileInputStream("src/io/stream.java");byte[] bbuf=new byte[1024];             //缓冲区    int hasRead = 0;                       while((hasRead=fin.read(bbuf))>0)       //循环读取文件数据,read输出当前字节数System.out.println(new String(bbuf,0,hasRead));     //String构造函数,三个参数byte[],offset,length}catch(IOException e){e.printStackTrace();}finally{try{fin.close();}catch(IOException e){e.printStackTrace();}}}
}

2、OutputStream

        OutputStream字节输出流的方法:

        OutputStream的子类:

        写入文件的实例:

import java.io.*;
import java.util.Scanner;public class stream {public static void main(String[] args){File file=new File("src/io/1.txt");try{file.createNewFile();                //创建一个文件}catch(IOException e){e.printStackTrace();}Scanner sc=new Scanner(System.in);        FileOutputStream fout=null;try{fout=new FileOutputStream("src/io/1.txt");    //输出字节流System.out.println("请输入内容:");String str=sc.nextLine();                     //输入为Stringfout.write(str.getBytes());                   //转换为byte数组}catch(IOException e){e.printStackTrace();}finally{try{fout.close();sc.close();                               //关闭扫描流(很新颖)}catch(IOException e){e.printStackTrace();}}}
}

四、字符流

        字符流处理数据基本单元是字符,也就是char[]数组,而不是字节流的byte[]数组。

        字符流的两个基本流是字符输入流Reader和字符输出流Writer,这两个都是抽象类,不能进行实例化,可以使用FileReader和FileWriter来创建实例。

1、Reader

        Reader的子类:

        Reader方法:

        Reader实例:

        由于FileReader接口可以读文件,BufferedReader接口参数为Reader,FileReader只有read()方法,每次读一个字符,而BufferedReader存在新方法ReadLine()可以逐行读,所以构成了下面的嵌套格式。

public class stream2 {public static void main(String []args){BufferedReader br=null;try{br=new BufferedReader(new FileReader("src/io/stream3.java"));  //会引发FileNotFoundException,但该异常蕴含与IOExceptionString result=null;while((result=br.readLine())!=null){System.out.println(result);}}catch(IOException e){e.printStackTrace();}finally{try{br.close();        //关闭字符流}catch(Exception e){e.printStackTrace();}}}
}

2、Writer 

        Writer子类:

         Writer方法:

        Writer实例:

        文件写入字符流,可以直接用write()写入键盘输入的String变量,不需要嵌套。

import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;public class stream2 {public static void main(String []args){Scanner sc=new Scanner(System.in);FileWriter fw=null;try{fw=new FileWriter("src/io/1.txt");System.out.println("请输入内容: ");String str=sc.nextLine();fw.write(str);}catch(IOException e){e.printStackTrace();}finally{try{fw.close();sc.close();}catch(IOException e){e.printStackTrace();}}}
}

五、过滤流和转换流

1、过滤流

        过滤流用于对已有流进行连接和封装处理,分为过滤输入流FilterInputStream和过滤输出流FilterOutputStream,分别继承于InputStream和OutputStream。 

        过滤流可以参见字节流处理中的BufferedInputStream类。

2、转换流

        转换流就是将字节流和字符流之间相互转换。

        InputStreamReader:将字节输入流转换成字符输入流

        OutputStreamWriter:将字符输出流转换成字节输出流

六、序列化

1、对象序列化与反序列化

        对象序列化:将对象数据写入一个输出流的过程。(将代码转换成二进制格式)

        反序列化:从一个输入流中读取一个对象。(从二进制格式中读代码)

        对象序列化的两个特点:

(1)可以在分布式应用中使用,参数和返回值必须序列化

(2)可以循环保存每一个对象的数据。

        序列化接口:java.lang.Serializable接口,接口中没有任何方法,当一个类implements该接口,则该类为可序列化类,可序列化类可以进行对象序列化。

2、ObjectInputStream和ObjectOutputStream

        ObjectInputStream和ObjectOutputStream分别是InputStream和OutputStream的子类,通过对象输出流通过writeObject来写入序列化对象,对象输入流通过readObject来读取序列化对象。

        下面对象序列化实例:

        try括号内建立回收机制,当try...catch结束后,自动对其执行close。

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;public class filter {public static void main(String [] args){try(ObjectOutputStream obs=new ObjectOutputStream(new FileOutputStream("src/io/1.txt"))){Person person=new Person("张三",25);obs.writeObject(person);obs.flush();}catch(Exception e){e.printStackTrace();}}
}class Person implements Serializable{private int age;private String name;public Person(String name,int age){this.name=name;this.age=age;}public String toString(){return "姓名:"+this.name+",年龄:"+this.age;}
}

七、NIO 

        NIO类将文件或文件的一段区域映射到内存中,可以像访问内存一样访问文件。

        NIO中两个核心类:Buffer和Channel,Buffer本质上是一个数组,Channel类似于流传输,相比于输入输出流,提供了一个map()方法,将一块数据直接映射到内存。

1、Buffer

        Buffer类没有构造方法,而是通过静态方法获得Buffer对象。

static xxxBuffer allocate(int capacity) : 创建一个指令容量的xxxBuffer对象。(xxx代表数据类型如char)

         Buffer的四个重要方法:capacity(容量),limit(界限),position(位置),mark(标记)。

        capacity:最开始allocate设置的长度

        limit:初始化为capacity大小,当执行flip方法后,变为当前position大小,当执行clear方法后,再回到capacity大小

        position:初始化为0,当添加元素时,为添加元素所占总长度,不会因为后续获取靠前的数据而发生变化,因为Buffer类本质上是一个数组,当获取值后,不会影响数组变化

        mark:设置mark为当前position

        其他常用方法:

clear()将position设置为0,limit设置为capacity,丢弃标记
flip()将limit设置为当前position,position设置为0
rewind()将position设置为0,丢弃mark
reset()将position设置为以前的mark
get("2")将索引为2的元素获取,若为添加参数,则传入当前position的值
put("a")添加元素a

        测试代码:

import java.nio.CharBuffer;public class nioDemo {public static void main(String[] args){CharBuffer buff=CharBuffer.allocate(8);System.out.println(buff.capacity());                //输出8System.out.println(buff.limit());                   //输出0System.out.println(buff.position());                //输出0buff.put("a");buff.put("b");buff.put("c");System.out.println(buff.limit());                   //输出8System.out.println(buff.position());                //输出3System.out.println(buff.get(0));              //输出abuff.flip();                                        //此时limit=3,position=0System.out.println(buff.get());                     //输出abuff.clear();                                       //position=0,limit=8System.out.println(buff.limit());                   //输出8}
}

2、Channel

        Channel与Buffer的区别:

(1)Channel可以直接将指定文件部分或全部映射成Buffer

(2)程序不能直接访问Channel数据,Channel只能与Buffer交互。

参考书籍:《Java 8 基础应用与开发》QST青软实训编 

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

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

相关文章

用ASP.NET Core 2.1 建立规范的 REST API -- 翻页/排序/过滤等

本文所需的一些预备知识可以看这里: 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 和 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 (2) 准备项目建立Richardson成熟度2级的POST、GET、PUT、PATCH、DELETE的RESTful API请看这里: 用ASP.NET Core…

用ASP.NET Core 2.1 建立规范的 REST API -- HATEOAS

本文所需的一些预备知识可以看这里: 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 和 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 (2) 准备项目建立Richardson成熟度2级的POST、GET、PUT、PATCH、DELETE的RESTful API请看这里:用ASP.NET Core …

学习手记(2020/8/19~2021/3/19)

文章目录所有集合子集数量和结论证明枚举子集的方法最大匹配模的次数线性基卡特兰数树形dpTipTipTip斯特林数斐波那契幂前缀和hallhallhall定理阿巴阿巴1狄利克雷卷积常用式子组合数学恒等式竞赛图性质一些博弈模型基础反演二项式反演莫比乌斯反演欧拉反演子集反演min-max\text…

奶牛的交叉路(jzoj 1756)

奶牛的交叉路 题目大意&#xff1a; 有两个数轴&#xff0c;之间有n条线分别连接着两个数轴的点各一个&#xff0c;这些线可能会相交&#xff0c;问有多少条线没有和其他点相交 样例输入 4 -3 4 7 8 10 16 3 9样例输出 2数据范围限制 1<N<100000&#xff0c;-1…

.Net Core 环境下构建强大且易用的规则引擎

1. 引言1.1 为什么需要规则引擎在业务的早期时代&#xff0c;也许使用硬编码或者逻辑判断就可以满足要求。但随着业务的发展&#xff0c;越来越多的问题会暴露出来&#xff1a;逻辑复杂度带来的编码挑战&#xff0c;需求变更时改变逻辑可能会引起灾难重复性的需求必须可重用&am…

【最短路】【SPFA】单源最短路径 (luogu 3371)

单源最短路径 luogu 3371 题目大意&#xff1a; 求出一个点到其他点的最短路 原题&#xff1a; 题目背景 本题测试数据为随机数据&#xff0c;在考试中可能会出现构造数据让SPFA不通过&#xff0c;如有需要请移步 P4779。 题目描述 如题&#xff0c;给出一个有向图&…

在Windows 下如何使用 AspNetCore Api 和 consul

一、概念&#xff1a;什么是consul:Consul 是有多个组件组成的一个整体&#xff0c;作用和Eureka,Zookeeper相当&#xff0c;都是用来做服务的发现与治理。 Consul的特性&#xff1a;1、 服务的发现&#xff1a;consul可以把注册到其中的服务提供给使用者&#xff0c;也可以主动…

网络流及建模专题(下)

前言 不断更新中… 专题的(下)篇将介绍网络流的一些奇奇怪怪的应用和费用流有关的一些套路。 本专题暂时包含三道题&#xff1a; 洛谷P1251 餐巾计划问题: 费用流的基本应用 Trade Gym - 100212I: 使用网络流对图论中的边进行调整 codeforces 818G - Four Melodies: 费用…

CentOS 7.4 下 如何部署 AspNetCore 结合 consul

上篇我们讲到consul的概念&#xff0c;以及在WIN下如何使用&#xff1a; 在Windows 下如何使用 AspNetCore Api 和 consul步骤如下&#xff1a;1、安装虚拟机VM 2、下载安装 CentOS 7.4&#xff08;地址就不提供了&#xff09;这是安装示例&#xff1a; VM虚拟机安装CentOS 示例…

【SPFA】最优贸易(luogu 1073)

最优贸易 luogu 1073 题目大意&#xff1a; 有n个城市和m条线路连接着这些城市&#xff08;当编号为1时是有向&#xff0c;2时是无向&#xff09;&#xff0c;从1城市出发到n城市&#xff0c;每个城市都有固定的水晶球价格&#xff08;进价和售价一样&#xff09;&#xff0…

Razor Page Library:开发独立通用RPL(内嵌wwwroot资源文件夹)

Demo路径&#xff1a;https://github.com/yanshengjie/RPL.Demo1. IntroductionRazor Page Library 是ASP.NET Core 2.1引入的新类库项目&#xff0c;属于新特性之一&#xff0c;用于创建通用页面公用类库。也就意味着可以将多个Web项目中通用的Web页面提取出来&#xff0c;封装…

Problem H Rock Paper Scissors,FFT

题目 题目链接 题意 给出两段石头剪刀布的顺序SS和T" role="presentation" style="position: relative;">TT&#xff0c;其中TT要短一些,现在让你把T" role="presentation" style="position: relative;">TT往SS的…

.NET Core微服务之基于Ocelot实现API网关服务

一、啥是API网关&#xff1f;API 网关一般放到微服务的最前端&#xff0c;并且要让API 网关变成由应用所发起的每个请求的入口。这样就可以明显的简化客户端实现和微服务应用程序之间的沟通方式。以前的话&#xff0c;客户端不得不去请求微服务A&#xff08;假设为Customers&am…

[译]RabbitMQ教程C#版 - 发布订阅

先决条件本教程假定RabbitMQ已经安装&#xff0c;并运行在localhost标准端口&#xff08;5672&#xff09;。如果你使用不同的主机、端口或证书&#xff0c;则需要调整连接设置。从哪里获得帮助如果您在阅读本教程时遇到困难&#xff0c;可以通过邮件列表联系我们。1.发布/订阅…

用ASP.NET Core 2.1 建立规范的 REST API -- 缓存和并发

本文所需的一些预备知识可以看这里: 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 和 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 (2) 准备项目建立Richardson成熟度2级的POST、GET、PUT、PATCH、DELETE的RESTful API请看这里&#xff1a;用ASP.NET Core …

2017 SEERC Divide and Conquer 树上差分

题目 题目大意&#xff1a;给出两颗树的复合图(即这张图是由两颗树拼起来的)&#xff0c;询问最小割掉多少条边&#xff0c;可以使得图不联通&#xff0c;并输出方案数。 分析 我觉得这是一道很难的题目&#xff0c;因为比较难想&#xff0c;前提结论比较多。 首先我们需要…

青蛙跳荷叶

青蛙跳荷叶 题目大意&#xff1a; 有n个点&#xff0c;从1开始到跳完这些点&#xff0c;且每次的距离不能相等&#xff0c;一个点不能到多次 原题&#xff1a; 题目描述 从前&#xff0c;有一个小青蛙决定去荷叶上练习跳跃.现在有n个荷叶排成一排&#xff0c;小青蛙一开始…

基于 Consul 实现 MagicOnion(GRpc) 服务注册与发现

0.简介0.1 什么是 ConsulConsul是HashiCorp公司推出的开源工具&#xff0c;用于实现分布式系统的服务发现与配置。这里所谓的服务&#xff0c;不仅仅包括常用的 Api 这些服务&#xff0c;也包括软件开发过程当中所需要的诸如 Rpc、Redis、Mysql 等需要调用的资源。简而言之 Con…

【DFS】排排坐

排排坐 题目大意&#xff1a; 有n个方块&#xff0c;有一些是黑色&#xff0c;有一些是白色&#xff0c;可以点击一个方块使它和它旁边的方块反转颜色&#xff08;黑变白&#xff0c;白变黑&#xff09;&#xff0c;问最少要点多少次才能将方块 们 变成目标的方块们&#xff…

用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它

预备知识: 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 (2) 准备项目建立成熟度2级的 API请看这里&#xff1a;用ASP.NET Core 2.0 建立规范的 REST API -- GET 和 POST, 用ASP.NET Core 2.0 建立规范的 REST AP…