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个基础流的更多相关文章

  1. JAVA input/output 流层次关系图

    在java中,input和output流种类繁多,那么它们之间是否有关系呢?答案是肯定的,其中使用到了设计模式,装饰模式 下图来自于HEAD FIRST 设计模式 装饰模式一章 下图来自网络博客:ht ...

  2. Java 8 (6) Stream 流 - 并行数据处理与性能

    在Java 7之前,并行处理集合非常麻烦.首先你要明确的把包含数据的数据结构分成若干子部分,然后你要把每个子部分分配一个独立的线程.然后,你需要在恰当的时候对他们进行同步来避免竞争,等待所有线程完成. ...

  3. Java 8 (4) Stream 流 - 使用

    在本节中将介绍Stream API支持的许多操作,这些操作可以完成更复杂的数据查询,如筛选.切片.映射.查找.匹配和归约.还有一些特殊的流如:数值流.来自文件和数组等多种来源的流. 筛选和切片 1.用 ...

  4. Java 8 (3) Stream 流 - 简介

    什么是流? 流是Java API的新成员,它允许你以声明性方式处理数据集合(通过查询语言来表达,而不是临时编写一个实现).就现在来说你可以先把它当做是一个遍历数据集的高级迭代器.此外,流还支持并行,你 ...

  5. Java学习:Stream流式思想

    Stream流 Java 8 API添加了一种新的机制——Stream(流).Stream和IO流不是一回事. 流式思想:像生产流水线一样,一个操作接一个操作. 使用Stream流的步骤:数据源→转换 ...

  6. Java 8创建Stream流的5种方法

    不知不觉间,Java已经发展到13了,来不及感慨时间过得真的太快了,来不及学习日新月异的技术更新,目前大多数公司还是使用的JDK8版本,一方面是版本的稳定,另一方面是熟悉,所以很多公司都觉得不升级也挺 ...

  7. java中的Stream流

    java中的Stream流 说到Stream便容易想到I/O Stream,而实际上,谁规定"流"就一定是"IO流"呢?在Java 8中,得益于Lambda所带 ...

  8. MessagePack Java Jackson 在不关闭输出流(output stream)的情况下序列化多变量

    com.fasterxml.jackson.databind.ObjectMapper 在默认的情况下在写出输入后将会关闭输出流(output stream). 如果你希望序列化多值变量在同一个输出流 ...

  9. java进阶篇——Stream流编程

    Stream流 函数式接口 1.消费型接口--Consumer @FunctionalInterface public interface Consumer<T> { /** * 对给定的 ...

  10. IO(Input&Output)流の介绍

    1.导读 对于设备之间的流动(即写入数据或读出数据),Java专门用Java.io包进行操作.这些数据的流动便是我们所说的数据的输入输出流(IO流). 2.数据流的处理:字节流和字符流 数据的基本单位 ...

随机推荐

  1. k8s——istio

    安装istio Istio / 入门 [root@master ~]# curl -L https://istio.io/downloadIstio | sh - % Total % Received ...

  2. numpy基础--线性代数

    以下代码的前提:import numpy as np 线性代数(如矩阵乘法.矩阵分解.行列式以及其他方阵数学等)是任何数组库的重要组成部分.numpy提供了一个用于矩阵乘法的dot函数(既是一个数组方 ...

  3. 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项

    为什么会突然想到写这么一个大杂烩的博文呢,必须要从笔者几年前的一次面试说起 当时的我年轻气盛,在简历上放了自己的博客地址,而面试官应该是翻了我的博客,好几道面试题都是围绕着我的博文来提问 其中一个问题 ...

  4. ABC342

    E 建反图 + 拓扑排序. 先求出直接与 \(n\) 连接的点的答,就是最后一辆车的发车时间.然后再做拓扑排序. 假如我们知道点 \(u\) 的答案为 \(ans_u\) 并且 \(u,v\) 相连, ...

  5. 小米红米手机应用APP字体太小

    小米红米手机应用APP字体太小 调整了手机显示大小,只能解决一点点,还是有点小,比如B站.微博. 调整了系统字体大小,B站.微博又不受系统字体大小控制. 只能通过修改最小宽度来解决. 1.打开开发者选 ...

  6. EF INNER JOIN WHERE ORDER BY

    同时使用 join,where,order by. UpdaterDbContext db = new UpdaterDbContext(); // 按 t_server 表的 seq ASC 排序, ...

  7. Scrapy框架(二)--持久化存储

    持久化存储 scrapy的高性能持久化存储操作,有两种方式:基于终端指令的持久化存储 和 基于管道的持久化存储操作. 基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列 ...

  8. vitepress 如何更换 favicon.ico

    favicon.ico 它出现在浏览器标签页上,是网站的标识之一. 准备图标 首先,你需要准备一个符合您要求的图标.通常,favicon.ico 使用的是 .ico 格式的图标文件,大小为 16x16 ...

  9. JS 过滤掉两个数组中对象id值相等的项

    const arr1 = [{ id: 1, name: '老二' }]; const arr2 = [{ id: 1, name: '网' }, { id: 2, name: '二位' },{ id ...

  10. springboot项目编译时,使用自定义注解类找不到符号

    springboot项目编译时,使用自定义注解类找不到符号 Java项目编译时,使用自定义注解类找不到符号Spring-boot项目编辑器:idea问题:编译时找不到符号.项目中用到了自定义注解类.编 ...