一、IO流简介及分类

1、IO流简介

IO流: 简单理解数据从一个地方流向另外一个地方

2、IO流分类

按照数据流动的方向 分为  输入流和输出流

按照数据流动的单位分为   字节流和字符流

二、四大抽象流(都是抽象类)

1、FileInputStream(是InputStream接口的子类)

①构造方法

FileInputStream(String name); 根据指定的路径名创建字节输入流对象

FileInputStream(File file);

②注意:以上路径不存在,它会直接抛出异常

③read方法

int read(); 读取一个字节,返回的是ASCII值

int read(byte[] bytes);  读取多个字节,它把读取的字节放到bytes数组中,返回值返回的是读取的个数

④注意:以上方法,如果读取完毕之后都会返回-1

⑤完整代码:

FileInputStream fileInputStream = new FileInputStream(name);

byte[] bytes = new byte[10];

StringBuilder sb = new StringBuilder();

while(fileInputStream.read(bytes)!=-1){

sb.append(new String(bytes));

}

从上面这段代码我们可以看出,出现很多重复的字符

解决方式: 读多少,就取多少

new String(bytes,0,len);

改变以上代码

FileInputStream fileInputStream = new FileInputStream(name);

byte[] bytes = new byte[10];

StringBuilder sb = new StringBuilder();

int len;

while((len = fileInputStream.read(bytes))!=-1){

sb.append(new String(bytes,0,len));

}

fileInputStream.close();

以上代码解决了格式不正确问题!!

2、FileOutputStream

构造方法:

FileOutPutStream(String name); 以指定的路径创建字节输出流对象

FileOutPutStream(String name,boolean append);       append:表示是否在之前的基础上追加数据

FileOutPutStream(File file);

FileOutPutStream(File file,boolean append);

如果路径不存在,直接报错,如果路径存在,文件自动创建

重要方法:

void  write(int num);// 以ASCII进行输出

void  write(byte[] bytes); 一次性输出多个字节

void write(byte[] bytes,int offset,int len);

3、FileReader  

构造方法:

FileReader(String name); 根据指定的路径名创建字节输入流对象

FileReader(File file);

重要方法:

int read();每次只读取一个字符

int read(char[] chars);  一次读取多个字符

写个完整代码

FileReader f = new FileReader(name);

char[] chars = new char[10];

int len;

StringBuilder sb = new StringBuilder();

while((len = f.read(chars))!=-1){

sb.append(new String(chars,0,len));//只能解决格式问题

}

f.close();

4、FileWriter

FileWriter(String name); 以指定的路径创建字符输出流对象

FileWriter(String name,boolean append);       append:表示是否在之前的基础上追加数据

FileWriter(File file);

FileWriter(File file,boolean append);

重要方法:

void write(int num);

void write(char[] chars);

void write(String str);

当它输出数据的时候,它并不是直接输出到磁盘上,它是输出到内存中(缓存中),必 须要通过flush或者close方法,它会把内存里面的数据清空,同步到磁盘里面

flush与close的区别:

flush,清空内存里面的数据同步到磁盘里面,可以继续使用io流

close,在关闭流资源之前,它会先去调用flush的方法,io流一旦关闭之后,就不能继续使用

5、转换流

InputStreamReader(InputStream in);//把字节流转为字符流

OutputStreamWriter(OutputStream o)//把字符流转为字节流

三、乱码问题

为什么以上代码依然会出现中文乱码问题:原因它是把一个字掰成2半了

解决方式: 使用字符流来读取纯文本内容

出现中文乱码的三种情况:

1.编码和解码不一致

2.把一个中文字符掰成2半

3.字符编码集不支持中文   ---》ISO-8859-1  它眼里,所有的字符都是1个字节

编码: 把字符串转为字节数组

解码:把字节数组转为字符串

怎么去正确使用编码和解码呢?

统一都使用UTF-8的编码集, 你编码是以什么字符集编的,就以什么字符集进行解码

GBK--中文---2字节

UTF-8--中文--3个字节

IO流2的更多相关文章

  1. Java基础之IO流

    很长时间都没有更新了,最近在补充JavaSE的一些细节部分 关于IO流的一些总结 首先要介绍的是File类,File类用于对文件和目录的一些操作 1.创建文件CreateNewFile() 2.对文件 ...

  2. Java中IO流,输入输出流概述与总结

    总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入 ...

  3. Java:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...

  4. java IO流详解

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  5. IO流总结

    IO流的作用:用于设备和设备之间的数据传输. IO流的概念:流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象. IO流的分类:  按照操作数据的类型分为两种: 字节流和字符流.  按 ...

  6. IO流

    流的概念和作用 学习JavaIO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特 ...

  7. Java IO流学习总结

    Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  8. 揭开Java IO流中的flush()的神秘面纱

    大家在使用Java IO流中OutputStream.PrintWriter --时,会经常用到它的flush()方法. 与在网络硬件中缓存一样,流还可以在软件中得到缓存,即直接在Java代码中缓存. ...

  9. java IO流 之 其他流

    一.内存操作流(ByteArrayInputStream.ByteArrayOutputStream) (一).   public class ByteArrayInputStream extends ...

  10. java IO流 之 字符流

    字符是我们能读懂的一些文字和符号,但在计算机中存储的却是我们看不懂的byte 字节,那这就存在关于字符编码解码的问题.所以在学习Io流的字符流前我们先了解些关于编码问题. 一.字符集与字符编码 1.什 ...

随机推荐

  1. Python解析xml文档实战案例

    xml文档 <?xml version="1.0" ?> <!DOCTYPE PubmedArticleSet PUBLIC "-//NLM//DTD ...

  2. I/O模型系列之二:Unix的五种网络I/O模型

    1. Unix的五种I/O模型 从上往下:阻塞程度(高-----低)I/O效率  (低-----高) 阻塞I/O(Blocking I/O):传统的IO模型 非阻塞I/O(Non-Blocking I ...

  3. DirectX11 With Windows SDK--00 目录

    前言 (更新于 2019/4/10) 从第一次接触DirectX 11到现在已经有将近两年的时间了.还记得前年暑假被要求学习DirectX 11,在用龙书的源码配置项目运行环境的时候都花了好几天的时间 ...

  4. H5_0007:使用base64做为背景图片

    page { overflow:hidden; position:fixed; /* background-image:url('http://p0d5ombx1.bkt.clouddn.com/lo ...

  5. C++常见问题解答博客合集

    1 关于宏 https://blog.csdn.net/hanchaoman/article/details/8809951

  6. hibernate自定义校验Valid

    步骤: 1.定义注解: import javax.validation.Constraint; import javax.validation.Payload; import java.lang.an ...

  7. 2018-2019-2 20165234 《网络对抗技术》 Exp5 MSF基础应用

    实验五 MSF基础应用 实验内容 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 1.一个主动攻击实践,ms08_067(成功) 2. 一个针对浏览器 ...

  8. Web项目容器集成ActiveMQ & SpringBoot整合ActiveMQ

    集成tomcat就是随项目启动而启动tomcat,最简单的方法就是监听器监听容器创建之后以Broker的方式启动ActiveMQ. 1.web项目中Broker启动的方式进行集成 在这里采用Liste ...

  9. 手写代码 - java.util.List 相关

    1-ArrayList 访问元素,不能使用ArrayList[0]形式!!!! 必须使用ArrayList.get(0);

  10. day13 闭包及装饰器

    """ 今日内容: 1.函数的嵌套定义及必包 2.global 与 nonlocal 关键字 3.开放封闭原则及装饰器 """ " ...