java io流有四大家族分别是:

1.InputStream(字节输入流) 2.OutputStream(字节输入出流)3.Reader(字符输入流)4.Writer(字符输出流)四个类都是抽象类

0x01字节流的输入和输出

0x1FileInputStream

class FileInputStreamTest{
public static void main(String[] args) {
FileInputStream fis=null;
try {
fis =new FileInputStream("C:\\Users\\root\\untitled\\src\\com\\zhonglin\\www\\TEset");//绝对路径
while (true){
int data=fis.read();//read会依次向下读没有字节的时候就会返回-1
if (data==-1){
break;
}System.out.println(data);
} } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis!=null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
} }
}
}

提高效率使用byet和while循环数组去读取字节

class FileInputStream_test02{
public static void main(String[] args) {
FileInputStream fis=null;
try {
fis=new FileInputStream("C:\\Users\\root\\untitled\\src\\com\\zhonglin\\www\\TEset");
byte[] bytes=new byte[ 4];
int flag=0;
while ((flag=fis.read(bytes))!=-1){
System.out.println(new String(bytes,0,flag)); }
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
} }
}
}
}

available()方法用法:

1.可以获取文件还可以读取的字节数量

2.可以使用read(对象.available)一次性读取完整个文件夹,但是不适用与大文件,因为byte数组不能太大

skip()方法:

1.跳过几个字节不读取skip(int a)

class FileInputStream_test03{
public static void main(String[] args) {
FileInputStream fileInputStream=null;
try {
fileInputStream=new FileInputStream("C:\\Users\\xx\\untitled\\src\\com\\zhonglin\\www\\TEset");
int flag=fileInputStream.read();
System.out.println("剩下多少个字节key读"+fileInputStream.available());//剩下多少个字节key读
byte[] bytes=new byte[fileInputStream.available()];//可以这样一次读取完不用循环
fileInputStream.read(bytes);
//不适用与大文件byte数组不能太大
System.out.println(new String(bytes));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
} }
}
}

0x2FileOutputStream

writre()方法:

1.在构造方法的后面加一个true代表文件追加,在文件后面继续写入

fileOutputStream=new FileOutputStream("myfile",true);

2.写入完成后一定要flush。

fileOutputStream.flush();

3.String对象转成byte数组类型

String str1="我是以中国人";

 byte[] bytes1=str1.getBytes(StandardCharsets.UTF_8);
fileOutputStream.write(bytes1,0,bytes1.length);`
fileOutputStream.flush();

看一下代码

class FileOutputStream_test02{
public static void main(String[] args) {
FileOutputStream fileOutputStream=null;
try {
fileOutputStream=new FileOutputStream("myfile",true);//在后面加一个ture代表追加写入
byte[] bytes={88,66,52,99};
fileOutputStream.write(bytes,0,2);//从0到2
fileOutputStream.flush();//写完一定要刷新 } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace(); } }
} }
}
小结
------InputStream------
public void close() :关闭此输入流并释放与此流相关联的任何系统资源。
public abstract int read() : 从输入流读取数据的下一个字节。
public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
------OutputStream-----
public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。(写完一定要执行)
public void write(byte[] b) :将 b.length字节从指定的字节数组写入此输出流。
public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输
出到此输出流。
public abstract void write(int b) :将指定的字节输出流。

0x02字符流的输入和输出

1.FileReader

a.大部分跟前面的差不多需要把原来的byte数组变成char数组

b.public void close() :关闭此流并释放与此流相关联的任何系统资源。

c.public int read() : 从输入流读取一个字符。

d.public int read(char[] cbuf) : 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。

char[] chars=new char[4];
int flag=0;
while ((flag=fileReader.read())!=0);
System.out.println(new String(chars,0,flag));

2.FileWriter

a.flush :刷新缓冲区,流对象可以继续使用。

b.close :先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。

c.大部分共性相同

void write(int c) 写入单个字符。
void write(char[] cbuf) 写入字符数组。
abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分,off数组的开始索引,len
写的字符个数。
void write(String str) 写入字符串。
void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个
数。
void flush() 刷新该流的缓冲。
void close() 关闭此流,但要先刷新它。

0x03缓冲流的输入和输出

1.使用这个流的时候不需要自定义char/byte数组,此流自带。

2.外部包装的流叫包装流(处理流),传入的流叫节点流。

3.字节缓冲流: BufferedInputStream , BufferedOutputStream

字符缓冲流: BufferedReader , BufferedWriter

4.看一下字节缓冲构造方法:

public BufferedInputStream(InputStream in) :创建一个 新的缓冲输入流。
public BufferedOutputStream(OutputStream out) : 创建一个新的缓冲输出流。

5.字符缓冲流:

public BufferedReader(Reader in) :创建一个 新的缓冲输入流。
public BufferedWriter(Writer out) : 创建一个新的缓冲输出流。

需要参数Reader但是Reader是完全抽象的只能去寻找它的子类

    public static void main(String[] args) throws IOException {
public static void main(String[] args) throws IOException {
BufferedReader bis = new BufferedReader(new FileReader("a.txt"));
String b = null ;
while ((b = bis.readLine())!=null){//读取一行
System.out.println(b);
}
bis.close();
} }

0x04其他流的使用

0x1数据流

1.DataOutputStram和DataInputStream,数据流对应的读写只能对应这两个

2。write(数据类型)()会把对象的数据和类型一并传过去

3.可以通过read(数据类型)()等方法读取固定类型数据

class DataOutputStream_Test{
private static DataInputStream ios; public static void main(String[] args) throws Exception {
DataOutputStream dos=new DataOutputStream(new FileOutputStream("C:\\Users\\钟林\\untitled\\myfile"));
DataInputStream ios=new DataInputStream(new FileInputStream("C:\\Users\\钟林\\untitled\\myfile"));
byte b=100;
int a=100;
dos.writeByte(a);//会把数据和类型一起传过去
dos.writeByte(b);
ios.readByte();
dos.flush();
dos.close();
}
}

0x05File类

1.File类不属于io流,不能完成文件数据的读写。

2.File对象带包的是:文件目录路径名抽象的表示形式。

3.常用方法

public String getAbsolutePath() :返回此File的绝对路径名字符串。

public String getPath() :将此File转换为路径名字符串。

public String getName() :返回由此File表示的文件或目录的名称。

public long length() :返回由此File表示的文件的长度。

public boolean exists() :此File表示的文件或目录是否实际存在。

public boolean isDirectory() :此File表示的是否为目录。

public boolean isFile() :此File表示的是否为文件。

public boolean createNewFile() :当前仅当具有该名称的文件尚不存在时,创建一个新的空文件。

public boolean delete() :删除由此File表示的文件或目录。

public boolean mkdir() :创建由此File表示的目录。//这个可以创建父目录

public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。

public long lastModified():返回最后一次修改时间

4.看一下简单的代码

public class File_Test {
public static void main(String[] args) throws Exception {
File file=new File("C:\\Users\\xx\\untitled\\myfile");
System.out.println(file.exists());//判断是否存在。返回一个boolen值
if (file.exists()){
file.createNewFile();//文件的方式新建
file.mkdir();//以目录的方式存在
file.getName();//获取名字
file.isFile();
file.isDirectory();
long haomiao=file.lastModified();//最后一次修改时间.从1970年到现在的毫秒数
Date time=new Date(haomiao);//这样就可以转化成日期
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
String stdtiemSTR= simpleDateFormat.format(time);
System.out.println(stdtiemSTR); }
}
}

0x06序列化和反序列化

1.java提供了一种对象序列化的机制,用一个字节序列表示一个对象,该字节包含对象的数据、对象的类型、对象的存储属性。字节序列写出到文件后,相当于可以持久报错了一个对象信息,这过程叫做序列化

而反过来,将存储在文件的字节序列从文件中读取出来,重构对象,重新用来创建对象,这步骤叫做反序列化。

2.public ObjectOutputStream(OutputStream out): 创建一个指定InputStream的ObjectOutputStream。

3.public ObjectInputStream(InputStream in) : 创建一个指定InputStream的ObjectInputStream。

4.要实现序列化必须要去实现一个接口Serializable,implements Serializable,它只是一个标志接口里面没有存在任何

看一下代码(序列化)

class ObjectOutputStream_Test implements Serializable{

    @Override
public String toString() {
return super.toString();
} int id;
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name; }
public ObjectOutputStream_Test(int id,String name){
this.id=id;
this.name=name;
} public static void main(String[] args) throws Exception {
ObjectOutputStream objectOutputStream=new ObjectOutputStream(new FileOutputStream("XULIEHUAt"));
ObjectOutputStream_Test obj=new ObjectOutputStream_Test(10,"zl");
objectOutputStream.writeObject(obj);
objectOutputStream.flush();
objectOutputStream.close();
}
}

看一下反序列化

readObject()方法反序列化回来

 public static void main(String[] args) {
Method e = null;
try {
FileInputStream fis = new FileInputStream("a.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
e = (Method) ois.readObject();
ois.close();
fis.close();
} catch (IOException | ClassNotFoundException ioException) {
ioException.printStackTrace();
}
System.out.println("name="+e.name);
System.out.println("address ="+e.address);
System.out.println("age="+e.age);
}

反序列化失败——InvalidClassException

当你序列化class后class里面的代码发生了改变,源码改动以后需要重新编译,编译以后变成了全新的字节码文件。

并且class文件再次运行的时候,java虚拟机生成的序列化版本号也会发生改变

Serializable 接口给需要序列化的类,提供了一个序列版本号。 serialVersionUID 该版本号的目的在于验证序

列化的对象和对应类是否版本匹配。

我们可以给它一个固定不变的序列号private static final long serialVersionUID = 1L;

代码

public class Employee implements java.io.Serializable {
// 加入序列版本号
private static final long serialVersionUID = 1L;
public String name;
public String address;
// 添加新的属性 ,重新编译, 可以反序列化,该属性赋为默认值.
public int eid;
}
}

0x07总结

1.FileoutputStream/FileInputStream:字节的方式输入和输出

2.FileReade/FileWriter:字节的方式输入输出

3.字节缓冲流: BufferedInputStream , BufferedOutputStream

4.字符缓冲流: BufferedReader , BufferedWriter

io流主要应用在各种脚本的开发列如,一个目录爬行要去使用字典文件,还可以用来进行文件加密。后面可以深入研究一下序列化漏洞

java学习之IO流的更多相关文章

  1. java学习之IO流(学习之旅,一)

    个人在学习IO流的时候看到如下所示java 流类图结构的时候,我的感想是,这么多··处于蒙的状态. Java流类图结构 这么多,没有分类不好学,那我们就慢慢一口一口的吃,这样每天学习一点就好了,其实很 ...

  2. java学习笔记——IO流部分

    IO流常用的有:字符流.字节流.缓冲流.序列化.RandomAccessFile类等,以上列出的都是开发中比较常用的. 1.字节流: 字节流包含:FileInputStream/FileOutputS ...

  3. Java 学习笔记 IO流与File操作

    可能你只想简单的使用,暂时不想了解太多的知识,那么请看这里,了解一下如何读文件,写文件 读文件示例代码 File file = new File("D:\\test\\t.txt" ...

  4. Java学习 · 初识 IO流

    IO流   1. 原理与概念 a)     流 i.           流动,流向 ii.           从一端移动到另一端 源头到目的地 iii.           抽象.动态概念,是一连 ...

  5. java学习笔记 --- IO流小结

    IO流  |--字节流    |--字节输入流     InputStream      int read():一次读取一个字节      int read(byte[] bys):一次读取一个字节数 ...

  6. Java学习:IO流

    IO流 1.IO流 用于处理设备上的数据. 设备:硬盘,内存,键盘录入. 2. IO有具体的分类: 根据处理的数据类型不同:字节流和字符流. 根据流向不同:输入流和输出流. 字符流的由来: 因为文件编 ...

  7. java学习笔记--IO流

    第十二章大纲: I/O input/output 输入/输出 一.创建文件,借助File类来实现 file.createNewFile() : 创建文件 file.exists() : 判断文件是否存 ...

  8. Java学习之IO流及网络编程

    一.字节 1.1字节输入流(java.io.InputStream) ​ 此抽象类是表示字节输入流的所有类的超类 1.1.1定义了所有子类共性的方法: ​ int read() 从输入流中读取数据的下 ...

  9. Java学习之IO流总结

    ---恢复内容开始--- 流是用来读写数据的,java有一个类叫File,它封装的是文件的文件名,只是内存里面的一个对象,真正的文件是在硬盘上的一块区间,在这个文件里面存放着各种各样的数据,我们想读文 ...

随机推荐

  1. 【java】学习路径27-HashSet、TreeSet,HashMap

    学习路径20-27的所有源代码都可以在此下载 https://www.aliyundrive.com/s/cg8jTRbg6vy HashSet.TreeSet中,Set表示集合,特性在于:无序的.不 ...

  2. [SDR] GNU Radio 系列教程(二) —— 绘制第一个信号分析流程图

    目录 1.前言 2.启动 GNU Radio 3.新增块 4.运行 本文视频 参考链接 1.前言 本文将介绍如何在 GNU Radio 中创建和运行第一个流程图. 2.启动 GNU Radio GNU ...

  3. 十一章 Kubernetes的服务发现插件--coredns

    1.前言 简单来说,服务发现就是服务(应用)之间相互定位的过程: 服务发现并非云计算时代独有的,传统的单体架构时代也会用到,以下应用场景更加需要服务发现: 服务(应用)的动态性强: 服务(应用)更新发 ...

  4. KingbaseES R6 通过脚本构建集群案例

      案例说明: KingbaseES V8R6部署一般可采用图形化方式快速部署,但在生产一线,有的服务器系统未启用图形化环境,所以对于KingbaseES V8R6的集群需采用手工字符界面方式部署,本 ...

  5. 头文件与main函数

    头文件 1.为什么要使用头文件? 程序如戏 程序中有很多元素(std::cout, system), 都是一个个演员 但是他们之间都互不认识, 但是却要一起合作, 强行编译, 就会导致错误! 得预先介 ...

  6. JS 模块化 - 02 Common JS 模块化规范

    1 Common JS 介绍 Common JS 是模块化规范之一.每个文件都是一个作用域,文件里面定义的变量/函数都是私有的,对其他模块不可见.Common JS 规范在 Node 端和浏览器端有不 ...

  7. docker的cmd命令详解-前后台理解

    CMD 指令的格式和 RUN 相似,也是两种格式: shell 格式:CMD <命令> exec 格式:CMD ["可执行文件", "参数1", & ...

  8. 7.prometheus监控多个MySQL实例

    mysqld_exporter集中部署 集中部署,就是说我们将所有的mysqld_exporter部署在同一台服务器上,在这台服务器上对mysqld_exporter进行统一的管理,下面介绍一下集中部 ...

  9. 创建Grafana Dashboard

    输入表达式,获取数据 但是考虑到多台主机,需要添加变量来选择不同主机,从而出现相应的图表 点击右上角齿轮一样的图标,这个是设置 通过在prometheus界面查询可知,可以设置的变量有两个 考虑到这俩 ...

  10. 某云负载均衡获取客户端真实IP的问题

    某云负载均衡真实IP的问题,我们这边已经遇到过两次了.而且每次和售后沟通的时候都大费周折,主要是要给售后说明白目前文档的获取真实IP是有问题的,他们觉得文档上说明的肯定没问题,售后要是不明白,他们不会 ...