Day16 IO流
流的概念和作用
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
Java流类图结构:

Stream流的聚合操作
1.末端方法;都是一次性的使用,流就会关闭,不能再用此流了。
2.中间方法;会返回一个新的流对象,继续调用其他的聚合方法操作。
public class TestStream1 {
public static void main(String[] args) {
//存整数 生产者模式 思想
//返回 一个 流对象
IntStream stream = IntStream.builder().add().add().add().add().build();
// System.out.println(stream.max().getAsInt());//末端
// IntStream stream1 = IntStream.builder().add(11).add(22).add(33).add(44).build();
// System.out.println(stream1.min().getAsInt());
// System.out.println(stream.min().getAsInt());
// System.out.println(stream.sum());
// System.out.println(stream.average().getAsDouble());
// System.out.println(stream.count());
//是否 所有的 数据 都 满足条件,都满足 true,否则不成立
/* System.out.println(stream.allMatch(new IntPredicate() {
@Override
public boolean test(int value) {
// TODO Auto-generated method stub
return value > 10;
}
}));*/
// System.out.println(stream.allMatch(v-> v > 10));
//只要有一个元素满足条件 就 成立 true
// System.out.println(stream.anyMatch(v-> v > 22));
//中间方法
// System.out.println(stream.filter(v-> v > 22).count());
stream.filter(v->v>).forEach(System.out::println);
}
}
IO流
File类
File类主要用来获取文件(或目录)本身的一些信息,如文件的名字,不涉及文件的读写操作。
常用方法
对文件的操作
public class TestFile {
public static void main(String[] args) throws IOException {
// File
//文件 :
File f1 = new File("d:/data");
File f = new File(f1,"x.txt");
// File f = new File("d:/data","x.txt");
// File f = new File("d:\\data\\x.txt");
// File f = new File("./x.txt");
System.out.println(f.exists());
//新建文件
f.createNewFile();//
//判断文件是否存在
System.out.println(f.exists());
//文件名字
System.out.println(f.getName());
//文件的路径:根据指定的 文件路径不同显示不同,可以显示 绝对的也可以显示相对的
System.out.println(f.getPath());
//绝对路径
System.out.println(f.getAbsolutePath());
//父路径
System.out.println(f.getParent());
//文件 是否 可读,可写
System.out.println(f.canRead());
System.out.println(f.canWrite());
//判断 是否是文件
System.out.println(f.isFile());
//最后修改的时间
long time = f.lastModified();
System.out.println(time);
//格式化
//DateFormat -> SimpleDateFormat
System.out.println(DateFormat.getDateInstance().format(time));
//文件的长度:文件内容的字节数
long len = f.length();//
System.out.println(len);
//删除文件
f.delete();
System.out.println(f.exists());
}
}
对目录的操作
public class TestFile1 {
public static void main(String[] args) {
// File目录
File f = new File("d:/data");
// File f = new File("d:/data2/data3");
System.out.println(f.exists());
//是否 是目录
System.out.println(f.isDirectory());
//建立目录
// f.mkdir();
//建立目录 包括 父目录
// f.mkdirs();
//获得 目录下 的 子目录 和文件的 名称 的数组
String [] str1 = f.list();
Arrays.stream(str1).forEach(System.out::println);
//FilenameFilter文件名过滤器
String [] str2 = f.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
// 把扩展名 是 java的过滤出来
return name.endsWith("java");
}
});
String [] str3 = f.list((d,name)->name.endsWith("java"));
System.out.println("------------------------");
Arrays.stream(str2).forEach(System.out::println);
System.out.println("------------------------");
//-----------------------------------------------------
File[] fl1 = f.listFiles();
for(File ff:fl1) {
if(ff.isFile()) {
System.out.println(ff.getName());
}else {
System.out.println(ff.getPath());
}
}
//FileFilter过滤器
File[] fl2 = f.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
//把扩展名 是 java的过滤出来
return pathname.getName().endsWith("java");
}
});
System.out.println("------------------------");
for(File ff:fl2) {
if(ff.isFile()) {
System.out.println(ff.getName());
}else {
System.out.println(ff.getPath());
}
}
}
}
流的分类
序列化是写,反序列化是读
按照流的数据类型:分为字节流和字符流
按照方向:输入和输出
按照功能:节点流和处理流
节点流:直接对数据源(文件)操作。
处理流(过滤流,包装流):套接(包装)在节点流之上的,提供更丰富的功能或提高效率。
字节流
字节流由2个抽象类定义:
InputStream:所有字节输入流的父类
int read():从输入流中读取一个字节,到达文件尾返回-1
void close():关闭此输入流并释放与该留关联的所有系统资源
OutputStream:所有字节输出流的父类
abstract void write(int):将指定的字节写入此输出流
void close():关闭此输出流并释放与该留关联的所有系统资源
文件流
FileInputStream
read():读一字节,到文件末尾返回-1
read(byte[]): 返回读到的字节数
read(,,) :(存入的字节数组,存入的起始位置,存入几个字节)
public static void main(String[] args) throws IOException {
// FileInputStream 文件 输入流
//1 创建流对象
File f = new File("d:/data/a.txt");
FileInputStream fin = new FileInputStream(f);
//把字节流转换成字符流
//转换字符流
// InputStreamReader ir = new InputStreamReader(fin);
//2读
/* int temp ;
while((temp = fin.read())!= -1) {
System.out.print((char)temp);
}*/
// byte [] b = new byte[(int)f.length()];
byte [] b = new byte[fin.available()];//获得流中的字节数
//把文件的内容 读入 到 b中
// fin.read(b);
// (存入的字节数组,存入的起始位置,存入几个字节)
fin.read(b, , );// ab
String s = new String(b,"gbk");
System.out.println(s);
//3.关
fin.close();
/*ir.close();*/
// ir.close();
}
FileOutputStream
write(int ):写一字节
write(byte[]):写一个字节数组
write(b, 2, 2):(数组,起始位置,字节数)
public static void main(String[] args) throws IOException {
// FileOutputStream 写 输出
//String s = "hello"存到 d:/data/b.txt
//1 true追加 ,false覆盖 吗,默认 false
FileOutputStream fout = new FileOutputStream("d:/data/b.txt",false);
//2写
String s = "hello";
byte [] b = s.getBytes();
// fout.write(b[0]);//写一字节
// fout.write(b);//写一个字节数组 ,
// (数组,起始位置,字节数)
fout.write(b, , );
//3.关
fout.close();
}
缓冲流
BufferedInputStream和BufferedOutputStream,默认8192字节,提供了缓冲区,提高效率
public class TestFileInputOutputStream {
public static void main(String[] args) {
// 复制图片
/* //1 。创建对象
FileInputStream fin = new FileInputStream("d:/data/aoteman.jpg");
FileOutputStream fout = new FileOutputStream("d:/data/aotemannew.jpg");
BufferedInputStream bfin = new BufferedInputStream(fin);//缓冲流 提供了 板车 8192字节
BufferedOutputStream bfout = new BufferedOutputStream(fout);// 提供了汽车 8192字节
//2读和写
int temp;
while((temp = bfin.read())!=-1) {
bfout.write(temp);
}
bfout.flush();//强制写入
//3
bfin.close();
bfout.close();*/
//----------------------------------------------------
FileInputStream fin = null;
FileOutputStream fout = null;
BufferedInputStream bfin = null;
BufferedOutputStream bfout = null;
try {
fin = new FileInputStream("d:/data/aoteman.jpg");
fout = new FileOutputStream("d:/data/aotemannew.jpg");
bfin = new BufferedInputStream(fin);//缓冲流 提供了 板车 8192字节
bfout = new BufferedOutputStream(fout);// 提供了汽车 8192字节
int temp;
while((temp = bfin.read())!=-) {
bfout.write(temp);
}
bfout.flush();//强制写入
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(bfin != null) {
bfin.close();
}
if(bfout != null) {
bfout.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
数据流
DataInputStream和DataOutputStream
提供了 使用 Java的不同数据类型 的方式 读和写。
public class TestDateOutputStream {
public static void main(String[] args) throws Exception {
// DataOutputStream数据流
//-------------写--------------------------
//1
// DataOutputStream dout = new DataOutputStream(new FileOutputStream("d:/data/stu.txt"));
FileOutputStream fout = new FileOutputStream("d:/data/stu.txt");
DataOutputStream dout = new DataOutputStream(fout);
//2.写
int [] no = {,,};
String [] name = {"aa","bb","cc"};
for(int i = ; i < no.length; i++) {
dout.writeInt(no[i]);
dout.writeUTF(name[i]);
}
//3.
dout.close();
//---------------读-------------------------
FileInputStream fin = new FileInputStream("d:/data/stu.txt");
DataInputStream din = new DataInputStream(fin);
for(int i = ; i < no.length; i++) {
System.out.println(din.readInt());
System.out.println(din.readUTF());
}
din.close();
}
}
对象流
ObjectInputStream和ObjectOutputStream
永久性的存储对象,需要实现Serializable接口
序列化:把对象以二进制的形式存储起来。
反序列化:把对象以二进制流的形式从文件中还原
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable; class Student implements Serializable{ /**
* 字节码文件中存储的那个版本号, 不显示指定,系统会自动随机一个
*/
private static final long serialVersionUID = 1L;
private int no;
private String name;
private int age;
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} }
public class TestObjectStream {
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
// 创建对象
Student guojing = new Student();
guojing.setNo();
guojing.setName("郭靖");
//序列化 把对象 以二进制流 的形式存储起来。-------------------------------------------------------
//
/*// ObjectOutputStream obj = new ObjectOutputStream(new FileOutputStream("d:/data/obj.txt"));
FileOutputStream fout = new FileOutputStream("d:/data/obj.txt");
ObjectOutputStream obj = new ObjectOutputStream(fout);
//2写
obj.writeObject(guojing);
//3.
obj.close();*/
//反序列化 把对象 以二进制流的形式 从文件中还原-----------------------------------------------------
//
FileInputStream fin = new FileInputStream("d:/data/obj.txt");
ObjectInputStream objin = new ObjectInputStream(fin);
//2读
Student stu = (Student)objin.readObject();
System.out.println(stu.getNo()+","+stu.getName());
//3.
objin.close(); } }
打印输出字节流
PrintStream
public class TestPrintStream {
public static void main(String[] args) throws IOException {
/*// TODO Auto-generated method stub
System.out.println("hello");
System.err.println("abc");*/
//PrintStream
//把读到的文件 的内容 在控制台上打印输出
//System.out
//
FileInputStream fin = new FileInputStream("d:/data/a.txt");
//2读
byte [] b = new byte[fin.available()];
fin.read(b);
//3.
fin.close();
//-----------------打印到控制台------------------------------
//System.out控制台输出 System.in控制台输入
PrintStream print = new PrintStream(System.out);
print.println(new String(b,"gbk"));
print.close();
}
}
字符流
抽象父类
Reader
Writer
子类:
1.文件字符流(节点流)
FileReader
FileWriter
public class TestReader1 {
public static void main(String[] args) throws IOException {
// 逆序写入
//读-----------------------------
File f = new File("d:/data/a.txt");
FileReader fr = new FileReader(f);
int temp;
StringBuffer sf = new StringBuffer();
while((temp = fr.read())!= -) {
sf.append((char)temp);//连接
}
fr.close();
//写------------------------------
FileWriter fw = new FileWriter("d:/data/b.txt");
//反转
String s = sf.reverse().toString();
fw.write(s);//写入
fw.close();
}
}
2.字符缓冲流
BufferedReader
BufferedWriter
public class TestReader {
public static void main(String[] args) throws IOException {
// FileReader------------读-------------------------
//
FileReader fr = new FileReader("d:/data/a.txt");
BufferedReader bfr = new BufferedReader(fr);
//2读
String s = null;
while((s = bfr.readLine())!= null) {
System.out.println(s);
}
/*int temp ;
while((temp = fr.read())!= -1) {
System.out.print((char)temp);
}*/
//3.
fr.close();
//FileWriter---------------写----------------------------
/* FileWriter fw = new FileWriter("d:/data/b.txt");
String s = "hello";
fw.write(s);
fw.close();*/
}
}
3.打印输出流
PrintWriter
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter; public class TestPrintWriter { public static void main(String[] args) {
// PrintWriter
/* PrintWriter pw = new PrintWriter("d:/data/num.txt");
for(int i = 1; i <= 10; i++) {
// System.out.println(i);
pw.println("数字:"+i);
}
pw.close();*/
//----------------循环写入内容------------------------
//1
// System.in
/* BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter("d:/data/namenew.txt");
String s;
while(true) {
s = br.readLine();//读一行
if(s.equals("q")) {
break;
}
pw.println(s);
}
br.close();
pw.close();
*/
//自动资源释放
try(BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter("d:/data/namenew.txt");){ String s;
while(true) {
s = br.readLine();//读一行
if(s.equals("q")) {
break;
}
pw.println(s);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} }
Day16 IO流的更多相关文章
- Java基础之IO流
很长时间都没有更新了,最近在补充JavaSE的一些细节部分 关于IO流的一些总结 首先要介绍的是File类,File类用于对文件和目录的一些操作 1.创建文件CreateNewFile() 2.对文件 ...
- Java中IO流,输入输出流概述与总结
总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入 ...
- Java:IO流与文件基础
Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...
- java IO流详解
流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- IO流总结
IO流的作用:用于设备和设备之间的数据传输. IO流的概念:流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象. IO流的分类: 按照操作数据的类型分为两种: 字节流和字符流. 按 ...
- IO流
流的概念和作用 学习JavaIO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特 ...
- Java IO流学习总结
Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- 揭开Java IO流中的flush()的神秘面纱
大家在使用Java IO流中OutputStream.PrintWriter --时,会经常用到它的flush()方法. 与在网络硬件中缓存一样,流还可以在软件中得到缓存,即直接在Java代码中缓存. ...
- java IO流 之 其他流
一.内存操作流(ByteArrayInputStream.ByteArrayOutputStream) (一). public class ByteArrayInputStream extends ...
随机推荐
- 【原】Nginx搭建FTP服务器的细节问题
关于文件服务器很多实现方法,比如采用阿里的分布式文件系统FastDFS,以及自己内部搭建FTP服务器,这里记录一下关于nginx搭建FTP文件系统流程. ftp服务器搭建的步骤网上也是很多,这里贴一下 ...
- 浅谈一致性哈希(My转)
一致性哈希(Consistent hashing)算法是由 MIT 的Karger 等人与1997年在一篇学术论文(<Consistent hashing and random trees: d ...
- Java 接口和多态
接口 1.1 接口的概述 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样 ...
- 专访周金可:我们更倾向于Greenplum来解决数据倾斜的问题
周金可,就职于听云,维护MySQL和GreenPlum的正常运行,以及调研适合听云业务场景的数据库技术方案. 听云周金可 9月24日,周金可将参加在北京举办的线下活动,并做主题为<GreenPl ...
- solidity 语法学习
基于 cryptozombies.io ZombieFactory pragma solidity ^0.4.19; contract ZombieFactory { // 事件, web3.js 可 ...
- Metinfo 5.x 管理员密码重置漏洞
前言 在先知看到了一篇分析该漏洞的文章,复现分析一下,漏洞还是比较有趣的. 正文 首先知道是 管理员密码重置时出现的问题,于是抓包,定位到相关的php文件. 首先包含了 ../include/comm ...
- shiro web 集成
集成方法 shiro与web集成,主要是通过配置一个ShiroFilter拦截所有URL,其中ShiroFilter类似于SpringMVC的前端控制器,是所有请求入口点,负责根据配置(如ini配置文 ...
- 你写的什么垃圾代码让Vsync命令不能及时处理呢?(2)
接上篇 1.TraceView Traceview看起来复杂,其实很简单: 上部分图中,X代表时间消耗,Y轴代表各个线程中的方法,且使用了不同颜色表示.面积越款,时间越长. 下部分为分析面板,分析面板 ...
- Typescript 基础知识
Typescript 就是 Javascript 的超集,所以首先你要知道 Javascript 基础知识 类型注解 类型注解在TypeScript中是记录函数或变量约束的简便方法. // 布尔值 l ...
- 如何将同一 VNET 下的虚拟机从经典部署模型迁移到 Azure Resource Manager
本文内容 适用场景 解决方案 适用场景 用户拥有多个云服务但是在同一个 VNET 下,希望将这些虚拟机从经典部署模型(以下简称:ASM)迁移到 Azure Resource Manager(以下简称: ...