1. 使用文件输入流读取文件数据

文件流常用的构造器(输入输出都一样)
            FileInputStream(File file)------------------------先实例化file 传入file
            FileInputStream(String filename)--------------直接写抽象路径 少写一行

FileInputStream  fis = new FileInputStream(",/fos.dat");

难点: InputStream上定义了读取字节的方法   输入输出流对象. read()

  • 读取1个字节,并以int形式返回。而返回的int值中只有"低八位"有数据(就是读取到的1字节的内容)。
  • 如果返回的int值为整数-1,则表达流读取到了末尾(不可再通过这个流读取到任何数据了)。
//读取当前目录下的fos.dat文件中的字节数据
//        File file = new File("./fos.dat");
//        FileInputStream fis = new FileInputStream(file);//读操作
//        FileOutputStream fos = new FileOutputStream(file);//写操作FileInputStream fis = new FileInputStream("./fos.dat");/*fos.dat文件内容:00000001 00000010第一次调用:int d = fis.read();//读取文件的第一个字节fos.dat文件内容:00000001 00000010^^^^^^^^读取该字节返回值d的2进制样子:00000000 00000000 00000000 00000001|-------自动补充24个0------| ^^^^^^^^本次读取的*/int d = fis.read();System.out.println(d); //输出1/*第二次调用:d = fis.read();//读取文件的第二个字节fos.dat文件内容:00000001 00000010^^^^^^^^读取该字节返回值d的2进制样子:00000000 00000000 00000000 00000010|-------自动补充24个0------| ^^^^^^^^本次读取的*/d = fis.read();System.out.println(d);//输出2/*第三次调用:d = fis.read();//读取文件的第三个字节fos.dat文件内容:00000001 00000010 没有数据了^^^^^^^^文件末尾了返回值d的2进制样子:11111111 11111111 11111111 11111111|-----------自动补充32个1-----------|*/d = fis.read();System.out.println(d);//输出-1fis.close();}
}

2.复制文件(输入再输出)

读取一个字节并输出

public static void main(String[] args) throws IOException {FileInputStream fis=new FileInputStream("./10904.jpg");FileOutputStream fos=new FileOutputStream("./image.jpg");int d;//一开始嫌麻烦 d初始化并赋值了 不可以! 每一遍赋值不能为-1while((d=fis.read())!=-1){fos.write(d);}System.out.println("复制完毕");fis.close();fos.close();

前后时间一减 知道花了多长时间复制文件  System.currentTimeMillis();

package io;public class Demo {public static void main(String[] args) {//自1970-01-01 00:00:00到当前系统时间所经过的毫秒// 用long值 因为int才21亿不够用long now = System.currentTimeMillis();System.out.println(now);now = now/1000/60/60/24/365;System.out.println(now);//52年long max = Long.MAX_VALUE;max = max/1000/60/60/24/365;System.out.println("公元:"+(max+1970));//公元292473178}
}

块读写操作

提高每次读写的数据量,减少读写次数可以提高读写效率
一组字节一次性读写操作称为:块读写操作

InputStream字节输入流的超类上规定了块读操作:
            byte[] data = new byte[3];

       int read(byte[] data)

一次性读取给定的字节数组data总长度的字节量并装入到该数组中
            返回值为实际读取到的字节数。如果返回值为整数-1则表达流读取到末尾了

一个bit可以存一个8位2进制

01111111 127

第一位当成符号位去用了 0为正 1为负

块读演示

原文件内容(5个字节):
            11001100 10101010 11110000 00001111 01010101

int len=0;
            //二进制形式data:{00000000,00000000,00000000}
            byte[] data = new byte[3];

第一次调用:
            len = fis.read(data);//data长度为3,因此一次性要读取3个字节
            原文件内容:
            11001100 10101010 11110000 00001111 01010101
            ^^^^^^^^ ^^^^^^^^ ^^^^^^^^
               本次读取到的3个字节内容

data:{11001100,0101010,11110000}
                 数组的三个字节为本次实际读取内容
            len=3;//len为整数3,表达本次实际读取到了3个字节

第二次调用:
            len = fis.read(data);//data长度为3,因此一次性要读取3个字节
            原文件内容:
            11001100 10101010 11110000 00001111 01010101 没有数据了
                                       ^^^^^^^^ ^^^^^^^^ ^^^^^^^^
                                       本次实际读取到的2字节

data:{00001111,01010101,11110000}
                  ^^^^^^^^ ^^^^^^^^ |-旧数据-|
                  |-本次读取的新数据-|
            len=2;//len为整数2,表达本次实际读取到了2个字节

第三次调用:
            len = fis.read(data);//data长度为3,因此一次性要读取3个字节
            原文件内容:
            11001100 10101010 11110000 00001111 01010101 没有数据了
                                                         ^^^^^^^^ ^^^^^^^^ ^^^^^^^^
                                                         本次没有读取到任何数据

data:{00001111,01010101,11110000}
                  |---------旧数据----------|

len=-1;//len为整数-1,表达已经是流的末尾了,本次没有读取任何数据。

8位2进制       1个字节
            00000000      1byte

1024byte      1kb
            1024kb        1mb
            1024mb        1gb
            1024gb        1tb
            1024tb        1pb


public class CopyDemo2 {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("./wnwb.exe");FileOutputStream fos = new FileOutputStream("./wnwb_cp.exe");/*OutputStream字节输出流的超类上,定义了块写操作void write(byte[] data)一次性将给定的字节数组中所有字节写出void write(byte[] data,int offset,int len)一次性将给定的字节数组data中从下标offset处开始的连续len个字节一次性写出*/int len;byte[] data = new byte[1024*10];//10kb 计算表达式比10240更好理解long start = System.currentTimeMillis();while((len = fis.read(data))!=-1){fos.write(data,0,len);}long end = System.currentTimeMillis();System.out.println("复制完毕!耗时:"+(end-start)+"ms");fis.close();fos.close();}
}

复制后的文件比源文件大    len表示文件多少可用字节

3.写出文本数据   getBytes((StandardCharsets.UTF_8) 字符串转字节数组


/*** 使用输出流写出文本数据*/
public class eWriteStringDemo {public static void main(String[] args) throws IOException {//向文件中写入文本数据FileOutputStream fos = new FileOutputStream("demo.txt");String line = "和我在成都的街头走一走,哦哦哦哦。";/*UTF编码:unicode传输编码UTF里面包含了全世界所有在用的流行文字英文:1个字符占1个字节,维持ASC部分内容中文:1个字符占3个字节*/byte[] data = line.getBytes(StandardCharsets.UTF_8);fos.write(data);line = "直到所有的灯都熄灭了也不停留。";data = line.getBytes(StandardCharsets.UTF_8);fos.write(data);System.out.println("写出完毕!");fos.close();}
}
package io;import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;/*** 实现一个简易记事本工具:* 程序启动后将用户在控制台输入的每一行字符串都写入到文件note.txt中。* 如果用户单独输入"exit"则程序退出。** 你好* 嘿嘿* 呵呵* exit** 文件:* 你好嘿嘿呵呵*/
public class Test2 {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("note.txt");Scanner scanner = new Scanner(System.in);System.out.println("请开始输入内容,单独输入exit退出。");while(true){String line = scanner.nextLine();//1获取输入的一行字符串if("exit".equalsIgnoreCase(line)){//2如果为exit,则退出break;}//3将内容写入文件byte[] data = line.getBytes(StandardCharsets.UTF_8);fos.write(data);}fos.close();System.out.println("再见!");}
}

4.fos覆盖与追加

5.阅读文本数据

6.高级流

缓冲字节流:加快读写效率

BufferedOutputStream

缓冲输出流的

对象流:帮助读取java对象

IO第二天 低级流 缓冲流BOS 对象流OOS相关推荐

  1. 【Java I/O流】File、字符集、字节流、字符流、缓冲流、数据流、对象流、序列化、try-with-resources语句

    I/O流 File File 常用方法 File 练习:搜索.删除.剪切 字符集(Character Set) 字符编码(Character Encoding) 字符编码比较 乱码 try-with- ...

  2. 对象必须实现 iconvertible_Java I/O 流之数据流_对象流

    一.数据流 1.数据简介 数据流将"基本数据类型与字符串类型"作为数据源,从而允许程序以与机器无关的方式从底层输入输出流中操作Java基本数据类型与字符串类型. DataInput ...

  3. 四十三、深入Java中的数组流,数据流和对象流操作

    @Author:Runsen @Date:2020/6/8 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...

  4. 对象流java_Java中的对象流总结(必看篇)

    java中可以通过对象流将一个序列化的对象保存到硬盘中,或者硬盘中读取一个对象.对象流的存储和读取包含以下几点内容: 1.所保存的对象必须实现serializable接口. 2. 所保存的对象的属性也 ...

  5. Java IO流之对象流

    对象流 1.1对象流简介 1.2对象流分类 输入流字节流处理流:ObjectInputStream,将序列化以后的字节存储到本地文件 输出流字节流处理流:ObjectOutputStream 1.3序 ...

  6. .dat文件写入byte类型数组_文件字节流、文件字符流、缓冲字节流、缓冲字符流字节数组流、数据流、转换流、对象流...

    一.实操名称: 描述如下流的基本作用:文件字节流.文件字符流.缓冲字节流.缓冲字符流字节数组流.数据流.转换流.对象流二.描述1.文件字节流:包括:FileInputStream,FileOutput ...

  7. EAUML日拱一卒-活动图:: 对象流

    如果你足够细心,应该可以注意到上一篇文章最后的示例流程中,有一个地方与众不同,就是下图中红框中的部分. 这部分就是今天的内容,对象流. 语义 控制流(control flow)描述了两个活动节点之间执 ...

  8. 【java基础,IO合集】文件流、高级流(缓冲流、对象流)、 序列化接口java.io.Serrializable

    目录 文件流 1 块读写的文件复制操作 2 文件输出流-覆盖模式 3 文件输出流-追加模式 4 文件输出流-读取文本数据 高级流 1  流连接示意图 2 缓冲流 2.1 使用缓冲流完成文件复制操作 2 ...

  9. java基础 io流 字节流 字符流 节点流 包装流 转换流 缓冲流 对象流 打印流 Properties类

    目录 1.概念 2.常用的文件操作 2.1 创建文件 2.2 获取文件相关信息 2.3 目录的操作和文件删除 3. IO流原理及流的分类 3.1 流的分类 4.InputStream 字节输入流 4. ...

  10. io包下 文件类 字节流 字符流 缓冲流 转换流 序列化流 打印流

    第一章 File类 1.1 概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 1.2 构造方法 public File(String pat ...

最新文章

  1. 计算机原理与基础 —— (皇帝身边的小太监----寄存器)
  2. WebView显示的网页在大分辨率屏下被放大--解决方案
  3. 接口隔离原则_设计模式六大原则
  4. 旅行场景下的个性化营销平台揭秘
  5. mysql 8 修改root密码忘记_忘记mysql8或者mariadb5及以上 的root密码如何更改
  6. gen文件下有两个R.java_android工程gen目录中R.java包名是怎么确定
  7. linux中mysql群集_阅读无群集可用性组中的Scale可用性组
  8. C/C++文件字符串处理
  9. 适合程序员的健身方法(转)
  10. Linux内核探索之路——关于方法
  11. ​​​​​​​国民经济行业分类(GB/T 4754—2017)
  12. idea2017+kemulator搭建J2ME开发环境
  13. PDF转换成word转换器绿色版使用步骤
  14. mac系统下配置java 和maven环境变量
  15. Win10/win11系统如何禁用笔记本自带键盘、笔记本键盘禁用后无法恢复解决办法【靠谱】
  16. 模拟电子技术之运算放大器
  17. 软件需求规格说明书,概要设计说明书,详细设计说明书(文档)
  18. 本地系统盘放到服务器上,怎么把本地盘挂到云服务器
  19. 天合光能为澳大利亚太阳能农场供应双玻组件
  20. MATLAB强化学习实战(十三) 使用强化学习智能体训练Biped机器人行走

热门文章

  1. C语言结构体的字节对齐原则
  2. 【论文翻译】从零开始PointNet论文分析与代码复现
  3. 电压转电流模块电路设计原理解析
  4. 51单片机(AT89S52)设计简单计算器(4位加减乘除)
  5. MCU设计电路的总结
  6. 【C语言】使用Qt5学习C语言编写Hello World
  7. 一鸣心所向:可以直接套用的成交标准法则
  8. mysql数据库可以放pdb文件吗_pdb数据库文件的搜索结果-阿里云开发者社区
  9. 现代密码学常用符号总结
  10. 拉格朗日方程的三种推导方法之基于达朗贝尔原理推导