java IO之OutputStream和InputStream

2024-02-18 15:18

本文主要是介绍java IO之OutputStream和InputStream,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

01输入和输出

* A:输入和输出* a: 参照物* 到底是输入还是输出,都是以Java程序为参照* b: Output* 把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作* 程序到文件称为输出* c: Input* 把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作* 文件到程序称为输入* d: IO操作* 把上面的这种输入和输出动作称为IO操作

02字节输出流OutputStream

* A: 字节输出流OutputStream* a.概念* IO流用来处理设备之间的数据传输* Java对数据的操作是通过流的方式* Java用于操作流的类都在IO包中* 流按流向分为两种:输入流,输出流。* 流按操作类型分为两种:* 字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的* 字符流 : 字符流只能操作纯字符数据,比较方便。* b.IO流常用父类* 字节流的抽象父类:* InputStream * OutputStream* 字符流的抽象父类:* Reader * Writer        * c.IO程序书写* 使用前,导入IO包中的类* 使用时,进行IO异常处理* 使用后,释放资源* d: 方法介绍*  void close(): 关闭此输出流并释放与此流有关的所有系统资源。*  void write(byte[] b): 将 b.length 个字节从指定的 byte 数组写入此输出流*  void write(byte[] b, int off, int len) :将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。* abstract  void write(int b) : 将指定的字节写入此输出流。

03字节输出流FileOutputStream写字节

* A: 字节输出流FileOutputStream写字节* a: FileOutputStream* 写入数据文件,学习父类方法,使用子类对象* b: FileOutputStream构造方法* 作用:绑定输出的输出目的* FileOutputStream(File file) * 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。* FileOutputStream(File file, boolean append) * 创建一个向指定 File 对象表示的文件中写入数据的文件输出流,以追加的方式写入。* FileOutputStream(String name) * 创建一个向具有指定名称的文件中写入数据的输出文件流。* FileOutputStream(String name, boolean append) * 创建一个向具有指定 name 的文件中写入数据的输出文件流,以追加的方式写入。* c: 流对象使用步骤*  1. 创建流子类的对象,绑定数据目的*  2. 调用流对象的方法write写*  3. close释放资源* d: 注意事项* 流对象的构造方法,可以创建文件,如果文件存在,直接覆盖* e: 案例代码/**   FileOutputStream*   写入数据文件,学习父类方法,使用子类对象*   *   子类中的构造方法: 作用:绑定输出的输出目的*     参数:*       File    封装文件*       String  字符串的文件名*   *   流对象使用步骤*     1. 创建流子类的对象,绑定数据目的*     2. 调用流对象的方法write写*     3. close释放资源*     *    流对象的构造方法,可以创建文件,如果文件存在,直接覆盖*/public class FileOutputStreamDemo {public static void main(String[] args)throws IOException {FileOutputStream fos = new FileOutputStream("c:\\a.txt");//流对象的方法write写数据//写1个字节fos.write(97);//关闭资源fos.close();}}

04字节输出流FileOutputStream写字节数组

* A: 字节输出流FileOutputStream写字节数组* a: 方法介绍*  void write(byte[] b): 将 b.length 个字节从指定的 byte 数组写入此输出流*  void write(byte[] b, int off, int len) :将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。* b: 案例代码/**   FileOutputStream*   写入数据文件,学习父类方法,使用子类对象*   *   子类中的构造方法: 作用:绑定输出的输出目的*     参数:*       File    封装文件*       String  字符串的文件名*   *   流对象使用步骤*     1. 创建流子类的对象,绑定数据目的*     2. 调用流对象的方法write写*     3. close释放资源*     *    流对象的构造方法,可以创建文件,如果文件存在,直接覆盖*/public class FileOutputStreamDemo {public static void main(String[] args)throws IOException {FileOutputStream fos = new FileOutputStream("c:\\a.txt");//流对象的方法write写数据//写字节数组byte[] bytes = {65,66,67,68};fos.write(bytes);//写字节数组的一部分,开始索引,写几个fos.write(bytes, 1, 2);//写入字节数组的简便方式//写字符串fos.write("hello".getBytes());//关闭资源fos.close();   }}

05文件的续写和换行符号

* A: 文件的续写和换行符号* a: 文件的续写*  FileOutputStream构造方法, 的第二个参数中,加入true* b: 换行符号* 在文件中,写入换行,符号换行  \r\n* \r\n 可以写在上一行的末尾, 也可以写在下一行的开头* c: 案例代码/**  FileOutputStream 文件的续写和换行问题*  续写: FileOutputStream构造方法, 的第二个参数中,加入true*  在文件中,写入换行,符号换行  \r\n*  \r\n 可以写在上一行的末尾, 也可以写在下一行的开头*/public class FileOutputStreamDemo1 {public static void main(String[] args)throws IOException {File file = new File("c:\\b.txt");FileOutputStream fos = new FileOutputStream(file,true);fos.write("hello\r\n".getBytes());fos.write("world".getBytes());fos.close();}}

06IO中的异常处理

* A: IO中的异常处理* a:IO流的异常处理* try catch finally* b: 细节* 1. 保证流对象变量,作用域足够* 2. catch里面,怎么处理异常* 输出异常的信息,目的看到哪里出现了问题* 停下程序,从新尝试* 3. 如果流对象建立失败了,需要关闭资源吗* new 对象的时候,失败了,没有占用系统资源* 释放资源的时候,对流对象判断null* 变量不是null,对象建立成功,需要关闭资源* c: 案例代码public class FileOutputStreamDemo3 {public static void main(String[] args) {//try 外面声明变量,try 里面建立对象FileOutputStream fos = null;try{fos = new FileOutputStream("s:\\a.txt");fos.write(100);}catch(IOException ex){System.out.println(ex);throw new RuntimeException("文件写入失败,重试");}finally{try{if(fos!=null)fos.close();}catch(IOException ex){throw new RuntimeException("关闭资源失败");}}}}

07字节输入流InputStream

* A: 字节输入流InputStream* a: 方法介绍* abstract  int read() :* 从输入流中读取数据的下一个字节。* int read(byte[] b)  * 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。* int read(byte[] b, int off, int len) * 将输入流中最多 len 个数据字节读入 byte 数组。* void close() * 关闭此输入流并释放与该流关联的所有系统资源。* b: 案例代码/**   字节输入流*     java.io.InputStream 所有字节输入流的超类*   作用: 读取任意文件,每次只读取1个字节*   读取的方法  read*     int  read() 读取1个字节*     int  read(byte[] b) 读取一定量的字节,存储到数组中*/public class InputStreamDemo {}

08字节输入流FileInputStream读取字节

* A: 字节输入流FileInputStream读取字节* a: 方法介绍* abstract  int read() :* 从输入流中读取数据的下一个字节,返回-1表示文件结束* int read(byte[] b)  * 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。* 读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回 -1。* int read(byte[] b, int off, int len) * 将输入流中最多 len 个数据字节读入 byte 数组。* void close() * 关闭此输入流并释放与该流关联的所有系统资源。* b: 案例代码/**  FileInputStream读取文件*  *  构造方法: 为这个流对象绑定数据源*  *    参数: *      File 类型对象*      String 对象*   输入流读取文件的步骤*     1. 创建字节输入流的子类对象*     2. 调用读取方法read读取*     3. 关闭资源*     *     read()方法,*       read()执行一次,就会自动读取下一个字节*       返回值,返回的是读取到的字节, 读取到结尾返回-1*/public class FileInputStreamDemo {public static void main(String[] args) throws IOException{FileInputStream fis = new FileInputStream("c:\\a.txt");//读取一个字节,调用方法read 返回int//使用循环方式,读取文件,  循环结束的条件  read()方法返回-1int len = 0;//接受read方法的返回值while( (len = fis.read()) != -1){System.out.print((char)len);}//关闭资源fis.close();}}/** int i = fis.read();System.out.println(i);i = fis.read();System.out.println(i);i = fis.read();System.out.println(i);i = fis.read();System.out.println(i);*/

09字节输入流FileInputStream读取字节数组

* A: 字节输入流FileInputStream读取字节数组* a: 方法介绍* int read(byte[] b)  * 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。* 读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回 -1。* int read(byte[] b, int off, int len) * 将输入流中最多 len 个数据字节读入 byte 数组。* b: 案例代码/**  FileInputStream读取文件*   读取方法  int read(byte[] b) 读取字节数组*   数组作用: 缓冲的作用, 提高效率*   read返回的int,表示什么含义 读取到多少个有效的字节数*/public class FileInputStreamDemo1 {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("c:\\a.txt");// 创建字节数组byte[] b = new byte[2];int len = fis.read(b);System.out.println(new String(b));// abSystem.out.println(len);// 2len = fis.read(b);System.out.println(new String(b));// cdSystem.out.println(len);// 2len = fis.read(b);System.out.println(new String(b));// edSystem.out.println(len);// 1len = fis.read(b);System.out.println(new String(b));// edSystem.out.println(len);// -1fis.close();}}

10字节输入流FileInputStream读取字节数组的实现原理

* A:字节输入流FileInputStream读取字节数组的实现原理* a: 原理* 参见day23_source文件夹中的"读取数组的原理.jpg"* b: 案例代码public class FileInputStreamDemo1 {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("c:\\a.txt");//创建字节数组byte[] b = new byte[1024];int len = 0 ;while( (len = fis.read(b)) !=-1){System.out.print(new String(b,0,len));}fis.close();}}

11文件复制原理

* A: 文件复制原理* a: 见day23_source/文件复制原理.jpg

12字节流复制文件读取单个字节

* A: 字节流复制文件读取单个字节* a: 案例代码/**  将数据源 c:\\a.txt*  复制到 d:\\a.txt  数据目的*  字节输入流,绑定数据源*  字节输出流,绑定数据目的*  *  输入,读取1个字节*  输出,写1个字节*/public class Copy {public static void main(String[] args) {//定义两个流的对象变量FileInputStream fis = null;FileOutputStream fos = null;try{//建立两个流的对象,绑定数据源和数据目的fis = new FileInputStream("c:\\t.zip");fos = new FileOutputStream("d:\\t.zip");//字节输入流,读取1个字节,输出流写1个字节int len = 0 ;while((len = fis.read())!=-1){fos.write(len);}}catch(IOException ex){System.out.println(ex);throw new RuntimeException("文件复制失败");}finally{try{if(fos!=null)fos.close();}catch(IOException ex){throw new RuntimeException("释放资源失败");}finally{try{if(fis!=null)fis.close();}catch(IOException ex){throw new RuntimeException("释放资源失败");}}}}}

13字节流复制文件读取字节数组

* A: 字节流复制文件读取字节数组* a: 案例代码/**  字节流复制文件*   采用数组缓冲提高效率*   字节数组*   FileInputStream 读取字节数组*   FileOutputStream 写字节数组*/public class Copy_1 {public static void main(String[] args) {long s = System.currentTimeMillis();FileInputStream fis = null;FileOutputStream fos = null;try{fis = new FileInputStream("c:\\t.zip");fos = new FileOutputStream("d:\\t.zip");//定义字节数组,缓冲byte[] bytes = new byte[1024*10];//读取数组,写入数组int len = 0 ; while((len = fis.read(bytes))!=-1){fos.write(bytes, 0, len);}}catch(IOException ex){System.out.println(ex);throw new RuntimeException("文件复制失败");}finally{try{if(fos!=null)fos.close();}catch(IOException ex){throw new RuntimeException("释放资源失败");}finally{try{if(fis!=null)fis.close();}catch(IOException ex){throw new RuntimeException("释放资源失败");}}}long e = System.currentTimeMillis();System.out.println(e-s);}}

14编码表

* A: 编码表* a: 定义:* 生活中字符和计算机二进制的对应关系表,就是编码表* b: 分类* 1、ascii: 一个字节中的7位就可以表示。对应的字节都是正数。0-xxxxxxx* 2、iso-8859-1:拉丁码表 latin,用了一个字节用的8位。1-xxxxxxx  负数。* 3、GB2312:简体中文码表。包含6000-7000中文和符号。用两个字节表示。两个字节第一个字节是负数,第二个字节可能是正数* GBK:目前最常用的中文码表,2万的中文和符号。用两个字节表示,其中的一部分文字,第一个字节开头是1,第二字节开头是0* GB18030:最新的中文码表,目前还没有正式使用。* 4、unicode:国际标准码表:无论是什么文字,都用两个字节存储。* Java中的char类型用的就是这个码表。char c = 'a';占两个字节。* Java中的字符串是按照系统默认码表来解析的。简体中文版 字符串默认的码表是GBK。* 5、UTF-8:基于unicode,一个字节就可以存储数据,不要用两个字节存储,而且这个码表更加的标准化,在每一个字节头加入了编码信息(后期到api中查找)。* 6、能识别中文的码表:GBK、UTF-8;正因为识别中文码表不唯一,涉及到了编码解码问题。* 对于我们开发而言;常见的编码 GBK  UTF-8  ISO-8859-1* 文字--->(数字) :编码。 “abc”.getBytes()  byte[]* (数字)--->文字  : 解码。 byte[] b={97,98,99}  new String(b) 

15字符输出流写文本FileWriter类

* A: 字符输出流写文本FileWriter类* a: 方法介绍*  void write(int c)*  写入单个字符* void write(String str)  * 写入字符串* void write(String str, int off, int len) * 写入字符串的某一部分* void write(char[] cbuf)  * 写入字符数组* abstract  void write(char[] cbuf, int off, int len)  *  写入字符数组的某一部分* b: 案例代码/**   字符输出流*     java.io.Writer 所有字符输出流的超类*   写文件,写文本文件*   *   写的方法 write*     write(int c) 写1个字符*     write(char[] c)写字符数组*     write(char[] c,int,int)字符数组一部分,开始索引,写几个*     write(String s) 写入字符串*     *   Writer类的子类对象 FileWriter*   *   构造方法:  写入的数据目的*     File 类型对象*     String 文件名*     *   字符输出流写数据的时候,必须要运行一个功能,刷新功能*   flush()*/public class WriterDemo {public static void main(String[] args) throws IOException{FileWriter fw = new FileWriter("c:\\1.txt");//写1个字符fw.write(100);fw.flush();//写1个字符数组char[] c = {'a','b','c','d','e'};fw.write(c);fw.flush();//写字符数组一部分fw.write(c, 2, 2);fw.flush();//写如字符串fw.write("hello");fw.flush();fw.close();}}

16字符输入流读取文本FileReader类

* A: 字符输入流读取文本FileReader类* a: 方法介绍*  int read() * 读取单个字符* int read(char[] cbuf) * 将字符读入数组* abstract  int read(char[] cbuf, int off, int len)  * 将字符读入数组的某一部分。* b: 案例代码/**  字符输入流读取文本文件,所有字符输入流的超类*    java.io.Reader*  专门读取文本文件*  *  读取的方法 : read()*   int read() 读取1个字符*   int read(char[] c) 读取字符数组*   *   Reader类是抽象类,找到子类对象 FileReader*   *   构造方法: 绑定数据源*     参数:*        File  类型对象*        String文件名*/public class ReaderDemo {public static void main(String[] args) throws IOException{FileReader fr = new FileReader("c:\\1.txt");/*int len = 0 ;while((len = fr.read())!=-1){System.out.print((char)len);}*/char[] ch = new char[1024];int len = 0 ;while((len = fr.read(ch))!=-1){System.out.print(new String(ch,0,len));}fr.close();}}

17flush方法和close方法区别

* A: flush方法和close方法区别*a: flush()方法* 用来刷新缓冲区的,刷新后可以再次写出,只有字符流才需要刷新*b: close()方法* 用来关闭流释放资源的的,如果是带缓冲区的流对象的close()方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写出 

18字符流复制文本文件

* A: 字符流复制文本文件* a: 案例代码/**  字符流复制文本文件,必须文本文件*  字符流查询本机默认的编码表,简体中文GBK*  FileReader读取数据源*  FileWriter写入到数据目的*/public class Copy_2 {public static void main(String[] args) {FileReader fr = null;FileWriter fw = null;try{fr = new FileReader("c:\\1.txt");fw = new FileWriter("d:\\1.txt");char[] cbuf = new char[1024];int len = 0 ;while(( len = fr.read(cbuf))!=-1){fw.write(cbuf, 0, len);fw.flush();}}catch(IOException ex){System.out.println(ex);throw new RuntimeException("复制失败");}finally{try{if(fw!=null)fw.close();}catch(IOException ex){throw new RuntimeException("释放资源失败");}finally{try{if(fr!=null)fr.close();}catch(IOException ex){throw new RuntimeException("释放资源失败");}}}}}

19总结

* 把今天的知识点总结一遍。

这篇关于java IO之OutputStream和InputStream的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/721573

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定