IO第二天 低级流 缓冲流BOS 对象流OOS
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 01010101int 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相关推荐
- 【Java I/O流】File、字符集、字节流、字符流、缓冲流、数据流、对象流、序列化、try-with-resources语句
I/O流 File File 常用方法 File 练习:搜索.删除.剪切 字符集(Character Set) 字符编码(Character Encoding) 字符编码比较 乱码 try-with- ...
- 对象必须实现 iconvertible_Java I/O 流之数据流_对象流
一.数据流 1.数据简介 数据流将"基本数据类型与字符串类型"作为数据源,从而允许程序以与机器无关的方式从底层输入输出流中操作Java基本数据类型与字符串类型. DataInput ...
- 四十三、深入Java中的数组流,数据流和对象流操作
@Author:Runsen @Date:2020/6/8 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...
- 对象流java_Java中的对象流总结(必看篇)
java中可以通过对象流将一个序列化的对象保存到硬盘中,或者硬盘中读取一个对象.对象流的存储和读取包含以下几点内容: 1.所保存的对象必须实现serializable接口. 2. 所保存的对象的属性也 ...
- Java IO流之对象流
对象流 1.1对象流简介 1.2对象流分类 输入流字节流处理流:ObjectInputStream,将序列化以后的字节存储到本地文件 输出流字节流处理流:ObjectOutputStream 1.3序 ...
- .dat文件写入byte类型数组_文件字节流、文件字符流、缓冲字节流、缓冲字符流字节数组流、数据流、转换流、对象流...
一.实操名称: 描述如下流的基本作用:文件字节流.文件字符流.缓冲字节流.缓冲字符流字节数组流.数据流.转换流.对象流二.描述1.文件字节流:包括:FileInputStream,FileOutput ...
- EAUML日拱一卒-活动图:: 对象流
如果你足够细心,应该可以注意到上一篇文章最后的示例流程中,有一个地方与众不同,就是下图中红框中的部分. 这部分就是今天的内容,对象流. 语义 控制流(control flow)描述了两个活动节点之间执 ...
- 【java基础,IO合集】文件流、高级流(缓冲流、对象流)、 序列化接口java.io.Serrializable
目录 文件流 1 块读写的文件复制操作 2 文件输出流-覆盖模式 3 文件输出流-追加模式 4 文件输出流-读取文本数据 高级流 1 流连接示意图 2 缓冲流 2.1 使用缓冲流完成文件复制操作 2 ...
- java基础 io流 字节流 字符流 节点流 包装流 转换流 缓冲流 对象流 打印流 Properties类
目录 1.概念 2.常用的文件操作 2.1 创建文件 2.2 获取文件相关信息 2.3 目录的操作和文件删除 3. IO流原理及流的分类 3.1 流的分类 4.InputStream 字节输入流 4. ...
- io包下 文件类 字节流 字符流 缓冲流 转换流 序列化流 打印流
第一章 File类 1.1 概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 1.2 构造方法 public File(String pat ...
最新文章
- 计算机原理与基础 —— (皇帝身边的小太监----寄存器)
- WebView显示的网页在大分辨率屏下被放大--解决方案
- 接口隔离原则_设计模式六大原则
- 旅行场景下的个性化营销平台揭秘
- mysql 8 修改root密码忘记_忘记mysql8或者mariadb5及以上 的root密码如何更改
- gen文件下有两个R.java_android工程gen目录中R.java包名是怎么确定
- linux中mysql群集_阅读无群集可用性组中的Scale可用性组
- C/C++文件字符串处理
- 适合程序员的健身方法(转)
- Linux内核探索之路——关于方法
- ​​​​​​​国民经济行业分类(GB/T 4754—2017)
- idea2017+kemulator搭建J2ME开发环境
- PDF转换成word转换器绿色版使用步骤
- mac系统下配置java 和maven环境变量
- Win10/win11系统如何禁用笔记本自带键盘、笔记本键盘禁用后无法恢复解决办法【靠谱】
- 模拟电子技术之运算放大器
- 软件需求规格说明书,概要设计说明书,详细设计说明书(文档)
- 本地系统盘放到服务器上,怎么把本地盘挂到云服务器
- 天合光能为澳大利亚太阳能农场供应双玻组件
- MATLAB强化学习实战(十三) 使用强化学习智能体训练Biped机器人行走