2017-11-05 17:48:17

Java中的IO流按数据类型分类分为两种,一是字节流,二是字符流。字符流的出现是为了简化文本数据的读入和写出操作。

如果操作的文件是文本文件,那么使用字符流会大大简化操作,但是如果什么都不知道,就用字节流。

  •  字节流

字节流的两个抽象基类是:InputStream

                 OutputStream

抽象类显然是无法实例化的,所以需要寻找相应的子类来进行操作。下面讨论两个很重要的字节输入输出流子类。

* FileOutputStream

FileOutputStream 用于写入诸如图像数据之类的原始字节的流。要写入字符流,请考虑使用 FileWriter

**构造方法

从Api中可以看出,既可以使用File类来初始化,也可以直接使用地址字符串来初始化。

如果文件不存在,会自动新建该文件。

**常用方法

import java.io.FileOutputStream;
import java.io.IOException; public class Demo1 {
public static void main(String[] args) throws IOException {
FileOutputStream file = new FileOutputStream("E:\\text.txt");
byte[] b = "Hello Spring.\r\n".getBytes();
file.write(b);
file.write("Hello World.".getBytes());
file.close();
}
}

换行符问题:在这里需要注意一个问题,就是换行符的问题。不同系统针对换行符的识别是不同的。

首先解释一下 \r:表示回车

       \n:表示换行

Windows系统里面,每行结尾是 回车+换行(CR+LF),即“\r\n”;
Unix系统里,每行结尾只有 换行CR,即“\n”;
Mac系统里,每行结尾是 回车CR 即'\r'。

高级记事本或者编辑器比如sublime里会自动识别不同的换行符,如果写的\n,在记事本中打开是不显示换行的,但是在sublime中会正常换行。

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; public class Demo1 {
public static void main(String[] args){
FileOutputStream file = null;
try{
file=new FileOutputStream("E:\\text.txt");
byte[] b = "Hello Spring.\n".getBytes();
file.write(b);
file.write("Hello World.".getBytes());}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
finally {
if(file!=null) {
try {
file.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

 * FileInputStream

FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader

**构造方法

**常用方法

如果因为已经到达文件末尾而没有更多的数据,则返回 -1

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; public class Demo1 {
public static void main(String[] args) throws IOException {
FileInputStream fin = new FileInputStream("E:\\text.txt");
FileOutputStream fout = new FileOutputStream("E:\\text2.txt");
byte[] b = new byte[5];
int len = 0;
while ((len = fin.read(b)) != -1) {
fout.write(b, 0, len);
}
fin.close();
fout.close();
}
}

返回值为当次读取到的字节数,如果到达文件末尾则返回-1。在写文件的时候,必须使用偏移法进行写入,否则会有覆盖问题。

一般一次读1024或者1024的整数倍,就是一次读1kb或者多kb。

 ==>显然的,在读写的时候如果使用数组的话,会大大提高效率,所以Java在设计的时候也考虑到了这个问题并提供了

字节缓冲区流:BufferedOutputStream,BufferedInputStream。

* BufferedOutputStream

BufferedOutputStream:该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。

**构造方法

构造方法可以指定缓冲区的大小,一般来说使用默认缓冲区大小就够了。

**常用方法

当然也可以直接写byte[] b,指的是把长度为len的字节数组都写入。

* BufferedInputStream

BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 markreset 方法的能力。在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。mark 操作记录输入流中的某个点,reset 操作使得在从包含的输入流中获取新字节之前,再次读取自最后一次 mark 操作后读取的所有字节。

**构造方法

**常用方法

使用Buffered缓冲流在使用的时候和基本的File流没有差异,不过在底层进行了优化,所以导致效率大大提高。

Java IO流-字节流的更多相关文章

  1. Java—IO流 字节流

    IO流(输入流.输出流),又分为字节流.字符流. 流是磁盘或其它外围设备中存储的数据的源点或终点. 输入流:程序从输入流读取数据源.数据源包括外界(键盘.文件.网络…),即是将数据源读入到程序的通信通 ...

  2. java IO流——字节流

    字节流主要操作byte类型数据,以byte数组为准,主要操作类有InputStream(字节输入流).OutputSteam(字节输出流)由于IputStream和OutputStream都是抽象类, ...

  3. java io流(字节流)复制文件

    java io流(字节流) 复制文件 //复制文件 //使用字节流 //复制文本文件用字符流,复制其它格式文件用字节流 import java.io.*; public class Index{ pu ...

  4. java IO之字节流和字符流-Reader和Writer以及实现文件复制拷贝

    接上一篇的字节流,以下主要介绍字符流.字符流和字节流的差别以及文件复制拷贝.在程序中一个字符等于两个字节.而一个汉字占俩个字节(一般有限面试会问:一个char是否能存下一个汉字,答案当然是能了,一个c ...

  5. Java:IO流与文件基础

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

  6. java IO流详解

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

  7. Java IO流学习总结

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

  8. Java IO流题库

    一.    填空题 Java IO流可以分为   节点流   和处理流两大类,其中前者处于IO操作的第一线,所有操作必须通过他们进行. 输入流的唯一目的是提供通往数据的通道,程序可以通过这个通道读取数 ...

  9. Java IO流总结

    Java IO流分类以及主要使用方式如下: IO流 |--字节流 |--字节输入流 InputStream: int read();//一次读取一个字节 int read(byte[] bys);// ...

随机推荐

  1. 几何+点与线段的位置关系+二分(POJ2318)

    TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10666   Accepted: 5128 Description ...

  2. 310实验室(七)OptimizationTemplateLibrary

    利用泛型编程思想,C++模板. 首先定义变量或者重新typedef variables: 模板中的变量:_TRandom.double  _TReal._TProblem::TDecision _TD ...

  3. JS拖拽事件

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. vue自定义过滤器的创建和使用

    1.简单介绍   过滤器的作用:实现数据的筛选.过滤.格式化.   过滤器的本质是一个有参数,有返回值的方法.   过滤器可以用在两个地方:双花括号插值和v-bind表达式(后者从2.1.0+开始支持 ...

  5. Android官方架构组件介绍之LiveData

    LiveData LiveData是一个用于持有数据并支持数据可被监听(观察).和传统的观察者模式中的被观察者不一样,LiveData是一个生命周期感知组件,因此观察者可以指定某一个LifeCycle ...

  6. Spring boot官方文档学习(一)

    个人说明:本文内容都是从为知笔记上复制过来的,样式难免走样,以后再修改吧.另外,本文可以看作官方文档的选择性的翻译(大部分),以及个人使用经验及问题. 其他说明:如果对Spring Boot没有概念, ...

  7. Oracle性能优化之Oracle里的统计信息

    一.什么是统计信息 oracle数据库里的统计信息是如下的一组数据:他们存储在数据字典里,且从多个维度描述了oracle数据库数据对象的详细信息. oracle数据库里的统计信息主要分为以下6种情况: ...

  8. mrbs - 初识

    一.mrbs mrbs:(meeting room booking system)会议室预订系统 二.效果 三.models from django.db import models # Create ...

  9. 【Linux】通过top语句可以查看压力测试的实时服务器状态。(可以通过百度Linux top查看相关内容)

    Linux实时查看服务器状态的两个语句 1.显示基本服务器监控状态语句如下:linux top 在这里输入 主要先看服务器负载高不高,高了后能否降下来,再看网络,io,数据库状态. 是有一个工具可以监 ...

  10. 新安装和已安装nginx如何添加未编译安装模块/补丁

    新安装和已安装nginx如何添加未编译安装模块/补丁 --http://www.apelearn.com/bbs/forum.php?mod=viewthread&tid=10485& ...