Java流类图结构:

流的概念和作用:

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。及数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将抽象为各种类,方便更直观的进行数据操作。

IO流的分类:

  • 根据处理数据类型的不同分为:字符流和字节流
  • 根据数据流向不同分为:输入流和输出流

字符流和字节流:

字符流的由来:因为数据编码的不同,而又了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查指定的码表。

字节流和字符流的区别:

  • 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节
  • 处理对象不同:字节流能处理所有类型(如图片,avi等),而字符流只能处理字符类型的数据。
  • 字节流:一次读入或读出8位二进制。
  • 字符流:一次读入或读出是16为进制。

设备上的数据无论是图片或者视频,文字,它们都以二进制存储的。二进制的最终都是以一个8位为数据单元进行体现,所以计算机中的最小数据单元就是字节。意味着,字节流可以处理设备上的所有数据,所以字节流一样可以处理字符数据。

结论:只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流。

输入流和输出流:

输入流只能进行读操作,输出流只能进行写操作,程序中需要根据待传输数据的不同特征而使用不同的流

输入字节流InputStream:

  • InputStream是所有的输入字节流的父类,他是一个抽象类。
  • ByteArrayInputStream,StringBufferInputStream,FileInputStream三种基本的介质流,它们分别从Byte 数组StringBuffer、和本地文件中读取数据。
  • PipedInputStream 是从与其它线程共用的管道中读取数据,与Piped 相关的知识后续单独介绍。
  • ObjectInputStream 和所有FilterInputStream 的子类都是装饰流(装饰器模式的主角)。

InputStream示例:输入文件内容

//流:作用:打通硬盘和内存的通道    创建了一个和硬盘上文件绑定的文件流
FileInputStream fis=new FileInputStream("E:\\S2230班级.txt");
//创建缓存区大小是1k 承载1k数据的一个缓冲区 大家:就是内存中的一块区域 。主要是在内存和硬盘之间做数据交换的临时存储区
byte[] bytes=new byte[1024];
int data = 0;
//注释 :有效字节数
StringBuffer sb=new StringBuffer();
//由于一个文件的本身物理大小一定要远远大于缓冲区的大小。就是循环读取。
//无论是那种语言,咱们读取的时候,都用read(byte[]方案) 将一部分数据通过fis流的通道放入缓冲区
//data:read()返回的是本次读取到缓存区中的有效字节数
//拿有效字节数和 -1对比 ,如果是-1 证明 已经读取到了流的末尾 ,循环自动退出,不进行下一次读取操作了
while((data=fis.read(bytes))!=-1){ //文件没有读取完毕,下次需要继续读取
//没读取一次,将读取到的字节内容,转成字符串
//bytes ------> String
String temp=new String(bytes,0,data); //读取到缓存区中的有效字节数,转成字符串,因为用户眼睛只能 看到字符串
sb.append(temp);
System.out.println("=====有效字节数====="+data);
}
System.out.println(sb.toString());
//读取或者写入完成,一定要关流。。。底层已经做了很多的预置工作。
fis.close();//文件 数据库 稀缺资源,别忘了关

输出字节流 OutputStream:

  • OutputStream 是所有的输出字节流的父类,它是一个抽象类。
  • ByteArrayOutputStream、FileOutputStream 是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。
  • PipedOutputStream 是向与其它线程共用的管道中写入数据。
  • ObjectOutputStream 和所有FilterOutputStream 的子类都是装饰流。

总结:

  • 输入流:InputStream或者Reader:从文件中读到程序中;
  • 输出流:OutputStream或者Writer:从程序中输出到文件中

FileOutputStream示例:输出文件

    public static void main(String[] args) {
try {
writeDataToDisk();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static void writeDataToDisk() throws Exception {
FileOutputStream fis=new FileOutputStream("F:\\晚自习.txt");
String temp="今天下雨!!!!!!!!!!!!";
byte[] bs=temp.getBytes();
fis.write(bs);
fis.close();
System.out.println("成功");
} }

字符输入流Reader类:    Reader类是读取字符流抽象类 我们需要通过子类来实例化使用它

Reader示例:

    public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
FileReader reader=new FileReader("E:\\1.txt");
char[] cs=new char[1024];
int data=0;
/*
* Vector 线程安全的ArrayList是线程安全的 ---Vector
* 不要以为集合本身是安全的,你用这个集合存储的数据就一定能保证线程安全
* 自己控制
*/
StringBuffer sBuffer=new StringBuffer();
while ((data=reader.read(cs))!=-1) {
String temp=new String(cs, 0, data);
sBuffer.append(temp); }
System.out.println(sBuffer.toString());
reader.close();
} }

字符输入BufferedReader类:

BufferedReader是缓冲字符输入流,继承于Reader,BufferedReader的作用是为其他字符输入流添加一些缓冲功能。

public static void main(String[] args) throws Exception {
Reader reader=new FileReader("F:\\晚自习.txt");
BufferedReader vReader=new BufferedReader(reader);
String linr=vReader.readLine();

字符输出流Writer类:

Writer是一个字符流,它是一个抽象类,所以要使用它,也必须通过其子类来实例化它后才能使用它

示例1:

//覆盖
FileWriter writer=new FileWriter("F:\\晚自习.txt");
writer.write("=====今天下雨!!!=====");
writer.close();
System.out.println("成功");

示例2:

  Writer writer=new FileWriter("F:\\晚自习.txt");
BufferedWriter be=new BufferedWriter(writer);
be.write("\r\n我是第三行");
be.newLine();//换行
be.write("第四行");
be.close();
System.out.println("成功");

使用字节流类DataInputStream,DataOutputStream读二进制文件:

示例:

    public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
InputStream stream=new FileInputStream("F:\\jhkj.png");
DataInputStream dStream=new DataInputStream(stream); OutputStream oStream1=new FileOutputStream("E:\\集合框架.png");
DataOutputStream dStream2=new DataOutputStream(oStream1);
byte[] in=new byte[1024];
int data=0;
while ((data=dStream.read(in))!=-1) {
dStream2.write(in,0,data); }
dStream2.close();
oStream1.close();
dStream.close();
stream.close();
System.out.println("adsadasdas");
} }

补充序例化and反序例化:

序例化:

public static void main(String[] args) throws IOException {
OutputStream os=new FileOutputStream("save.bin");
ObjectOutputStream ob=new ObjectOutputStream(os);
List<Book> list=new ArrayList<Book>();
Book b1=new Book("大话设计模式", 52);
Book b2=new Book("大话数据结构", 62);
list.add(b1);
list.add(b2); ob.writeObject(list);
System.out.println("serialize success");
} }

反序例化:

    public static void main(String[] args) throws IOException, ClassNotFoundException {
InputStream iStream=new FileInputStream("save.bin");
ObjectInputStream oStream=new ObjectInputStream(iStream);
List<Book> list=(List<Book>)oStream.readObject();
for (Book book : list) {
System.out.println(book.getName());
}
} }

JavaFile I/O的更多相关文章

  1. JAVA- File类

    File类是IO包中唯一代表磁盘文件本身的对象.File类定义了一些与一台无关的方法来操作文件,可以通过调用File类中的方法,实现创建.修改.删除文件等功能.File类的对象主要用来获取文件本身的一 ...

  2. javaFile循环列出指定目录下的所有文件(源代码)

    package javatest.basic22; import java.io.File; import java.io.IOException; public class FileTest { p ...

  3. JavaFile、递归、字节流、字符流整理

    File 1.1                File类的构造函数 当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作. 当把持久设备上的数据读取到内存中的这个动作称为输入 ...

  4. JavaFile类和递归

    八.File类和递归 8.1 概述 java.io.File 类时文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和产出等操作. 8.2 构造方法 public File(String pa ...

  5. Java-File类获取目录下文件名-遍历目录file.listFiles

    package com.hxzy.IOSer;import java.io.*;/*File 类获取功能 * List * ListFile * */public class Demo06 { pub ...

  6. java-File类-字节流

    一 File 1.1 递归子目录 获取所有子目录中的内容 import java.io.File; public class GetAllFiles { /** * @param args */ pu ...

  7. JavaFile I/O流

    Java 流(Stream).文件(File)和IO Java.io 包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io 包中的流支持很多种格式,比如:基本类 ...

  8. java-file类 hei

    File类 /* java.io.File类 文件和目录轮径的抽象形式 java把电脑种的文件和文件夹,封装为一个file类,我们可以使用file类对文件和文件夹进行曹祖 使用File类的方法 创建一 ...

  9. Android注解使用之通过annotationProcessor注解生成代码实现自己的ButterKnife框架

    前言: Annotation注解在Android的开发中的使用越来越普遍,例如EventBus.ButterKnife.Dagger2等,之前使用注解的时候需要利用反射机制势必影响到运行效率及性能,直 ...

随机推荐

  1. javax.websocket.DeploymentException: Multiple Endpoints may not be deployed to the same path [/websocket/{sid}] : existing endpoint was class com.sanyi.qibaobusiness.framework.webSocket.WebSocketServe

    报错: javax.websocket.DeploymentException: Multiple Endpoints may not be deployed to the same path [/w ...

  2. JN_0004:轻松解码类似eval(function(p,a,c,k,e,d){}))的JavaScript代码

    百度访问统计代码JavaScript源码:红色加粗部分将是要修改的地方.eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"&qu ...

  3. 第十四节: EF的三种模式(四) 之 原生正宗的 CodeFirst模式的默认约定

    一. 简介 1. 正宗的CodeFirst模式是不含有edmx模型,需要手动创建实体.创建EF上下文,然后生成通过代码来自动映射生成数据库. 2. 旨在:忘记SQL.忘记数据库. 3. 三类配置:On ...

  4. [Android] Android RxJava2+Retrofit2+OkHttp3 的使用(一) --基础篇 Retrofit2 的使用

    本文是 Android RxJava2+Retrofit2+OkHttp3 的使用(一) --基础篇 Retrofit2 的使用 本文的目标是用 Retrofit写一个网络请求: 本文以从获取天气预报 ...

  5. MyEclipse 2015 Stable 2.0破解方法

    本篇博文简单介绍一下利用网上说明的方法破解MyEclipse 2015 Stable 2.0的具体细节.因为原来在贴吧上的方法不够详细,所以本人重新整理了一下.方法源自:http://tieba.ba ...

  6. 使用ZooKeeper协调多台Web Server的定时任务处理(方案1)

    背景说明: 有一套Web服务程序, 为了保证HA, 需要在多台服务器上部署, 该服务程序有一些定时任务要执行, 现在要保证的是, 同一定时任务不会在多台机器上被同时执行. 方案1 --- 任务级的主备 ...

  7. 2.12 for循环

    for循环 像while循环一样,for可以完成循环的功能. 在Python中 for循环可以遍历任何序列的项目,如一个列表或者一个字符串等. for循环的格式 for 临时变量 in 列表或者字符串 ...

  8. css Modules 使用

    我目前常用的也就是引用类名,以及在需要修改某个ui组件原有的样式比较麻烦时,会使用 :global className{ color: red;}这样来修改... 更多请参考阮老师博客: http:/ ...

  9. ThetaSome_ThetaAll子查询

    基本语法 表达式 θ some(子查询) 表达式 θ all (子查询) 语法中,θ是比较运算符 <,>,>=,<=,=,<> 如果表达式的值至少与子查询的结果的某 ...

  10. css和css3弹性盒模型实现元素宽度(高度)自适应

    一.css实现左侧宽度固定右侧宽度自适应 1.定位 <!DOCTYPE html> <html lang="en"> <head> <me ...