对于IO流中字节流的总结

字节流的概念

由于应用程序,经常需要和文件打交道,所以Inputstream专门提供了读写文件的子类:FileInputStream和FileOutputStream类,如果程序对于文件的操作较为简单,就比如说只是顺序的读写文件,那么就可以使用字节流进行操作.并且我们都知道,所有文件的最底层数据类型都是字节,所以说,字节流的应用范围是十分广的,当然,它也有相应的缺点,只能处理简单的数据文本,一旦数据多了,其处理速度慢的弊端也就显现了出来.

子父类关系

通过超级父类InputStream延伸出的很多派系,并且一些派系完美的解决了,字节流速度慢的问题(字节缓冲流)

编码方式

查阅了挺久资料的,发现在编码方式这块,由于我还没有接触计算机原理这门课,所以对于这块的概念十分的模糊,从昨天到今天也查阅了许多资料,但还是无法很系统的整理出一些真正有用的东西,所以对于编码方式这里,我会在以后认真的总结一番。

其与字符流的不同

1.

字节流传输的最基本单位是字节

字符流传输的最基本单位是字符

2.

编码方式不同

3.

字符流在传输方面上,由于计算机的传输本质都是字节,而一个字符由多个字节组成,转成字节之前先要去查表转成字节,所以传输时有时候会使用缓冲区。

字节流传输时不会用到缓冲区,是通过直接访问IO设备的方式来完成传输。

4.

字节流适用于图片,文本,视频等等格式的数据.

字符流适用于文本,并且最好是中文文本,处理速度超快.

字节流的输入\输出流

构造方法(1)

构造方法(2)

构造方法(3)

这三种构造方法都要求在对象创建之前便给出文件名。

对于一个文件进行的输入输出操作的代码

import java.io.*;
import java.util.Scanner;
/*
* 该类用于做一个文件字节流的例子
*/
public class Demo1 {
public static void main(String[] args) throws IOException{
File file=function();
choice(file);
}
public static File function() throws IOException{ //该方法用于创建一个文件对象
File file=new File("C:\\Users\\Lenovo\\Desktop\\Demo.txt");
//创建一个文件对象
if(!file.exists()) {
file.createNewFile(); //若文件不存在则创建一个文本文件
}
return file;
}
public static void choice(File file) throws IOException{ //该类用于进行选择输入方式(是覆盖还是从文件末尾写)
int a = 0;
System.out.println("a==");
Scanner sc=new Scanner(System.in);
a=sc.nextInt();
switch(a) {
case 1:function1(file);function3(file);break; //这是覆盖式写入
case 2:function2(file);function3(file);break; //这是从文件末尾写入
default:System.out.println("无该索引");
}
sc.close();
}
public static void function1(File file) throws IOException{
FileOutputStream fos=new FileOutputStream(file);
System.out.println("请输入您想要写入的信息");
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
byte[] b=s.getBytes(); //将字符串转换为字节数组
fos.write(b);
fos.close();
sc.close();
}
public static void function2(File file) throws IOException{ //该方法是从末尾开始写
FileOutputStream fos=new FileOutputStream(file,true);
System.out.println("请输入您想要写入的信息");
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
byte[] b=s.getBytes();
fos.write(b);
fos.close();
sc.close();
}
public static void function3(File file) throws IOException{
FileInputStream fis=new FileInputStream(file);
byte[] b=new byte[(int) file.length()];
//运用File类关于文件属性的方法,但是返回值是long型数据,需要强转。
fis.read(b);
System.out.println(new String(b));
fis.close();
}
}

第一次键入a=1,输入"啊哈哈"

第二次键入a=1,输入"嘿嘿嘿”   会发现文件中只剩下"嘿嘿嘿”

第三次键入a=1,输入"啊哈哈"

第二次键入a=2,输入"嘿嘿嘿”   会发现文件中是"啊哈哈嘿嘿嘿”

字节缓冲流

BufferedInputStream&BufferedOutputStream

这两种类为IO提供了带缓冲区的操作,一般打开文件进行写入或读取操作时,都会加上缓冲,这样提高了IO的性能。

对于IO的抽象理解

如果我们要将一缸水转到另一缸水中

FileOutputStream&FileInputStream相当于把水一滴一滴的转移

DataOutputStream&DateaInputStream相当于把水一瓢一瓢的转移

BufferedOutputStream&BufferdeInputStream相当于先把水全部放入一缸水中,然后在将这一缸水倒入目标缸中。

所以说带缓冲区的字节缓冲流是很好使的。

我们用字节缓冲流代码实现一下文件的复制

import java.io.*;

/*
* 用字节缓冲流完成对于文件的复制
*/
public class Dmeo2 {
public static void main(String[] args) throws IOException{
byte[] b=function();
function1(b);
}
public static byte[] function() throws IOException {
InputStream is=new FileInputStream("C:\\Users\\Lenovo\\Desktop\\Demo.txt");
BufferedInputStream bis=new BufferedInputStream(is); //构造方法参数为InputStream类型
byte[] b=new byte["C:\\Users\\Lenovo\\Desktop\\Demo.txt".length()];
bis.read(b); //将信息转换为字节数组
bis.close();
return b; //将字节数组返回
}
public static void function1(byte[] b) throws IOException {
OutputStream os=new FileOutputStream("C:\\Users\\Lenovo\\Desktop\\Demo1.txt");
BufferedOutputStream bos=new BufferedOutputStream(os);
bos.write(b);
bos.flush(); //此处一定要记得刷新缓冲区,这样信息才能流入文件
bos.close(); //若是我们手动关闭的话,系统会帮我们自动刷新缓冲区
/*所以说fluse()方法与close()方法写一个就行,但这只是理论上的
* 但是为了程序的可读性还是都写好一点
*/
}
}

这里的Demo文件是我们上个代码也就是字节流中所创建的文件。

字节数组流

字节数组流在功能方面属于字节流,属于直接作用于目标设备的一种流类.经常而言我们都是针对文件的操作,然后带上缓冲的节点流进行处理,但有时候为了提升效率,我们发现频繁的读写文件并不是太好,那么于是出现了字节数组流,即存放在内存中,因此又称之为内存流.(这里是直接copy别人的).其实也就是将我们的目标放在了缓冲区之上,而不再是文件了.

ByteOtputArrayStream(字节数组输出流)

构造方法:

第一个是有初始长度但可以增加,第二个是自己设置长度

这里我感觉我们不可以将其理解为数组,总感觉它和集合真的好像,因为他的属性单位也是以size()方法来查看的,并且他和集合一样长度是可变的。

特殊方法:

这个无效close最先真的搞得我一头雾水,后来才反应过来这里我们操作的对象是缓冲区,缓冲区是无法关闭的,或者说关闭了会出很大的问题,所以这里他应该是无效的,并且作为子类,我们从父类中所拿到的方法并不全是有用的,毕竟子类与父类是不同的两个单独存在的个体。

关于缓冲区属性的一个方法

这两个方法都是write方法,这里的处理方式其实和父类中的write方法基本一致吧,只是目标有所变化。

ByteInputArrayStream\字节输入流

构造方法

这里最关键的是buf的选择,作为输入流我们若是想从缓冲区得到数据的话,buf应该是输入流.toByteArray()方法得到的数组,在我看来输入流就代表着那一块我们正存放数据的缓冲区,这样转换成数组合情合理

完成一个简单读写操作

 import java.io.*;
public class Demo3 {
public static void main(String[] args) throws IOException{
function();
}
public static void function() throws IOException{ //该方法用于输出流的存入
ByteArrayOutputStream bos=new ByteArrayOutputStream(); //使用默认构造方法
String s="我是哈哈哈";
byte[] b=s.getBytes();
bos.write(b); //这里不要像上文给出的write(byte[] b,int off,int len)因为这样的话我们还要
//计算一下字节个数,很麻烦,还容易出错,当然也有其它方法知道准确字节数但是代码量会多
function1(bos.size(),bos);
}
public static void function1(int a,ByteArrayOutputStream bos) throws IOException{
ByteArrayInputStream bis=new ByteArrayInputStream(bos.toByteArray());
//如上文所说,以输出流所转化成的数组为参数创建一个对象
byte[] b=new byte[a];
bis.read(b); //把字节存到b数组中
System.out.println(new String(b));
}
}

字节数据流

DataInputStream和DataOutputStream类创建的对象称为数据输入流和数据输出流.这两个流是很有用的流,他们允许程序按着及其无关的的风格读取JAVA原始数据.也就是说,当读取一个数值时,不必再关心这个数值应该是多少个字节(而且有些数据类型long,double数据类型真的很难转成字节),它们属于处理流,即程序通过一个间接流类去调用节点流类,以达到更加灵活方便地读写各种类型的数据,这个间接流类就是处理流。

构造方法

也就是说他们的参数是节点流。并且这里我们可以很好的利用多态的概念,FileInputStream。。。。等等都可以作为参数

读写方法writexxx,readxxx。

代码完成简单的读取操作

import java.io.*;

public class Demo4 {
static String file="C:\\Users\\Lenovo\\Desktop\\李xx.txt";
public static void main(String[] args) throws IOException{
function();
function1();
}
public static void function() throws IOException{ //该方法用于存 DataOutputStream dos=new DataOutputStream(new FileOutputStream(Demo4.file));
dos.writeInt(1);
dos.writeInt(2);
dos.writeInt(3);
dos.writeInt(4);
dos.writeUTF("你是真滴6");
dos.close();
}
public static void function1() throws IOException{
DataInputStream dis=new DataInputStream(new FileInputStream(file));
System.out.println(dis.readInt());
System.out.println(dis.readInt());
System.out.println(dis.readInt());
System.out.println(dis.readInt());
System.out.println(dis.readUTF());
}
}

但是我发现数据流中读取时指针的跳转过于笨拙,也就是说我们必须知道下个数据类型是啥,才能将其准确读取出来,并且前一个读不出来的话,后一个也是无法读取的。

总结JAVA----IO流中的字节流的更多相关文章

  1. java.io包中的字节流—— FilterInputStream和FilterOutputStream

    接着上篇文章,本篇继续说java.io包中的字节流.按照前篇文章所说,java.io包中的字节流中的类关系有用到GoF<设计模式>中的装饰者模式,而这正体现在FilterInputStre ...

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

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

  3. Java IO流中的File类学习总结

    一.File类概述 File类位于java.io包中,是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹. File类有多种重载的构造方法.File类保存文件或目录的各种 ...

  4. Java IO流中 File文件对象与Properties类(四)

    File类 用来将文件或目录封装成对象 方便对文件或目录信息进行处理 File对象可以作为参数传递给流进行操作 File类常用方法 创建 booleancreateNewFile():创建新文件,如果 ...

  5. Java IO流中的flush()

    通过BufferedOutputStream或BufferedWriter 链接到底层流上来实现.因此,在写 完数据时,flush就显得尤为重要. 例如: 上图中WEB服务器通过输出流向客户端响应了一 ...

  6. java io流中怎么在一个文本中追加字符串

    1/ FileOutputStream(File file, boolean append)2/FileWriter(File file, boolean append) 不管哪一种IO都有 appe ...

  7. java Io流中FileInputStream和BufferedInputStream的速度比较

    首先是对FileInputStream 加上 FileOutputStream 对文件拷贝的应用 我这里拷贝的是一个视频.当然,你们拷贝什么都可以,当文件越大时效果越明显 下面是对BufferedIn ...

  8. 【Java IO流】字节流和字符流详解

    字节流和字符流 对于文件必然有读和写的操作,读和写就对应了输入和输出流,流又分成字节和字符流. 1.从对文件的操作来讲,有读和写的操作——也就是输入和输出. 2.从流的流向来讲,有输入和输出之分. 3 ...

  9. 【JAVA IO流之字符流】

    一.概述. java对数据的操作是通过流的方式.java用于操作流的对象都在IO包中.流按照操作数据不同分为两种,字节流和字符流.流按照流向分为输入流,输出流. 输入输出的“入”和“出”是相当于内存来 ...

  10. Java IO流简单使用

    Java IO流简单使用 也许是以前IO方面接触的比较少,我对于读和写的概念老是混淆. 趁着现在实习比较闲小结一下,我个人理解读和写都是针对程序,分别就是程序的输入和输出,或者叫读入写出. Java ...

随机推荐

  1. Agent Job代理 执行SSIS Package

    摘要: 在使用Agent Job时, 运行SSIS包的Run as账号,必须有SSIS中connection manager的连接权限. 如果没有连接权限,可以用创建proxy账号,并确保proxy账 ...

  2. python3 变量理解 解释器理解 常量理解 用户交互理解 逻辑运算

    先来条NLP再说...... 九,每人都已经具备使自己快乐的资源 每一个人都有过成功快乐的体验,也即是说有使自己快乐的能力. 人类只用了大脑能力极少部分,提升大脑的运用,很多新的突破便会出现. 运用大 ...

  3. Gaussian Mixture Models and the EM algorithm汇总

    Gaussian Mixture Models and the EM algorithm汇总 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. 漫谈 ...

  4. Linux集群时间同步方法

    方法1.ntp  平滑同步时间 (一)确认ntp的安装 1)确认是否已安装ntp [命令] rpm –qa | grep ntp 若只有ntpdate而未见ntp,则需删除原有ntpdate.如: n ...

  5. Java三种方式实现栈和队列

    栈:LIFO(后进先出) 队列:FIFO(先进先出) 1.栈:LIFO(后进先出) 1.1.栈的顺序存储结构实现: /** * 基于数组实现的顺序栈 * @param <E> */ pub ...

  6. SQL 高级查询(层次化查询,递归)

    SQL 高级查询 前面我们写了一下 SQL 的极简入门,今天来说点高级查询.没看到的朋友可以点击下面链接查看. 1 小时 SQL 极速入门(一) 1 小时 SQL 极速入门(二) 1 小时 SQL 极 ...

  7. Ubuntu 安装phpMyAdmin + 配置nginx

    0x01 安装phpMyAdmin ``` sudo apt-get install phpmyadmin ``` 0x02 添加链接 ``` sudo ln -s /usr/share/phpMyA ...

  8. Pycharm使用教程(四)-安装python依赖包(非常详细,非常实用)

    简介 在做python开发时,需要很多依赖包,如果已经安装pip,安装依赖包,可以通过命令行:没有安装的,也可以通过PyCharm安装. 具体安装步骤 1.在File->Setting,如图: ...

  9. 【重学计算机】机组D8章:输入输出系统

    1. 输入输出系统概述 组成:外设.接口.总线.管理软件 基本功能 完成计算机内外的信息传递 保证CPU正确选择输出设备 利用缓冲等,实现主机与外设的速度匹配 特点:异步性.实时性.设备无关性 输入过 ...

  10. AppDir【创建缓存目录】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 创建缓存目录 public static String APP_CACHE = "";// /storage/e ...