对于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. 正确的git开发流程

    正确的git开发流程 第一步 在github中创建一个新的仓库,这时候项目是空的,而且只有一个master分支 第二步 第一个开发人员进来了,他在本地创建一个develop分支,并且提交到远程 git ...

  2. Exp2后门原理与实践 20164312马孝涛

    实验内容 使用netcat获取主机操作Shell,cron启动 (0.5分) 使用socat获取主机操作Shell, 任务计划启动 (0.5分) 使用MSF meterpreter(或其他软件)生成可 ...

  3. 【干货】快速部署微软开源GPU管理利器: OpenPAI

    [干货]快速部署微软开源GPU管理利器: OpenPAI 介绍 不管是机器学习的老手,还是入门的新人,都应该装备上尽可能强大的算力.除此之外,还要压榨出硬件的所有潜力来加快模型训练.OpenPAI作为 ...

  4. Activity 之使用

    Activity 之使用 本文内容 1. 使用 Activity 显式简单界面 2. Activity 之间的跳转 2.1 startActivity 2.3 startActivityForResu ...

  5. [Abp vNext 源码分析] - 1. 框架启动流程分析

    一.简要说明 本篇文章主要剖析与讲解 Abp vNext 在 Web API 项目下的启动流程,让大家了解整个 Abp vNext 框架是如何运作的.总的来说 ,Abp vNext 比起 ABP 框架 ...

  6. qml demo分析(rssnews-常见新闻布局)

    一.效果展示 今儿来分析一篇常见的ui布局,完全使用qml编写,ui交互效果友好,如图1所示,是一个常见的客户端新闻展示效果,左侧是一个列表,右侧是新闻详情. 图1 新闻效果图 二.源码分析 首先先来 ...

  7. 高效并发JUC锁-砖石

    JUC包的锁(可重入锁和读写锁) Lock是JAVA5增加的内容,在JUC(java.util.concurrent.locks)包下面,作者是并发大师Doug Lea.JUC包提供了很多封装的锁,包 ...

  8. 知识小罐头09(tomcat8启动源码分析 下)

    初始化已经完成,现在就是启动这些组件,Tomcat中的start方法就是用于启动的,其实start的原理还是和上一篇说的初始化几乎一样!这里我就大概说一下,看几个比较关键的地方就行了. 前面的步骤就大 ...

  9. 聊聊在AOP模式下的缓存方案

    面向方法的数据集缓存 使用了autofac做为ioc容器,使用Autofac.Extras.DynamicProxy2作为方法拦截器,缓存面向方法,直接在方法上添加CachingAttribute特性 ...

  10. SpringBoot实用小知识之Maven中dependencys和dependencymanagement区别

    利用pom管理引用包时,如果是单项目的话就直接在dependencies引用了,若有一个大工程项目里面包含多个子模块,则为了所有项目模块包的版本统一和好管理,则需要用到dependencyManage ...