【Java】Input,Output,Stream I/O流 01 概述 & 4个基础流
Input,Output,Stream IO流
I/O Input/Output缩写、I/O技术用于处理设备之间的数据传输,读写文件,网络通讯
Java程序对于数据的操作以Stream流的形式进行
io包提供了各种流的类与接口,以获取不同种类型的数据,并通过标准方式输入输出数据
输入和输出的关系
Input 输入 是从数据存储文件中把数据读取到内存中的过程【硬盘 -> 内存】
Output输出 是从内存中把数据写入到存储文件中的过程 【内存 -> 硬盘】
流的分类
- 按数据单位分:字节流 8bit、字符流 16bit
- 按流的方向分:输入流、输出流
- 按流的角色分: 节点流 处理流
抽象基类4个
- 输入流 InputStream
- 输出流 OutputStream
- 读取流 Reader
- 读写流 Writter
继承的实现就是这4个实现类加前缀名称,节点流、缓冲流、XX流等等
节点的读取操作:
public class IOTest {
public static void main(String[] args) throws IOException {
File file = new File("fileSample.txt");
FileReader fileReader = new FileReader(file);
// 返回读入的一个字符,如果读入文件的末尾,返回-1
//int read = fileReader.read();
int c = fileReader.read() ;
while ( c != -1 ){
System.out.print((char)c + "\t");
c = fileReader.read();
}
// 读取完毕 释放资源 物理链接GC不会对其回收 Scanner JDBC I/O Socket
fileReader.close();
// 异常处理、为了保证流资源一定可以执行关闭操作、建议使用try-catch-finally
// FileNotFoundException 系统找不到指定的文件 要保证文件位置正确和存在
}
}
使用try-catch-finally处理
public class IOTest {
public static void main(String[] args) {
File file = new File("fileSample.txt");
FileReader fileReader = null;
try {
fileReader = new FileReader(file);
int c = fileReader.read() ;
while ( c != -1 ){
System.out.print((char)c + "\t");
c = fileReader.read();
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if (fileReader != null) {
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
使用数组作为缓冲容器的问题:
public class IOTest {
public static void main(String[] args) throws Exception {
File file = new File("fileSample.txt");
Reader reader = new FileReader(file);
// 缓冲容器
char[] buffer = new char[5];
int len;
while ( (len = reader.read(buffer)) != -1){
// 根据索引的个数遍历
for (int i = 0; i < buffer.length; i++) {
// Hello World!!!ld!!! 可能会出现这样的情况
// 问题出现在于如果已经读完了数据,但是多出的之前的已经放进去的数据也被读出来了!!!
System.out.println(buffer[i]);
}
}
reader.close();
}
}
正确的遍历方式
public class IOTest {
public static void main(String[] args) throws Exception {
File file = new File("fileSample.txt");
Reader reader = new FileReader(file);
// 缓冲容器
char[] buffer = new char[5];
int len;
while ( (len = reader.read(buffer)) != -1){
// 根据索引的个数遍历
for (int i = 0; i < len; i++) {
// Hello World!!!ld!!! 可能会出现这样的情况
// 问题出现在于如果已经读完了数据,但是多出的之前的已经放进去的数据也被读出来了!!!
System.out.println(buffer[i]);
}
}
reader.close();
}
}
用String接收
public class IOTest {
public static void main(String[] args) throws Exception {
File file = new File("fileSample.txt");
Reader reader = new FileReader(file);
// 缓冲容器
char[] buffer = new char[5];
int len;
while ( (len = reader.read(buffer)) != -1){
// 用String读取 从0 到末尾的前一位读取
String str = new String(buffer,0,len);
System.out.print(str + "\t");
}
reader.close();
}
}
写出数据:
public class IOTest {
public static void main(String[] args) throws Exception {
// 输出的文件如果不存在,输出流对象会直接创建文件然后进行输出
File file = new File("fileSample.txt");
// 写出文件的位置
Writer writer = new FileWriter(file,true);
// new FileWriter(file,true) 在原有文件上追加写入数据
// new FileWriter(file,false) or new FileWriter(file) 覆写操作
// 原始数据
String data = "\n这是我们要写入的数据!!!";
// 转换成字符数组作为可传输的格式
char[] chars = data.toCharArray();
// 读写数据 覆盖写入的操作
writer.write(chars);
writer.write("\n直接写入的数据".toCharArray());
writer.close();
}
}
读写同时操作,复制文件
public class IOTest {
public static void main(String[] args) throws Exception {
// 读取文件
File src = new File("fileSample.txt");
// 读写文件
File dest = new File("destSample.txt");
// 文件读取流对象
Reader reader = new FileReader(src);
// 文件读写对象
Writer writer = new FileWriter(dest);
// 缓冲数组
char[] readerBuffer = new char[3];
int read; // 每次读取的个数
while ( (read = reader.read(readerBuffer)) != -1 ){
System.out.print(read+"..."); // 打印显示
System.out.print("\n" + new String(readerBuffer) + "\n");
writer.write(readerBuffer,0,read); // 写入字符数组
}
reader.close();
writer.close();
}
}
【Java】Input,Output,Stream I/O流 01 概述 & 4个基础流的更多相关文章
- JAVA input/output 流层次关系图
在java中,input和output流种类繁多,那么它们之间是否有关系呢?答案是肯定的,其中使用到了设计模式,装饰模式 下图来自于HEAD FIRST 设计模式 装饰模式一章 下图来自网络博客:ht ...
- Java 8 (6) Stream 流 - 并行数据处理与性能
在Java 7之前,并行处理集合非常麻烦.首先你要明确的把包含数据的数据结构分成若干子部分,然后你要把每个子部分分配一个独立的线程.然后,你需要在恰当的时候对他们进行同步来避免竞争,等待所有线程完成. ...
- Java 8 (4) Stream 流 - 使用
在本节中将介绍Stream API支持的许多操作,这些操作可以完成更复杂的数据查询,如筛选.切片.映射.查找.匹配和归约.还有一些特殊的流如:数值流.来自文件和数组等多种来源的流. 筛选和切片 1.用 ...
- Java 8 (3) Stream 流 - 简介
什么是流? 流是Java API的新成员,它允许你以声明性方式处理数据集合(通过查询语言来表达,而不是临时编写一个实现).就现在来说你可以先把它当做是一个遍历数据集的高级迭代器.此外,流还支持并行,你 ...
- Java学习:Stream流式思想
Stream流 Java 8 API添加了一种新的机制——Stream(流).Stream和IO流不是一回事. 流式思想:像生产流水线一样,一个操作接一个操作. 使用Stream流的步骤:数据源→转换 ...
- Java 8创建Stream流的5种方法
不知不觉间,Java已经发展到13了,来不及感慨时间过得真的太快了,来不及学习日新月异的技术更新,目前大多数公司还是使用的JDK8版本,一方面是版本的稳定,另一方面是熟悉,所以很多公司都觉得不升级也挺 ...
- java中的Stream流
java中的Stream流 说到Stream便容易想到I/O Stream,而实际上,谁规定"流"就一定是"IO流"呢?在Java 8中,得益于Lambda所带 ...
- MessagePack Java Jackson 在不关闭输出流(output stream)的情况下序列化多变量
com.fasterxml.jackson.databind.ObjectMapper 在默认的情况下在写出输入后将会关闭输出流(output stream). 如果你希望序列化多值变量在同一个输出流 ...
- java进阶篇——Stream流编程
Stream流 函数式接口 1.消费型接口--Consumer @FunctionalInterface public interface Consumer<T> { /** * 对给定的 ...
- IO(Input&Output)流の介绍
1.导读 对于设备之间的流动(即写入数据或读出数据),Java专门用Java.io包进行操作.这些数据的流动便是我们所说的数据的输入输出流(IO流). 2.数据流的处理:字节流和字符流 数据的基本单位 ...
随机推荐
- k8s——kubctl命令基础
语法 kubevtl [command] [type] [name] [flags] command: 指定要对一个或多个资源执行的操作,例如,`create`,`get`,`describe`,`d ...
- Spark-submit常用任务命令参数和说明
Spark常用任务命令参数和说明 spark-submit \ --name task2018072711591669 \ --master yarn --deploy-mode client \ - ...
- Scrapy框架(十)--增量式爬虫
增量式爬虫 - 概念:监测网站数据更新的情况,只会爬取网站最新更新出来的数据. - 分析: - 指定一个起始url - 基于CrawlSpider获取其他页码链接 - 基于Rule将其他页码链接进行请 ...
- Jmeter进行HTTPS接口压测及SSL证书验证
一.前言 使用JMeter压测HTTPS接口比较简单,只需要预先处理SSL证书认证,后面就是压测HTTP接口的通用步骤. HTTPS连接证书来验证浏览器和WEB服务器之间的连接.通过HTTP连接时,服 ...
- Next.js 13 如何使用loading.js
要在next.js 13中使用loading.js,我们需要先在对应的文件目录下创建loading.js文件 文件结构如下: app test1 loading.tsx page.tsx 如上面的目录 ...
- JAVA日期当天0点0分0秒
LocalDateTime LocalDateTime ldt = LocalDateTime.now(); LocalDateTime todayZero = LocalDateTime.of(ld ...
- 2019-2020 ICPC, NERC, Southern and Volga Russian Regional Contest (Online Mirror, ICPC Rules, Teams Preferred) M. SmartGarden 题解
cf1250 M. SmartGarden 完全不会做 orz,在 cf 上看到了有趣的做法. 通读题意后可以发现是对于每一次操作,要求选出的行集合 \(R\) 和列集合 \(C\) 要满足如下条件: ...
- 【冷启动#1】实用的MySQL基础
简单安装一下MySQL Windows下(5.7.x) 本体安装 1.首先先下载安装包,名字如下: mysql-5.7.19-winx64.zip 2.配置环境变量,将解压之后的bin目录添加一下 3 ...
- SpringMVC原理(1)-文件上传请求
我们文件上传接口只需要在方法参数上写MultipartFile类,mvc就可以帮我们把上传的文件封装为这个类的对 象供我们非常方便的操作,那它是怎么做的呢?我们一起来看看 我们发的请求默认都是由Dis ...
- SpringBoot+mail 轻松实现各类邮件自动推送
一.简介 在实际的项目开发过程中,经常需要用到邮件通知功能.例如,通过邮箱注册,邮箱找回密码,邮箱推送报表等等,实际的应用场景非常的多. 早期的时候,为了能实现邮件的自动发送功能,通常会使用 Java ...