JavaFile I/O
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的更多相关文章
- JAVA- File类
File类是IO包中唯一代表磁盘文件本身的对象.File类定义了一些与一台无关的方法来操作文件,可以通过调用File类中的方法,实现创建.修改.删除文件等功能.File类的对象主要用来获取文件本身的一 ...
- javaFile循环列出指定目录下的所有文件(源代码)
package javatest.basic22; import java.io.File; import java.io.IOException; public class FileTest { p ...
- JavaFile、递归、字节流、字符流整理
File 1.1 File类的构造函数 当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作. 当把持久设备上的数据读取到内存中的这个动作称为输入 ...
- JavaFile类和递归
八.File类和递归 8.1 概述 java.io.File 类时文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和产出等操作. 8.2 构造方法 public File(String pa ...
- Java-File类获取目录下文件名-遍历目录file.listFiles
package com.hxzy.IOSer;import java.io.*;/*File 类获取功能 * List * ListFile * */public class Demo06 { pub ...
- java-File类-字节流
一 File 1.1 递归子目录 获取所有子目录中的内容 import java.io.File; public class GetAllFiles { /** * @param args */ pu ...
- JavaFile I/O流
Java 流(Stream).文件(File)和IO Java.io 包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io 包中的流支持很多种格式,比如:基本类 ...
- java-file类 hei
File类 /* java.io.File类 文件和目录轮径的抽象形式 java把电脑种的文件和文件夹,封装为一个file类,我们可以使用file类对文件和文件夹进行曹祖 使用File类的方法 创建一 ...
- Android注解使用之通过annotationProcessor注解生成代码实现自己的ButterKnife框架
前言: Annotation注解在Android的开发中的使用越来越普遍,例如EventBus.ButterKnife.Dagger2等,之前使用注解的时候需要利用反射机制势必影响到运行效率及性能,直 ...
随机推荐
- [物理学与PDEs]第3章第2节 磁流体力学方程组 2.3 磁流体力学方程组
1. 磁流体力学方程组 $$\beex \bea \cfrac{\p {\bf H}}{\p t} &-\rot({\bf u}\times{\bf H})=\cfrac{1}{\sigma ...
- [物理学与PDEs]第2章第1节 理想流体力学方程组 1.1 预备知识
1. 理想流体: 指忽略粘性及热传导的流体. 2. 流体的状态 (运动状态及热力学状态) 的描述 (1) 速度向量 $\bbu=(u_1,u_2,u_3)$: 流体微元的宏观运动速度. (2) ...
- CCF CSP 认证
参加第八次CCF CSP认证记录 代码还不知道对不对,过两天出成绩. 成绩出来了,310分. 100+100+100+10+0: 考试13:27开始,17:30结束,提交第4题后不再答题,只是检查前四 ...
- 基于百度API+Flask实现网页版和图灵机器聊天
开发前准备 调用百度和图灵机器人相关的 参考链接:www.cnblogs.com/changtao/p/10596385.html 下载一个网页录音的js插件 链接:https://pan.baidu ...
- Codeforces 544E K Balanced Teams (DP)
题目: You are a coach at your local university. There are nn students under your supervision, the prog ...
- Django的邮件发送以及云服务器上遇到的问题
邮件发送 首先我们的邮箱要开通smtp服务,然后就可以在settings中配置了 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBacken ...
- Lua中的迭代器与泛型for
[前言] 迭代器就是一种可以遍历一种集合中所有元素的机制,在Lua中,通常将迭代器表示为函数.每调用一次函数,就返回集合中的“下一个”元素.每个迭代器都需要在每次成功调用之后保存一些状态,这样才能知道 ...
- Beta冲刺(6/7)
目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(6/7) 团队部分 后敬甲(组长) 过去两天完成了哪些任务 ppt制作 视频拍摄 接下来的计划 准备答辩 ...
- setInterval动态时间处理
- 【sklearn】中文文档
看不见的叫做远方 飞机票 分类 回归 聚类 降维 模型选择 预处理