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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

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

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

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;从数学的发展史、数学的特性、数学巨匠的一些观点以及数学美的含义等多个角度讲述了数学的意义。本文为报告文字整理版&…

2017-9-26 NOIP模拟赛

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

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;云脑技术和企业图谱…

深度报告:一文看懂生物芯片产业

来源&#xff1a;赛迪顾问生物芯片技术起源于二十世纪八十年代&#xff0c;也被称为“微流控技术”、“芯片实验室”等。生物芯片技术能够在邮票大小的芯片上&#xff0c;进行较为复杂的生物、化学、物理等实验&#xff0c;为制作成本低、样本少、时间短、操作简单的医疗仪器提…

人机融合的难点

来源&#xff1a;人机与认知实验室【一个深度态势感知者的周围充满了各种各样的暗示和提醒。】“我小时候读过很多科幻小说。其中一个最常见的主题是“人与机器”&#xff0c;它经常以机器人的形式变得自我意识和威胁人类。这一主题也成为了《终结者》和《黑客帝国》等好莱坞电…

asp.net core权限模块的快速构建

大部分系统都会有权限模块&#xff0c;别人家系统的权限怎么生成的我不知道&#xff0c;我只知道这样做是可以并且挺好的。 文章中只对asp.net core的部分代码进行说明 呃 记录~&#xff0c;mvc版本自行前往仓库查阅 代码中的一些特性标记后面列出,或前往仓库查看~ 1.根据特性标…

深度长文:AMD的崛起、衰落与复兴

来源&#xff1a;内容编译自「techspot」&#xff0c;谢谢。AMD是最早的大型微处理器设计者之一&#xff0c;近50年来一直是技术爱好者之间争论的话题。它的历史构成了一个激动人心的故事——充满了英雄式的成功&#xff0c;愚蠢的错误。在其他半导体公司来来往往的时候&#x…

数据结构-使用两个栈实现一个队列

1&#xff1a;如何只使用stack实现queue呢&#xff1f;我们知道stack是先进后出的&#xff08;FIFO&#xff09;&#xff0c;而queue是先进先出的&#xff08;FIFO&#xff09;。也就是说&#xff0c;stack进行了一次反向。如果进行两次反向&#xff0c;就能实现queue的功能&am…

5G时代下,边缘计算产品的未来展望

来源&#xff1a;北京物联网智能技术应用协会首发于人人都是产品经理。一、边缘计算市场潜力1. 5G基建如火如荼&#xff0c;万物互联互融将成为新战场2019年6月6号上午工信部宣布正式为中国移动、中国联通、中国电信、中国广电四家企业颁发5G牌照&#xff0c;中国正式进入5G元年…

使用Xcode进行iOS设备无线调试

设备环境&#xff1a;Mac OSX 10.12.5、iOS11、Xcode9PS:这是WWDC2017的新功能&#xff0c;iOS11以上&#xff0c;Xcode9这是刚性要求。这个功能不好找&#xff0c;就记下来了 手机连接上Xcode&#xff0c;打开Xcode菜单&#xff1a;Windows->Device and Simulators。找到连…

java 请求url 返回数据_java后台发起get请求获取响应数据|chu

本文实例为大家分享了java后台发起get请求获取响应数据&#xff0c;供大家参考&#xff0c;具体内容如下学习记录&#xff1a;话不多说直接上代码&#xff1a;package com.jl.chromeTest; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.H…

Android Studio 设置字体

File->Settings->Editor->Colors & Fonts->Font->Editor Font 转载于:https://www.cnblogs.com/WJQ2017/p/7608370.html