java io运用_Java IO相关使用

date: 2020-06-14 14:42:22

updated: 2020-08-21 17:35:45

Java IO相关使用

1. 文件

创建 File 对象的三种方式

一个路径名:File(String pathname)

一个父路径名和子路径名:File(File parent, String child) 或 File(String parent, String child)

一个URI (统一资源标识符):File(URI uri)

有文件时覆盖,无文件时创建。

通过 f.getAbsolutePath() 和 f.getCanonicalPath() 可获取文件的绝对路径和规范路径

f.delete() 会立即删除文件,而 f.deleteOnExit() 会延迟删除,直到JVM调用该方法

File 对象不可变,始终表示文件的路径名。文件经过创建、删除后,File 对象依旧是原始的路径名,并不代表实际的文件。

2. 输入字节流

4187ccf1c3bf6f3b6bf3030058767ec5.png

抽象基类是 InputStream 类,结构关系如下:

InputStream

|

+--FileInputStream

|

+--ByteArrayInputStream

|

+--PipedInputStream

|

+--FilterInputStream

|

+--BufferedInputStream

|

+--PushbackInputStream

|

+--DataInputStream

|

+--ObjectInputStream

基类的基本方法如下:

方法

描述

read()

读取一个字节并将读取的字节作为int返回。当到达输入流的结尾时,它返回-1。

read(byte[] buffer)

读取最大值直到指定缓冲区的长度。它返回在缓冲区中读取的字节数。如果到达输入流的结尾,则返回-1。

read(byte[] buffer,int offset, int length)

读取最大值到指定长度字节。数据从偏移索引开始写入缓冲区。它返回读取的字节数,如果到达输入流的结束它返回-1。

close()

关闭输入流

available()

返回可以从此输入流读取但不阻塞的估计字节数。

2.1 BufferedInputStream

通过缓冲数据向输入流添加功能。维护一个内部缓冲区以存储从底层输入流读取的字节。

import java.io.*;

public static void main(String[] args) throws IOException {

String filePath = "/Users/mxxct/Desktop/md_meter.java";

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));

byte[] buffer = new byte[1024]; // 长度为1024个字节的缓冲区

int len = -1; // 偏移量,或本次读取的字节数

StringBuilder content = null;

// 此次读取的字节数赋值给 len,如果等于 -1 说明已经读完了

while((len = bis.read(buffer)) != -1){

content.append(new String(buffer, 0, len));

}

System.out.println(content);

bis.close();

}

3. 输出字节流

126c1cd3eaf53ecc5d845a680b97282d.png

FileOutputStream fos = new FileOutputStream(destFile); 创建一个 FileOutputStream 对象,如果文件不存在,会尝试创建文件,但必须处理异常 FileNotFoundException,需要放在 try-catch 里面。

如果文件包含数据,数据会被覆盖。如果要追加,需要添加一个第二个参数,true 表示追加。

fos.write(int b)

fos.write(byte[] b)

fos.write(byte[] b, int off, int len)

由于输出的是字节流,所以只能 write int 或 byte[],如果是字符串的话,通过 getBytes() 方法可以返回字节数组

通过 fos.flush() 方法刷新输出流:将 write 里的字节缓存清出,写入到目标处。

4. 管道

管道IO基于生产者--消费者模式,PipedOutputStream 负责把数据写入到管道里,相当于生产者, PipedInputStream 负责读取管道里的数据

两种连接管道的方式

PipedInputStream pis = new PipedInputStream();

PipedOutputStream pos = new PipedOutputStream();

pis.connect(pos); /* Connect the two ends */

PipedInputStream pis = new PipedInputStream();

PipedOutputStream pos = new PipedOutputStream(pis, 2048); // 缓冲区容量为2048字节

当创建管道时,可以设置管道容量。 如果管道的缓冲区已满,则尝试在管道上写入将会被阻止。

5. 字符输入流

56ee07c3a0ced95850870172053e82f4.png

Reader是所有的输入字符流的父类,它是一个抽象类

FilterReader是所有自定义具体装饰流的父类,其子类PushbackReader对Reader对象进行装饰,会增加一个行号

InputStreamReader是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader可以说是一个达到此功能、常用的工具类,在其源代码中明显使用了将FileInputStream转变为Reader的方法。我们可以从这个类中得到一定的技巧。Reader中各个类的用途和使用方法基本和InputStream中的类使用一致。后面会有Reader与InputStream的对应关系。

BufferedReader reader = new BufferedReader(new FileReader(filePath));

String str;

while((str=reader.readLine())!=null){

System.out.println(str);

}

6. 字符输出流

f00436f12c6400f4ff38a3c84cf94434.png

问:字节流与字符流有什么区别?

答:计算机中的一切最终都是以二进制字节形式存在的,对于我们经常操作的字符串,在写入时其实都是先将字符转成对应的字节,然后将字节写入到输出流,在读取时其实都是先读到的是字节,然后将字节直接使用或者转换为字符给我们使用。由于对于字节和字符两种操作的需求比较广泛,所以 Java 专门提供了字符流与字节流相关IO类。

对于程序运行的底层设备来说永远都只接受字节数据,所以当我们往设备写数据时无论是字节还是字符最终都是写的字节流。字符流是字节流的包装类,所以当我们将字符流向字节流转换时要注意编码问题(因为字符串转成字节数组的实质是转成该字符串的某种字节编码)。

字符流和字节流的使用非常相似,但是实际上字节流的操作不会经过缓冲区(内存)而是直接操作文本本身的,而字符流的操作会先经过缓冲区(内存)然后通过缓冲区再操作文件。

1、字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的

2、字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容

3、Reader类的read()方法返回类型为int :作为整数读取的字符(占两个字节共16位),范围在 0 到 65535 之间 (0x00-0xffff),如果已到达流的末尾,则返回 -1

inputStream的read()虽然也返回int,但由于此类是面向字节流的,一个字节占8个位,所以返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。因此对于不能用0-255来表示的值就得用字符流来读取!比如说汉字.

4、字节流与字符流主要的区别是他们的的处理方式

字节流:处理字节和字节数组或二进制对象;

字符流:处理字符、字符数组或字符串。

问:什么是缓冲区?有什么作用?

答:缓冲区就是一段特殊的内存区域,很多情况下当程序需要频繁地操作一个资源(如文件或数据库)则性能会很低,所以为了提升性能就可以将一部分数据暂时读写到缓存区,以后直接从此区域中读写数据即可,这样就显著提升了性能。

对于 Java 字符流的操作都是在缓冲区操作的,所以如果我们想在字符流操作中主动将缓冲区刷新到文件则可以使用 flush() 方法操作。

问:如何选择字节流和字符流?

答:如果是文本文件通常使用字符流,而像视频,图片,音频等文件都是二进制数据使用字节流。当然文本文件也可以使用字节流来操作,字节流更通用。

如果只是复制纯文本文件不做显示操作,哪个流都可以,如果要显示纯文本就用字符流。

问:为什么对于字符流中都有flush方法,但是字节流中没有?

字节流的操作不会经过缓冲区(内存)而是直接操作文本本身的,而字符流的操作会先经过缓冲区(内存)然后通过缓冲区再操作文件。

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

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

相关文章

正在读《密码王朝》,却忍不住先说两句

正在读江苏作家成刚的新作《密码王朝》。这是国内著名恐怖悬疑文学品牌773 悬念系列的最新一本小说。看书名,似有跟风《达芬奇密码》之嫌,但粗看了些文字,感觉还是很中国化。小说涉及了密码破译和使用的一些问题,因而看似枯燥&am…

被遗忘和庸俗化的弗洛伊德:纪念弗洛伊德诞辰150周年(全文)

今年5月6日是弗洛伊德诞辰150周年。不知为什么国内媒体对这样的纪念日出奇地冷淡,只有《中国新闻周刊》做了一个封面故事《弗洛伊德的幽灵》。回想上世纪八十年代,弗洛伊德的理论刚刚进入中国的时候,他的书夸张地说“要比今天周杰伦演唱会的票…

java实现三个数字的随机组合_JAVA编程实现随机生成指定长度的密码功能【大小写和数字组合】...

本文实例讲述了java编程实现随机生成指定长度的密码功能。分享给大家供大家参考,具体如下:import java.util.random;public class passwordcreate {/*** 获得密码* param len 密码长度* return*/public string createpassword(int len){int random this…

话剧《白鹿原》:叫人乍舌,令人唏嘘,也让人捏把汗(图)

晚上看了话剧《白鹿原》,据说该剧是今年人艺剧目的重中之重。可惜现场不许拍摄,在网上搜了半天也没有找到剧照。也是,剧明天才正式公演呢。只找到原著作家陈忠实的照片。 这部戏的台词使用的完全是陕西方言,并时时配有粗犷苍劲的“…

《恐怖小说在中国》之一:何为恐怖小说年?

一、何为恐怖小说年? 有人说2005年是恐怖小说年。所谓恐怖小说年这个说法,我早在2000年策划出版国内第一部恐怖小说《脸》的时候就说过,当时某家媒体就曾以“恐怖袭击中国文坛”为题,对“恐怖文学热”进行过报道,而我印…

java开源im框架_开源im即时通讯

spark the best,open sourceDuckChat开源系统据说支持即时消息,它有哪些特性?您可以下载程序在本地运行。现有的开源IM框架即时通讯开源项目。应该开发web爬虫选择Nutch、Crawler4j、WebMagic、scrapy、WebCollector或其他?根据我…

《恐怖小说在中国》之二:恐怖小说是否对人有害?

二、恐怖小说是否对人有害? 恐怖小说创作与出版的繁荣,也引发了某些人士的忧虑,理由是恐怖小说和鬼故事影响了孩子们的身心健康。他们还以一个自杀的女学生为佐证。2004年,北京郊区一个女学生因为看了“碟仙”的鬼故事后跳楼身亡&…

《恐怖小说在中国》之三:恐怖小说到底是什么?

三、恐怖小说到底是什么? 什么是恐怖小说?它的起源和形式怎样?我在答《南方都市报》记者问时曾说过:“恐怖是人在遭受死亡、疯狂等威胁时所产生的一种高度的焦虑的心理状态,凡是描写这种心理状态的小说都可以称为恐怖小…

java分隔符的引号,使用分隔符拆分带引号的字符串

I want to split a string with a delimiter white space. but it should handle quoted strings intelligently. E.g. for a string like"John Smith" Ted BarryIt should return three strings John Smith, Ted and Barry.解决方案After messing around with it, y…

《恐怖小说在中国》之四:恐怖小说的流行与陷阱?

四、恐怖小说的流行与陷阱? 美国文化批评家哈里伯杰说过:“人有两种原始需要:一种是社会安宁、有秩序、不恐怖、不混乱,有一个预期的熟悉的环境。另一种恰好相反:人类确实需要焦虑、不安宁、需要混乱、危险、需要紧张、…

项目中使用 java函数式编程_函数式编程在Java8中使用Lambda表达式进行开发

事情起因如果不喜欢看故事的同学,请前往下一章节。事情起因是我打算集成Redis缓存,配置了Redis以后,发现Cacheable注解始终不生效,折腾了大半天以后,我的心态已经崩了,决定不使用Cacheable注解了&#xff0…

在看世界杯的闲暇看看电视剧《长恨歌》

世界杯开始了,无论重要的和次要的比赛场次都看,整个一个累。还好,反正4年才一次,纵容一下自己也是可以得到原谅的。王安忆的《长恨歌》一直是我关注的作品。上世纪90年代在《钟山》杂志上看过小说;02年在上海大剧院看过…

把王小波作为离我们最近的一个大师

——《王小波全集》出版之际答记者问 1、在您心中,什么是王小波留下的最宝贵的财富。 兴安:一个作家给后人留下的只能是一样东西——作品,这就是他给我们留下的最宝贵的财富。没留下作品,只留下名声的作家是让人怀疑的&#xff0c…

王小波的灾难——由《王小波全集》想到的

在我的书架里,有王小波书的各种版本,最喜欢的是中国青年出版社的4卷本《王小波文集》和华夏出版社的《黄金时代》。前者是精装,系王小波故后出版的影响最大的选本;后者是平装,纸张和封面之简陋不可同日而语&#xff0c…

在java中图片随机播放_如何在Java中随机播放列表

首先,创建一个Integer数组-Integer[] strArray new Integer[] { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };现在,将其转换为列表-Listlist Arrays.asList(strArray);使用Collections随机播放,如下所示-Collections.shuffle(list);示例imp…

2002年呼伦贝尔之行照片

这是2002年8月底我带北京一些朋友去老家呼伦贝尔时拍的一张照片。那时还没有数码相机,只是普通傻瓜相机拍的,所以比较模糊。这个地方属于鄂温克旗草原的腹地,这条河据说叫锡尼河。我们当时是涉水到对岸吃的羊肉白酒野餐。过河时,河…

爱是谋杀:读徐小斌的《别人》

徐小斌在一篇创作谈中引用过萨特的一句话:“爱不过是个枉费心机的企图”,表达了她写作《别人》(《十月》2006年第3期)的最初的想法,这使我想起了奥地利哲学家魏宁格的另一句名言:“爱是谋杀”。——这是我见…

揭开恐怖悬疑小说的“黑匣子”:以《密码王朝》和《巴族迷魂》为例

《密码王朝》(北方文艺出版社2006年4月出版)是国内著名恐怖文学品牌773 悬念系列的最新一部小说,也是成刚“黑匣子”悬疑恐怖系列的第一部。看书名,似有跟风《达芬奇密码》之嫌,但读了文字,感觉还是很中国…

在内蒙古的乌兰浩特

昨天一大早出门,与家人驾车经丰宁、赤峰和通辽,今天到达乌兰浩特,全程大约1000多公里。这是我出生的地方,可是我1岁就随家人去了呼伦贝尔,至尽没回来过。刚到还没什么深的体会,当安定下来再说。后天去阿尔山…