java listen_Java进阶-IO基础

计算机最重要的功能是处理数据。一个有用的计算机语言需要拥有良好的IO功能,以便让未处理的数据流入程序,让已处理的数据流出。

与其他语言相比,Java的IO功能显得复杂。在其他语言中,许多IO功能(比如读取文件),是被封装好的,可以用一两行程序实现。在Java中,程序员往往需要多个层次的装饰(decoration),才能实现文件读取。

相对的复杂性带来的好处是IO的灵活性。在Java中,程序员可以控制IO的整个流程,从而设计出最好的IO方式。我们将在下文看到更多。

IO示例

下面是我用于演示的文件file.txt

Hello World!

Hello Nerd!

我们先来研究一个文件读取的例子:

import java.io.*;

public class Test {

public static void main(String[] args) {

try {

BufferedReader br = new BufferedReader(new FileReader("file.txt"));

String line = br.readLine();

while (line != null) {

System.out.println(line);

line = br.readLine();

}

br.close();

} catch (IOException e) {

System.out.println("IO Problem");

}

}

}

这段程序中包含一个try...catch...finally的异常处理器。可参考Java进阶02 异常处理

装饰器与功能组合

程序IO的关键在于创建BufferedReader对象br:

BufferedReader br = new BufferedReader(new FileReader("file.txt"));

在创建的过程中,我们先建立了一个FileReader对象,这个对象的功能是从文件"file.txt"中读取字节(byte)流,并转换为文本流。在Java中,标准的文本编码方式为unicode。BufferedReader()接收该FileReader对象,并拓展FileReader的功能,新建出一个BufferedReader对象。该对象除了有上述的文件读取和转换的功能外,还提供了缓存读取(buffered)的功能。最后,我们通过对br对象调用readLine()方法,可以逐行的读取文件。

(缓存读取是在内存中开辟一片区域作为缓存,该区域存放FileReader读出的文本流。当该缓存的内容被读走后(比如readLine()命令),缓存会加载后续的文本流。)

BufferedReader()是一个装饰器(decorator),它接收一个原始的对象,并返回一个经过装饰的、功能更复杂的对象。修饰器的好处是,它可以用于修饰不同的对象。我们这里被修饰的是从文件中读取的文本流。其他的文本流,比如标准输入,网络传输的流等等,都可以被BufferedReader()修饰,从而实现缓存读取。

下图显示了br的工作方式,数据自下而上流动:

97d68ee5168c686e4cb392043ae972aa.png

上述的装饰过程与Linux中的文本流思想很相似。在Linux中,我们使用类似函数的方式来处理和传递文本流。在Java中,我们使用了装饰器。但它们的目的都类似,就是实现功能的模块化和自由组合。

更多的组合

事实上,Java提供了丰富的装饰器。FileReader中合并了读取和转换两个步骤,并采用了常用的默认设置,比如编码采取unicode。我们可以使用FileInputStream + InputStreamReader的组合来替代FileReader,从而分离读取字节和转换两个步骤,并对两个过程有更好的控制。

(当然,FileReader的使用更加方便。InputStreamReader是将FileInputStream转换成一个Reader,用于处理unicode文本)

4372ff883dc9f2e8de2203ac673ea581.png

箭头表示数据流动方向

流的读写来自于四个基类: InputStream, OutputStream, Reader和Writer。InputStream和Reader是处理读取操作,OutputStream和Writer是处理写入操作。它们都位于java.io包中。继承关系如下:

b82fe92706b79b2b5c43bd44065d12ec.gif

java.io

此外,IOException有如下衍生类:

edf610ff67cda55bab53302d766d96e7.gif

IOException

Reader和Writer及其衍生类是处理unicode文本。如我们看到的Buffered Reader, InputStreamReader或者FileReader。

InputStream和OutputStream及其衍生类是处理字节(byte)流。计算机中的数据都可以认为是字节形式,所以InputStream和OutputStream可用于处理更加广泛的数据。比如我们可以使用下面的组合来读取压缩文件中包含的数据(比如整数):

4596bc91e0d4b0091b5b34af58b9bb2e.png

箭头表示数据流动方向

我们从压缩文件中读出字节流,然后解压缩,最终读出数据。

写入

写入(write)操作与读取操作相似。我们可以通过使用装饰,实现复杂的写入功能。这里是一个简单的写入文本的例子:

import java.io.*;

public class Test {

public static void main(String[] args) {

try {

String content = "Thank you for your fish.";

File file = new File("new.txt"); // create the file if doesn't

// exists

if (!file.exists()) {

file.createNewFile();

}

FileWriter fw = new FileWriter(file.getAbsoluteFile());

BufferedWriter bw = new BufferedWriter(fw);

bw.write(content);

bw.close();

} catch (IOException e) {

System.out.println("IO Problem");

}

}

}

上面创建了file对象,用于处理文件路径。

总结

这里只是对Java IO的基本介绍。Java的IO相对比较复杂。Java程序员需要花一些时间来熟悉java.io中的类及其功能。

By Facker:

package blogjavaTest;

import java.io.*;

/**

* @author Facker

* @title Reader Writer

* @value 文件的写入和读出

*/

public class Test {

void test() {

try {

String content = "Thank you for Vamei.";

File file = new File("F:new.txt"); // create the file if doesn't

// exists

if (!file.exists()) {

file.createNewFile();

}

FileWriter fw = new FileWriter(file.getAbsoluteFile());

BufferedWriter bw = new BufferedWriter(fw);

bw.write(content);

bw.close();

} catch (IOException e) {

System.out.println("IO Problem");

}

}

void test1() {

try {

BufferedReader br = new BufferedReader(new FileReader("F:new.txt"));

String line = br.readLine();

while (line != null) {

System.out.println(line);

line = br.readLine();

}

br.close();

} catch (IOException e) {

System.out.println("IO Problem");

}

}

public static void main(String[] args) {

Test s = new Test();

s.test(); // 写入

s.test1();// 读出

}

}

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

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

相关文章

gorm preload 搜索_文件太多忘记了文件放在什么地方?那你可以试试这款文件搜索工具...

忘记了文件放在什么地方?文件太多不能一下子找到?那么你也许可以试试这款软件——ProFind for mac版,这是一款适用于macOS系统的文件搜索工具,它具有强大的功能和出色的性能,可为macOS提供高级文件搜索,并支…

JAVA vector的遍历_谈谈vector容器的三种遍历方法

说明:本文仅供学习交流。转载请标明出处。欢迎转载!vector容器是最简单的顺序容器,其用法相似于数组。实际上vector的底层实现就是採用动态数组。在编敲代码的过程中。经常会变量容器中的元素,那么怎样遍历这些元素呢?…

c++ ftp服务端_FTP客户端软件介绍及使用

FTP客户端软件介绍及使用 客户端软件: ftp,lftp,lftpget,wget,curl ftp -A ftpserver port -A 主动模式 –p 被动模式 lftp –u username ftpserver lftp usernameftpserver lftpget ftp://ftpserver/pub/file gftp&am…

java中怎么使用json数据_JAVA中使用JSON进行数据传递

1.是不是只有xml传递数据的技术才是webservice?可以这么理解。webservice是基于SOAP协议,SOAP协议是基于XML的文本协议。所以webservice可以简单理解为是基于XML的传输技术,好比HTML是基于文本的传输协议。2.servlet是服务端的java程序的统称…

java 限制参数类型_java定义受限制的类型参数操作

有时您可能想限制可以在参数化类型中用作类型参数的类型。 例如,对数字进行操作的方法可能只希望接受Number或其子类的实例。 这就是有界类型参数的用途。受限制参数类型的方法示例要声明有界类型参数,请列出类型参数的名称,后跟extends关键字…

安卓手机运行ios教程_英雄联盟手游傻瓜安装教程,IOS/安卓双端可用!

软件/资料获取方式在文末正文:前几天发哥预告了一下LOL手游上线的事,本来以为国服也会同步上线,结果也是意料之中的跳票了,让我不禁想起当年玩魔兽世界时国服万年的TBC,不过据说LOL推迟上线是怕影响王者荣耀5周年庆典&…

java版本lstm_LSTM java 实现

由于实验室事情缘故,需要将Python写的神经网络转成Java版本的,但是python中的numpy等啥包也不知道在Java里面对应的是什么工具,所以索性直接寻找一个现成可用的Java神经网络框架,于是就找到了JOONE,JOONE是一个神经网络…

easy excel date 类型解析报错_ptarchiver原理解析

pt-archiver原理解析作为MySQL DBA,可以说应该没有不知道pt-archiver了,作为pt-toolkit套件中的重要成员,往往能够轻松帮助DBA解决数据归档的问题。例如线上一个流水表,业务仅仅只需要存放最近3个月的流水数据,三个月前…

python中np没有定义_python中的np.empty_python – np.empty,np.zeros和np.one

我很好奇它使用np.empty而不是np.zeros实际上有多大差异,还有关于np.ones的差异.我运行这个小脚本来测试每个创建一个大型数组所需的时间:import numpy as npfrom timeit import timeitN 10_000_000dtypes [np.int8, np.int16, np.int32, np.int64,np.uint8, np.u…

设计师电脑推荐笔记本_笔记本电脑选购推荐全攻略

笔记本电脑现如今在我们的生活中出镜率如此之高,不论是学生党查阅资料还是上班族的忙碌办公,抑或是电竞爱好者的游戏体验,都要依靠笔记本电脑来完成,但对于它的选购方法你了解多少?一千个人就有一千种不同的标准&#…

java s1_转!!Java 基础面试题的剖析: short s1=1;s1 = s1 +1 报错? s1+=1 呢

package common;public class ShortTypeTest {/** param args*/public static void main(String[] args) {// TODO Auto-generated method stubshort s1 1; s1 (short) (s1 1);//简单类型short s21; s2 1;//复合类型,复合赋值操作符,System.out.println(s1";"s2);…

python内循环只执行一次_如何1分钟内从3600只股种选出黑马股,仅分享这一次(太透彻了)...

“1234”操盘定理中,1是指如何持牛股,2是指观念要正确,3是指看破十个现象,4是指抓热点。具体讲解下选股步骤盘后我们怎么去快速选出超短线需要密切关注的票呢?其实选股方法少说也有几千种,我想没有人统计过&#xff0…

java 运行时类型_Java基础之RTTI 运行时类型识别

运行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息。多态(polymorphism)是基于RTTI实现的。RTTI的功能主要是由Class类实现的。Class类Class类是"类的类"(class of classes)。如果…

指定的服务已经标记为删除_你的电话号码被标记过吗?你知道这件事情还能赚钱吗?...

今天闲来无事和大家唠唠赚钱的小副业。“电话标记”,我被这事困惑了很多年,最近解决了,同时还发现,这个信息差能挣钱,文末还给到方法,执行力强的伙伴原样照做,0成本,马上开搞&#x…

mplab x ide 中文使用手册_SCI必备利器:翻译又快又准,强推这款超牛X的神器!...

随手转发给好友和朋友圈 编辑:科研小通再分享一款翻译神器,不用调用Google服务器,速度超快。实时翻译,服务器速度杠杠的。今天给大家安利一款超牛X的翻译神器:Mate Translate。官网首页https://gikken.co/mate-transla…

python流行趋势_Python流行度再创新高,学Python就从风变编程开始

10月初,全球编程语言社区TIOBE公布了2020年10月编程语言排行榜,排名情况相较前几个月变化不大,前十名分别为C、Java、Python、C 、C#、Visual Basic、JavaScript 、PHP、R和SQL。其中,Python继续稳居第三,且其受欢迎度…

8086汇编4位bcd码_238期中4头3尾,排列五第19239期爱我彩规

爱我彩规专业研究(七星彩、排列五) 前四位的铁码与定位规,有幸开通爱我彩规公众号,努力为大家提供稳定的号码参考。作者微信号awc1125。 逢星期二和星期天不在彩码课堂公众号转发,因星期二和星期天每日八篇巳排满,只发爱我彩规公…

python通过链接下载文件-如何使用Python通过HTTP下载文件?

import urllib urllib.urlretrieve ("http://www.example.com/songs/mp3.mp3", "mp3.mp3") (用于Python 3)import urllib.request和urllib.request.urlretrieve) 还有一个有“进度栏”的import urllib2 url "http://download.thinkbroadband.com/10M…

centos6.5 编译安装mysql_Centos6.5编译安装mysql 5.7.14详细教程

此文实例给亲们分享了CENTOS6.5 编译mysql 5.7.14安装配置方法,供大家参考,具体内容如下mysql5.7.14 编译安装在自定义文件路径下下载安装包配置安装环境编译安装cmake\-DCMAKE_INSTALL_PREFIX/data/db5714 \-DMYSQL_DATADIR/data/db5714/var \-DMYSQL_U…

时间插件只能选择整点和半点_我花一小时自制了三款PPT插件,不仅免费分享,还想手把手教你制作...

更准确的说,三顿花一小时给PPT里这个天天和你见面的功能区做了一次彻底的整容:我精简了好多根本用不到的功能,还添加了一大波可以让你效率翻倍的一键操作,比如一键拆分文字,一键美化图表等等。这样的改头换面操作起来一…