Java IO流

IO流是用来处理设备之间的数据传输的,Java对数据的操作都是使用流的方式处理的,而且Java将处理流的操作封装成IO流对象了。

一、IO流的分类

流按照操作的数据分为:字节流、字符流

流按照流的方向分为:输入流、输出流

io流

二、字节流:

inputString------此抽象类是表示字节输入流的所有类的超类。

inputStream提供的方法

inputStream

inputStream是输入流,是应用程序读取数据的方式,而read()方法就是InputStream读取数据的方式

从API中可以看到,read()方法一共有三种

(1)int b=in.read();

  从输入流中读取数据的下一个字节,返回0到255范围内的int字节值,如果读到流的末尾就返回-1

public static void main(String[] args) throws IOException {InputStream in=new FileInputStream("E:\\learnJava\\hello.txt");int by=0;while((by=in.read())!=-1){ //判断是否读到流的末尾System.out.println(by);}in.close();       //使用完,记得关闭}

 

(2)public int read(byte[] buf)

   从输入流中读取一定数量的字节,并将其存储在缓冲区数组 buf中,将读取的第一个字节存储在元素 buf[0] 中,下一个存储在 buf[1] 中,依次类推。读取的字节数最多等于 b 的长度。返回的是实际读取的字节个数,如果读到流的末尾依旧返回-1;

public static void main(String[] args) throws IOException {InputStream in=new FileInputStream("E:\\learnJava\\hello.txt");  //创建流对象,如果文件不存在抛出FileNotFoundException/*int by=0;*/byte [] buf=new byte[1024];int   len=0;               //记录读取的字节个数while((len=in.read(buf))!=-1){ //判断是否读到流的末尾System.out.println(new String(buf,0,len));}in.close();                 //使用完,记得关闭}

(3)public int read(byte[] buf, int start, int len)

将输入流中长度不超过len的数据字节读入数组,从数组的start位置开始存储,也就是说将读取的第一个字节存储在元素 b[start] 中,下一个存储在 b[start+1] 中,依次类推。读取的字节数最多等于 len。返回值仍然是读取的字节个数,如果读到流的末尾则返回-1.

public static void main(String[] args) throws IOException {InputStream in=new FileInputStream("E:\\learnJava\\hello.txt");  //创建流对象,如果文件不存在抛出FileNotFoundException/*int by=0;*/byte [] buf=new byte[1024];int   len=0;               //记录读取的字节个数while((len=in.read(buf,0,5))!=-1){ //判断是否读到流的末尾System.out.println(new String(buf,0,len));}in.close();                 //使用完,记得关闭}

OuputStream-------此抽象类是表示输出字节流的所有类的超类

OutputStream提供的方法

outputStream

outputstream是输出流,提供了应用程序写出数据的方式,提供了三种write()方法

(1)public abstract void write(int b)

将指定的字节写入次输出流中,即将参数b的低八位写入到输出流,b的高24位将被忽略

OutputStream os=new FileOutputStream("E:\\learnJava\\hello.txt");int b=100;os.write(b);os.close();

 

(2)public void write(byte[] b)

将b.length个字节从指定的byte数组写入此输入流,即将数组b中的所有字节一次写入输出流中。

public static void main(String[] args) throws IOException {InputStream in=new FileInputStream("E:\\learnJava\\1.txt");OutputStream os=new FileOutputStream("E:\\learnJava\\hello.txt");int b=100;byte [] buf=new byte[in.available()];int len=0;while((len=in.read(buf))!=-1){ //将输入流保存到byte数组中os.write(buf);            //将byte数组中的字节写入到输出流
           }in.close();os.close();}

其实上面的例子也实现了文件的复制功能

(3)public void write(byte[] b, int off, int len)

将制定byte数组中从第off个字节开始,len个字节写入此输出流,元素 b[off] 是此操作写入的第一个字节,b[off+len-1] 是此操作写入的最后一个字节。

public static void main(String[] args) throws IOException {InputStream in=new FileInputStream("E:\\learnJava\\1.txt");OutputStream os=new FileOutputStream("E:\\learnJava\\hello.txt");int b=100;byte [] buf=new byte[in.available()];int len=0;while((len=in.read(buf,0,5))!=-1){ //将输入流保存到byte数组中os.write(buf,0,5);            //将byte数组中的字节写入到输出流
           }in.close();os.close();}

这种方法和上一种方法一样,只是限制了读取的字节个数

(4)public void flush() 方法

刷新此输出流并强制写出所有缓冲的输出字节。也就是输出流字节传给操作系统,具体实现写入磁盘的操作有操作系统实现。

(5)public void close()

关闭此输出流并释放与此流有关的所有系统资源

inputSteam和OutputStream的子类

(1)FileInputStream和FileOutputStream

FileInputStream 从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。 FileInputStream 用于读取诸如图像数据之类的原始字节流。

FileOutputStream文件输出流是用于将数据写入 FileFileDescriptor 的输出流。文件是否可用或能否可以被创建取决于基础平台。FileOutputStream 用于写入诸如图像数据之类的原始字节的流。

其实上面基本都是以FileinputStream和FileOutStream为例,此处在贴一个复制图片的例子,实现方法都是一样的。

public static void main(String[] args){FileInputStream fin=null;FileOutputStream fos=null;byte []buf=new byte[1024];int len=0;try {fin=new FileInputStream("E:\\learnJava\\io流.jpg");fos=new FileOutputStream("E:\\learnJava\\temp.jpg");while((len=fin.read(buf))!=-1){fos.write(buf);}} catch (IOException e) {e.printStackTrace();}finally {try {fin.close();fos.close();} catch (IOException e) {// TODO Auto-generated catch block
                e.printStackTrace();}}}

(2)BufferedInputStream和BufferedOutputStream

FileInputStream和FileOutputStream是不带缓冲区的,每次读取写入时都需要我们自己写一个byte数组充当缓冲区,而BufferedInputStream和BufferedOutputStream是实现缓冲的输入输出流

BufferedInputStream

在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。

BufferedOutputStream该类实现缓冲的输出流。

public static void main(String[] args){FileInputStream fin=null;FileOutputStream fos=null;try {fin = new FileInputStream("E:\\learnJava\\风吹麦浪.mp3");fos=new FileOutputStream("E:\\learnJava\\风吹麦浪_副本.mp3");} catch (FileNotFoundException e1) {// TODO Auto-generated catch block
            e1.printStackTrace();}BufferedInputStream bin=new BufferedInputStream(fin);BufferedOutputStream bos=new BufferedOutputStream(fos);int len=0;try {while((len=bin.read())!=-1){bos.write(len);}} catch (IOException e) {// TODO Auto-generated catch block
            e.printStackTrace();}finally {try {bin.close();bos.close();fin.close();fos.close();} catch (IOException e) {// TODO Auto-generated catch block
                e.printStackTrace();}}}

(3)DataInputStream和DataOutputStream

DataInputStream数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。

DataOutputStream数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。

public static void main(String[] args) throws IOException{//规避一下IO异常//输出DataOutputStream dos=new DataOutputStream(new FileOutputStream("E:\\learnJava\\dataOs.txt"));dos.writeInt(100);dos.writeLong(10l);dos.writeInt(-100);dos.writeChar('A');dos.writeUTF("中国");//采用UTF-8编码dos.writeChars("中国");//采用utf-16be编码//读取DataInputStream din=new DataInputStream(new FileInputStream("E:\\learnJava\\dataOs.txt"));System.out.println(din.readInt());  //读取存入的第一个int 100System.out.println(din.readLong());//读取long数据System.out.println(din.readInt());System.out.println(din.readChar()); //读取charSystem.out.println(din.readUTF()); //读取UTF
            }

三、字符流

字符流操作的是文本文件,是文本(char)序列按照某种编码方案(unt-8,utf-16be,gbk)序列化而成的文件。

Reader-------用于读取字符流的抽象类

Reader提供 的方法

Reader

(1)public int read() -----读取单个字符

返回值是作为整数读取的字符,范围在 0 到 65535 之间 (0x00-0xffff),如果已到达流的末尾,则返回 -1

public static void main(String[] args) throws IOException{//规避一下IO异常
             Reader reader=new FileReader("E:\\learnJava\\HelloReader.txt");//保证文件存在,否则抛出FileNotFoundExceptionint ch=0;while((ch=reader.read())!=-1){System.out.println((char)ch);}reader.close();}

(2)public int read(char[] cbuf) ----将字符读入数组

返回值为读取的字符数,如果已到达流的末尾,则返回 -1 ;

public static void main(String[] args) throws IOException{//规避一下IO异常
             Reader reader=new FileReader("E:\\learnJava\\HelloReader.txt");//保证文件存在,否则抛出FileNotFoundExceptionchar [] buf=new char[1024];int len=0;while((len=reader.read(buf))!=-1){System.out.println(new String(buf, 0, len));}reader.close();}

(3)public abstract int read(char[] cbuf, int off, int len) ----将字符读入数组的某一部分

Writer------写入字符流的抽象类

writer提供的方法

Writer

public static void main(String[] args) throws IOException{//规避一下IO异常Writer writer=new FileWriter("E:\\learnJava\\HelloWriter.txt");writer.write(100);        //写入一个字符writer.write("你好,Java");//写入一个字符串char [] buf=new char[]{'A','B','',''};writer.write(buf, 0, buf.length);   //写入一个字符数组String str=new String("使用Writer");writer.write(str, 2, 6);writer.close();          }

reader和writer的子类

(1)InputStreamReader和OutputStreamWriter------实现字符流和字节流的转换

InputStreamReader 是字节流通向字符流的桥梁:每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。

public static void main(String[] args) throws IOException{//规避一下IO异常
         InputStreamReader isr=new InputStreamReader(new FileInputStream("E:\\learnJava\\绕口令.txt"),"gbk");//指出文件的编码方式char [] buf=new char[1024];int len=0;while((len=isr.read(buf, 0, buf.length))!=-1){System.out.println(new String(buf,0,len));}isr.close();}

其他方法:

inputRea

OutputStreamWriter 是字符流通向字节流的桥梁,每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积。可以指定此缓冲区的大小,不过,默认的缓冲区对多数用途来说已足够大。注意,传递给 write() 方法的字符没有缓冲。

实例:文件的复制

public static void main(String[] args) throws IOException{//规避一下IO异常
         InputStreamReader isr=new InputStreamReader(new FileInputStream("E:\\learnJava\\绕口令.txt"),"gbk");//指出文件的编码方式/*创建一个FileWriter对象,该对象一被初始化,就必须要明确被操作的文件. 而且该文件会被创建到指定目录下,如果该目录下已有同名的文件,将被覆盖。 其实该步就是明确数据要存放的目的地*/ OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("E:\\learnJava\\绕口令_副本.txt"), "gbk");char [] buf=new char[1024];int len=0;while((len=isr.read(buf, 0, buf.length))!=-1){osw.write(buf, 0, len);          // 写入字符数组的某一部分。
         }isr.close();osw.close();}

其他方法

outWr

(2)FileReader和FileWriter------直接操作文件

public static void main(String[] args) throws IOException{//规避一下IO异常FileReader fReader=new FileReader("E:\\learnJava\\笑话大全.txt");//直接写文件路径,或者文件对象FileWriter fWriter=new FileWriter("E:\\learnJava\\笑话大全_副本.txt");//输出到文件,没有则创建新的,有则覆盖,没有编码方式(不同编码方式会有乱码)int len=0;char [] buf=new char[1024];while((len=fReader.read(buf,0,buf.length))!=-1){fWriter.write(buf,0,len);fWriter.flush();}fReader.close();fWriter.close();}

(3)BufferedReader和BufferedWriter-----字符流的过滤器

BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

方法public String readLine() 实现读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。

 

BufferedWriter将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

public static void main(String[] args) throws IOException{//规避一下IO异常//文件的读操作//使用BufferedReader提高读的效率BufferedReader bReader=new BufferedReader(new InputStreamReader(new FileInputStream("E:\\learnJava\\笑话大全.txt"),"gbk"));//文件输出BufferedWriter bWriter=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("E:\\learnJava\\笑话大全_副本2.txt"),"gbk"));String line;while((line=bReader.readLine())!=null){/*System.out.println(line);    //一次读一行,line并没有实现换行*/      bWriter.write(line);    bWriter.newLine();//实现换行
            bWriter.flush();}bReader.close();bWriter.close();}

其中BufferedWriter可以使用PrintWrite代替,会更方便

public static void main(String[] args) throws IOException{//规避一下IO异常//文件的读操作//使用BufferedReader提高读的效率BufferedReader bReader=new BufferedReader(new InputStreamReader(new FileInputStream("E:\\learnJava\\笑话大全.txt"),"gbk"));//文件输出/*  BufferedWriter bWriter=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("E:\\learnJava\\笑话大全_副本2.txt"),"gbk"));*/PrintWriter pWriter=new PrintWriter("E:\\learnJava\\笑话大全_副本3.txt");String line;while((line=bReader.readLine())!=null){/*System.out.println(line);    //一次读一行,line并没有实现换行*/      /* bWriter.write(line);    bWriter.newLine();//实现换行bWriter.flush();*/pWriter.println(line);  //println自带换行
            pWriter.flush();} bReader.close();/* bWriter.close();*/}

转载于:https://www.cnblogs.com/Actexpler-S/p/7588518.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 模糊查询用法_mysql进阶(六)模糊查询的四种用法介绍

mysql中模糊查询的四种用法介绍这篇文章主要介绍了mysql中模糊查询的四种用法,需要的朋友可以参考下。下面介绍mysql中模糊查询的四种用法:1 %:表示任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个…

Nature:FB和推特的数据是如何革新社会科学,改变世界的?

大数据文摘出品来源:nature编译:张睿毅2007年,一群有野心的科学家召集了一次会议,讨论新兴的社会科学数据处理的艺术。他们想运用自己的技能来改变世界。在演讲中,马萨诸塞州剑桥市哈佛大学的政治学家加里金&#xff0…

改变文件权限的用户身份

进程的有效用户ID必须是文件的所有者或超级用户转载于:https://www.cnblogs.com/justart/p/7591010.html

python合并两个属性_合并两个部分包含文件列表及其属性的最有效方法

我有一个系统,该系统运行带有ls或dir命令的变体的自定义cli,并返回工作目录中文件和文件夹的列表。问题是,我可以使用带标志的命令运行命令,该标志返回文件及其时间戳(创建和最后修改的日期),或者返回一个标志返回文件…

格力入局的数控机床,掌握“核心科技”有多难?

来源:脑极体梦想还是要有的,万一要实现了呢?即便不能马上实现,坚持努力也是可以的。2016年,在格力主办的“第二届中国制造高峰论坛”上,董明珠曾放出这样的豪言壮语:两年后,做出最顶…

C#AE创建FeatureDataset/创建数据、集要素集

核心代码 1 IWorkspaceFactory pFactory new AccessWorkspaceFactoryClass();//这里需要在program.cs中添加desktop绑定 2 IWorkspace pWorkspace pFactory.OpenFromFile(temMDBpath, 0);//这里要求具备axLiscense,可以添加控件添加或代码添加 3…

留言板asp mysql_ASP简单入门(制作一个简单的留言板 )

语句……%><2>定义变量dim语句dim a,ba10b”ok!”%>注意&#xff1a;定义的变量可以是数值型&#xff0c;也可以是字符或者其他类型的<3>简单的控制流程语句1. If 条件1 then语句1elseif 条件2 then语句2else语句3endif2.while 条件语句wend3.for count1 to …

深度解析:国产化软硬件全景梳理

本文来源&#xff1a;信创研究框架作者&#xff1a;谢春生、郭雅丽、郭梁良、金兴内容包括产业概括&#xff0c;发展背景、推进节奏和产业全景图&#xff0c;云计算全栈架构、产业链全景图。核心技术&#xff0c;CPU处理器、操作系统、中间件、办公套件、安全保密等。芯片处理器…

适配器模式(类适配器)

java设计模式大体分为23种设计模式&#xff0c;直接通过例子学习设计模式&#xff0c;更易于理解和思考其中的原理和作用&#xff0c;以下给出 适配器模式 的第一种(一个有三种)的demo&#xff0c;叫做类适配器模式&#xff1a; MainRun.java类&#xff0c;是程序运行入口&…

空间连接时计算总和_学习CALCULATE函数(六)丨帕累托之累计求和

(写在前面的话&#xff1a;非常感谢韭菜大神和冬神的指点&#xff0c;万分感谢。)哎&#xff0c;说归说&#xff0c;还是需要继续学习CALCULATE函数&#xff0c;也是蛮无奈的。最近白茶在研究帕累托分析法&#xff0c;本期分享一下帕累托ABC分析法的基础——累计求和。这里简要…

揭秘仿人机器人背后的技术秘密 | 优必选研究院技术专家刘益彰【附PPT】

来源&#xff1a;机器人大讲堂机器人大讲堂直播间037期目前国际上主要有两种控制方式的仿人机器人&#xff1a;一种是基于位置控制的仿人机器人&#xff0c;另一种是基于力矩控制的仿人机器人。由于类人运动的功能的多样性、复杂性以及高维度性&#xff0c;所以仿人机器人的研究…

luoguP1463:反素数ant(打表心得☆)

题目描述对于任何正整数x&#xff0c;其约数的个数记作g(x)。例如g(1)1、g(6)4。如果某个正整数x满足&#xff1a;g(x)>g(i) 0<i<x&#xff0c;则称x为反质数。例如&#xff0c;整数1&#xff0c;2&#xff0c;4&#xff0c;6等都是反质数。现在给定一个数N&#xff0…

席南华院士:数学的意义

本文转自返朴公众号2020年5月30日&#xff0c;中国科学院院士、中国科学院数学与系统科学研究院研究员席南华受邀作远程报告“数学的意义”&#xff0c;从数学的发展史、数学的特性、数学巨匠的一些观点以及数学美的含义等多个角度讲述了数学的意义。本文为报告文字整理版&…

java简单小项目_Java简易抽奖系统小项目

本文实例为大家分享了Java简易抽奖系统的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下需求&#xff1a;实现一个抽奖系统1 注册2 登录3 抽奖必须先注册 再登陆 再抽奖随机产生4个随机数作为幸运卡号用户注册后 登录的时候 用户名密码输入判断只有三次机会需要做…

2017-9-26 NOIP模拟赛

NOIP 2017 全真模拟冲刺 ---LRH&&XXY 题目名称 那些年 铁路计划 毁灭 题目类型 传统 传统 传统 可执行文件名 years trainfare destroy 输入文件名 years.in trainfare.in d…

protobuf java any_protobuf3笔记

Protobuf3笔记文件后缀定义Proto的文件应以.proto为后缀。语法版本Proto文件的首行应指定语法版本&#xff1a;syntax "proto3"; // "proto2"定义字段在消息中&#xff0c;每个字段以下列方式定义&#xff1a;type filed "" tag ";"如…

108页报告一文看懂光刻机,看国产替代如何破局【附下载】

来源&#xff1a;方正证券光刻机是人类文明的智慧结晶&#xff0c;被誉为半导体工业皇冠上的明珠。光刻机作为前道工艺七大设备之首&#xff0c;价值含量极大&#xff0c;在制造设备投资额中单项占比高达23%&#xff0c;技术要求极高&#xff0c;涉及精密光学、精密运动、高精度…

【bzoj 3601】一个人的数论 (莫比乌斯反演+伯努利数)

题解&#xff1a; &#xff08;吐槽&#xff1a;网上题解那个不严谨猜测真是没谁了……关键是还猜得辣么准……&#xff09; 直接化简到求和那一段&#xff1a; $f_{d}(n)\sum_{t|n}\mu(t)t^{d}\sum_{i1}^{\frac{n}{t}}i^{d}$ $设S_{d}(T)\sum_{i1}^{T}i^{d}$ 那这个是什么呢&a…

院士论坛|李德仁:测绘遥感与智能驾驶

来源&#xff1a;测绘学报未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#xff08;城市&#xff09;云脑研究计划&#xff0c;构建互联网&#xff08;城市&#xff09;云脑技术和企业图谱…

ansible编译httpd playbook示例

以下是playbook的内容。它的处理流程是&#xff1a; 1.先在本地下载apr,apr-util,httpd共3个.tar.gz文件。 2.解压这3个文件。 3.安装pcre和pcre-devel依赖包。 4.编译安装apr。 5.编译安装apr-util。 6.编译安装httpd。 ---- hosts: alltasks: - name: download apr,apr-util,…