总结JAVA----IO流中的字节流
对于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流中的字节流的更多相关文章
- java.io包中的字节流—— FilterInputStream和FilterOutputStream
接着上篇文章,本篇继续说java.io包中的字节流.按照前篇文章所说,java.io包中的字节流中的类关系有用到GoF<设计模式>中的装饰者模式,而这正体现在FilterInputStre ...
- 揭开Java IO流中的flush()的神秘面纱
大家在使用Java IO流中OutputStream.PrintWriter --时,会经常用到它的flush()方法. 与在网络硬件中缓存一样,流还可以在软件中得到缓存,即直接在Java代码中缓存. ...
- Java IO流中的File类学习总结
一.File类概述 File类位于java.io包中,是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹. File类有多种重载的构造方法.File类保存文件或目录的各种 ...
- Java IO流中 File文件对象与Properties类(四)
File类 用来将文件或目录封装成对象 方便对文件或目录信息进行处理 File对象可以作为参数传递给流进行操作 File类常用方法 创建 booleancreateNewFile():创建新文件,如果 ...
- Java IO流中的flush()
通过BufferedOutputStream或BufferedWriter 链接到底层流上来实现.因此,在写 完数据时,flush就显得尤为重要. 例如: 上图中WEB服务器通过输出流向客户端响应了一 ...
- java io流中怎么在一个文本中追加字符串
1/ FileOutputStream(File file, boolean append)2/FileWriter(File file, boolean append) 不管哪一种IO都有 appe ...
- java Io流中FileInputStream和BufferedInputStream的速度比较
首先是对FileInputStream 加上 FileOutputStream 对文件拷贝的应用 我这里拷贝的是一个视频.当然,你们拷贝什么都可以,当文件越大时效果越明显 下面是对BufferedIn ...
- 【Java IO流】字节流和字符流详解
字节流和字符流 对于文件必然有读和写的操作,读和写就对应了输入和输出流,流又分成字节和字符流. 1.从对文件的操作来讲,有读和写的操作——也就是输入和输出. 2.从流的流向来讲,有输入和输出之分. 3 ...
- 【JAVA IO流之字符流】
一.概述. java对数据的操作是通过流的方式.java用于操作流的对象都在IO包中.流按照操作数据不同分为两种,字节流和字符流.流按照流向分为输入流,输出流. 输入输出的“入”和“出”是相当于内存来 ...
- Java IO流简单使用
Java IO流简单使用 也许是以前IO方面接触的比较少,我对于读和写的概念老是混淆. 趁着现在实习比较闲小结一下,我个人理解读和写都是针对程序,分别就是程序的输入和输出,或者叫读入写出. Java ...
随机推荐
- 正确的git开发流程
正确的git开发流程 第一步 在github中创建一个新的仓库,这时候项目是空的,而且只有一个master分支 第二步 第一个开发人员进来了,他在本地创建一个develop分支,并且提交到远程 git ...
- Exp2后门原理与实践 20164312马孝涛
实验内容 使用netcat获取主机操作Shell,cron启动 (0.5分) 使用socat获取主机操作Shell, 任务计划启动 (0.5分) 使用MSF meterpreter(或其他软件)生成可 ...
- 【干货】快速部署微软开源GPU管理利器: OpenPAI
[干货]快速部署微软开源GPU管理利器: OpenPAI 介绍 不管是机器学习的老手,还是入门的新人,都应该装备上尽可能强大的算力.除此之外,还要压榨出硬件的所有潜力来加快模型训练.OpenPAI作为 ...
- Activity 之使用
Activity 之使用 本文内容 1. 使用 Activity 显式简单界面 2. Activity 之间的跳转 2.1 startActivity 2.3 startActivityForResu ...
- [Abp vNext 源码分析] - 1. 框架启动流程分析
一.简要说明 本篇文章主要剖析与讲解 Abp vNext 在 Web API 项目下的启动流程,让大家了解整个 Abp vNext 框架是如何运作的.总的来说 ,Abp vNext 比起 ABP 框架 ...
- qml demo分析(rssnews-常见新闻布局)
一.效果展示 今儿来分析一篇常见的ui布局,完全使用qml编写,ui交互效果友好,如图1所示,是一个常见的客户端新闻展示效果,左侧是一个列表,右侧是新闻详情. 图1 新闻效果图 二.源码分析 首先先来 ...
- 高效并发JUC锁-砖石
JUC包的锁(可重入锁和读写锁) Lock是JAVA5增加的内容,在JUC(java.util.concurrent.locks)包下面,作者是并发大师Doug Lea.JUC包提供了很多封装的锁,包 ...
- 知识小罐头09(tomcat8启动源码分析 下)
初始化已经完成,现在就是启动这些组件,Tomcat中的start方法就是用于启动的,其实start的原理还是和上一篇说的初始化几乎一样!这里我就大概说一下,看几个比较关键的地方就行了. 前面的步骤就大 ...
- 聊聊在AOP模式下的缓存方案
面向方法的数据集缓存 使用了autofac做为ioc容器,使用Autofac.Extras.DynamicProxy2作为方法拦截器,缓存面向方法,直接在方法上添加CachingAttribute特性 ...
- SpringBoot实用小知识之Maven中dependencys和dependencymanagement区别
利用pom管理引用包时,如果是单项目的话就直接在dependencies引用了,若有一个大工程项目里面包含多个子模块,则为了所有项目模块包的版本统一和好管理,则需要用到dependencyManage ...