最新要闻
- 【焦点热闻】舍利子制作方法居然也有发明专利 网友:得道高僧等级速升外挂
- 世界即时:跑腿师傅诉苦:男子订一束花送五个女生均被拒 还被扣款差评
- 微软将用UUP方式推送.NET更新:“可选更新”终于可控
- 钉钉iOS版喜迎更新:支持定时消息 再不怕打扰别人休息了
- 天天热讯:《星际争霸2》新晋中国世界冠军李培楠:别给暴雪送钱 不要买!
- 环球百事通!游戏帧数暴增84% 英特尔锐炫显卡新老驱动对比
- 当前动态:山东多人无视劝阻赶海 1人溺水遇难:必须小心这4点
- 世界即时看!价值7万的爱马仕包运输途中被烧毁!顺丰:如果是我们的问题 会进行处理
- 天天速看:男子给女友转账140万分手想要回:女方最终被判返还40万
- 每日热门:媒体曝苹果扩大在印产量障碍重重:这品控看完避雷
- 环球速读:AI照骗恐怖如斯!美女刷屏真假难辨 网友:警惕AI网恋诈骗
- 【全球时快讯】万元级最香!ROG四款满血笔记本齐上阵:魔霸新锐2023首发9999元手慢无
- 全球焦点!00后男生长期把可乐当水喝:牙全坏
- 《巫师3》次时代版热修复上线:解决4.01版性能问题
- MINI纯电Countryman谍照
- 世界简讯:贾跃亭再被执行2.4亿:总额超42亿!自称FF91四月交付
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
开心档之Java 流(Stream)、文件(File)和IO
Java 流(Stream)、文件(File)和IO
Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。
Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。
一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。
(资料图片)
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。
但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
读取控制台输入
Java 的控制台输入由 System.in 完成。
为了获得一个绑定到控制台的字符流,你可以把 System.in 包装在一个 BufferedReader 对象中来创建一个字符流。
下面是创建 BufferedReader 的基本语法:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedReader 对象创建后,我们便可以使用 read() 方法从控制台读取一个字符,或者用 readLine() 方法读取一个字符串。
从控制台读取多字符输入
从 BufferedReader 对象读取一个字符要使用 read() 方法,它的语法如下:
int read( ) throws IOException
每次调用 read() 方法,它从输入流读取一个字符并把该字符作为整数值返回。 当流结束的时候返回 -1。该方法抛出 IOException。
下面的程序示范了用 read() 方法从控制台不断读取字符直到用户输入 q。
BRRead.java 文件代码:
//使用 BufferedReader 在控制台读取字符 import java.io.*; public class BRRead { public static void main(String[] args) throws IOException { char c; // 使用 System.in 创建 BufferedReader BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("输入字符, 按下 "q" 键退出。"); // 读取字符 do { c = (char) br.read(); System.out.println(c); } while (c != "q"); }}
以上实例编译运行结果如下:
输入字符, 按下 "q" 键退出。kxdangrunoobqq
从控制台读取字符串
从标准输入读取一个字符串需要使用 BufferedReader 的 readLine() 方法。
它的一般格式是:
String readLine( ) throws IOException
下面的程序读取和显示字符行直到你输入了单词"end"。
BRReadLines.java 文件代码:
//使用 BufferedReader 在控制台读取字符import java.io.*; public class BRReadLines { public static void main(String[] args) throws IOException { // 使用 System.in 创建 BufferedReader BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str; System.out.println("Enter lines of text."); System.out.println("Enter "end" to quit."); do { str = br.readLine(); System.out.println(str); } while (!str.equals("end")); }}
以上实例编译运行结果如下:
Enter lines of text.Enter "end" to quit.This is line oneThis is line oneThis is line twoThis is line twoendend
JDK 5 后的版本我们也可以使用Java Scanner类来获取控制台的输入。
控制台输出
在此前已经介绍过,控制台的输出由 print( ) 和 println() 完成。这些方法都由类 PrintStream 定义,System.out 是该类对象的一个引用。
PrintStream 继承了 OutputStream类,并且实现了方法 write()。这样,write() 也可以用来往控制台写操作。
PrintStream 定义 write() 的最简单格式如下所示:
void write(int byteval)
该方法将 byteval 的低八位字节写到流中。
实例
下面的例子用 write() 把字符 "A" 和紧跟着的换行符输出到屏幕:
WriteDemo.java 文件代码:
import java.io.*; //演示 System.out.write().public class WriteDemo { public static void main(String[] args) { int b; b = "A"; System.out.write(b); System.out.write("\n"); }}
运行以上实例在输出窗口输出 "A" 字符
A
**注意:**write() 方法不经常使用,因为 print() 和 println() 方法用起来更为方便。
读写文件
如前所述,一个流被定义为一个数据序列。输入流用于从源读取数据,输出流用于向目标写数据。
下图是一个描述输入流和输出流的类层次图。
下面将要讨论的两个重要的流是FileInputStream和FileOutputStream。
FileInputStream
该流用于从文件读取数据,它的对象可以用关键字 new 来创建。
有多种构造方法可用来创建对象。
可以使用字符串类型的文件名来创建一个输入流对象来读取文件:
InputStream f = new FileInputStream("C:/java/hello");
也可以使用一个文件对象来创建一个输入流对象来读取文件。我们首先得使用 File() 方法来创建一个文件对象:
File f = new File("C:/java/hello");InputStream in = new FileInputStream(f);
创建了InputStream对象,就可以使用下面的方法来读取流或者进行其他的流操作。
序号 | 方法及描述 |
---|---|
1 | public void close() throws IOException{}关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常。 |
2 | protected void finalize()throws IOException {}这个方法清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。抛出IOException异常。 |
3 | public int read(int r)throws IOException{}这个方法从 InputStream 对象读取指定字节的数据。返回为整数值。返回下一字节数据,如果已经到结尾则返回-1。 |
4 | public int read(byte[] r) throws IOException{}这个方法从输入流读取r.length长度的字节。返回读取的字节数。如果是文件结尾则返回-1。 |
5 | public int available() throws IOException{}返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取的字节数。返回一个整数值。 |
除了 InputStream 外,还有一些其他的输入流,更多的细节参考下面链接:
- ByteArrayInputStream
- DataInputStream
FileOutputStream
该类用来创建一个文件并向文件中写数据。
如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件。
有两个构造方法可以用来创建 FileOutputStream 对象。
使用字符串类型的文件名来创建一个输出流对象:
OutputStream f = new FileOutputStream("C:/java/hello")
也可以使用一个文件对象来创建一个输出流来写文件。我们首先得使用File()方法来创建一个文件对象:
File f = new File("C:/java/hello");OutputStream fOut = new FileOutputStream(f);
创建OutputStream 对象完成后,就可以使用下面的方法来写入流或者进行其他的流操作。
序号 | 方法及描述 |
---|---|
1 | public void close() throws IOException{}关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常。 |
2 | protected void finalize()throws IOException {}这个方法清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。抛出IOException异常。 |
3 | public void write(int w)throws IOException{}这个方法把指定的字节写到输出流中。 |
4 | public void write(byte[] w)把指定数组中w.length长度的字节写到OutputStream中。 |
除了OutputStream外,还有一些其他的输出流,更多的细节参考下面链接:
- ByteArrayOutputStream
- DataOutputStream
实例
下面是一个演示 InputStream 和 OutputStream 用法的例子:
fileStreamTest.java 文件代码:
import java.io.*; public class fileStreamTest { public static void main(String[] args) { try { byte bWrite[] = { 11, 21, 3, 40, 5 }; OutputStream os = new FileOutputStream("test.txt"); for (int x = 0; x < bWrite.length; x++) { os.write(bWrite[x]); // writes the bytes } os.close(); InputStream is = new FileInputStream("test.txt"); int size = is.available(); for (int i = 0; i < size; i++) { System.out.print((char) is.read() + " "); } is.close(); } catch (IOException e) { System.out.print("Exception"); } }}
上面的程序首先创建文件test.txt,并把给定的数字以二进制形式写进该文件,同时输出到控制台上。
以上代码由于是二进制写入,可能存在乱码,你可以使用以下代码实例来解决乱码问题:
fileStreamTest2.java 文件代码:
//文件名 :fileStreamTest2.javaimport java.io.*; public class fileStreamTest2 { public static void main(String[] args) throws IOException { File f = new File("a.txt"); FileOutputStream fop = new FileOutputStream(f); // 构建FileOutputStream对象,文件不存在会自动新建 OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8"); // 构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk writer.append("中文输入"); // 写入到缓冲区 writer.append("\r\n"); // 换行 writer.append("English"); // 刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入 writer.close(); // 关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉 fop.close(); // 关闭输出流,释放系统资源 FileInputStream fip = new FileInputStream(f); // 构建FileInputStream对象 InputStreamReader reader = new InputStreamReader(fip, "UTF-8"); // 构建InputStreamReader对象,编码与写入相同 StringBuffer sb = new StringBuffer(); while (reader.ready()) { sb.append((char) reader.read()); // 转成char加到StringBuffer对象中 } System.out.println(sb.toString()); reader.close(); // 关闭读取流 fip.close(); // 关闭输入流,释放系统资源 }}
文件和I/O
还有一些关于文件和I/O的类,我们也需要知道:
- File Class(类)
- FileReader Class(类)
- FileWriter Class(类)
Java中的目录
创建目录:
File类中有两个方法可以用来创建文件夹:
- **mkdir( )**方法创建一个文件夹,成功则返回true,失败则返回false。失败表明File对象指定的路径已经存在,或者由于整个路径还不存在,该文件夹不能被创建。
- **mkdirs()**方法创建一个文件夹和它的所有父文件夹。
下面的例子创建 "/tmp/user/java/bin"文件夹:
CreateDir.java 文件代码:
import java.io.File; public class CreateDir { public static void main(String[] args) { String dirname = "/tmp/user/java/bin"; File d = new File(dirname); // 现在创建目录 d.mkdirs(); }}
编译并执行上面代码来创建目录 "/tmp/user/java/bin"。
注意:Java 在 UNIX 和 Windows 自动按约定分辨文件路径分隔符。如果你在 Windows 版本的 Java 中使用分隔符 (/) ,路径依然能够被正确解析。
读取目录
一个目录其实就是一个 File 对象,它包含其他文件和文件夹。
如果创建一个 File 对象并且它是一个目录,那么调用 isDirectory() 方法会返回 true。
可以通过调用该对象上的 list() 方法,来提取它包含的文件和文件夹的列表。
下面展示的例子说明如何使用 list() 方法来检查一个文件夹中包含的内容:
DirList.java 文件代码:
import java.io.File; public class DirList { public static void main(String args[]) { String dirname = "/tmp"; File f1 = new File(dirname); if (f1.isDirectory()) { System.out.println("目录 " + dirname); String s[] = f1.list(); for (int i = 0; i < s.length; i++) { File f = new File(dirname + "/" + s[i]); if (f.isDirectory()) { System.out.println(s[i] + " 是一个目录"); } else { System.out.println(s[i] + " 是一个文件"); } } } else { System.out.println(dirname + " 不是一个目录"); } }}
以上实例编译运行结果如下:
目录 /tmpbin 是一个目录lib 是一个目录demo 是一个目录test.txt 是一个文件README 是一个文件index.html 是一个文件include 是一个目录
删除目录或文件
删除文件可以使用java.io.File.delete()方法。
以下代码会删除目录/tmp/java/,需要注意的是当删除某一目录时,必须保证该目录下没有其他文件才能正确删除,否则将删除失败。
测试目录结构:
/tmp/java/|-- 1.log|-- test
DeleteFileDemo.java 文件代码:
import java.io.File; public class DeleteFileDemo { public static void main(String[] args) { // 这里修改为自己的测试目录 File folder = new File("/tmp/java/"); deleteFolder(folder); } // 删除文件及目录 public static void deleteFolder(File folder) { File[] files = folder.listFiles(); if (files != null) { for (File f : files) { if (f.isDirectory()) { deleteFolder(f); } else { f.delete(); } } } folder.delete(); }}
开心档之Java 流(Stream)、文件(File)和IO
【焦点热闻】舍利子制作方法居然也有发明专利 网友:得道高僧等级速升外挂
世界即时:跑腿师傅诉苦:男子订一束花送五个女生均被拒 还被扣款差评
微软将用UUP方式推送.NET更新:“可选更新”终于可控
钉钉iOS版喜迎更新:支持定时消息 再不怕打扰别人休息了
天天热讯:《星际争霸2》新晋中国世界冠军李培楠:别给暴雪送钱 不要买!
天天最新:CSS 盒模型和 box-sizing 属性
环球讯息:全志h616,Ubuntu,python3.9环境搭建
【全球新要闻】【关系型数据库】事务特性及事务隔离级别
软件自动化测试高频面试题
环球百事通!游戏帧数暴增84% 英特尔锐炫显卡新老驱动对比
当前动态:山东多人无视劝阻赶海 1人溺水遇难:必须小心这4点
世界即时看!价值7万的爱马仕包运输途中被烧毁!顺丰:如果是我们的问题 会进行处理
天天速看:男子给女友转账140万分手想要回:女方最终被判返还40万
每日热门:媒体曝苹果扩大在印产量障碍重重:这品控看完避雷
新资讯:时隔多年,这次我终于把动态代理的源码翻了个地儿朝天
环球速读:AI照骗恐怖如斯!美女刷屏真假难辨 网友:警惕AI网恋诈骗
【全球时快讯】万元级最香!ROG四款满血笔记本齐上阵:魔霸新锐2023首发9999元手慢无
SQL工具性能实测:居然比Navicat还快,数百万行数据导出仅51秒
当前要闻:从上至下遍历二叉树---队列的性质
全球焦点!00后男生长期把可乐当水喝:牙全坏
《巫师3》次时代版热修复上线:解决4.01版性能问题
MINI纯电Countryman谍照
世界简讯:贾跃亭再被执行2.4亿:总额超42亿!自称FF91四月交付
车主称凯迪拉克新车刹车失灵高速上撞车 网友:这次支持4S
焦点要闻:xxl-job~为宿主机添加定时备份数据库的程序
扬汤止沸是什么意思?扬汤止沸是做功还是热传递?
生活中测量质量的工具有哪些?生活中测量质量的工具研究背景
每日观点:199元!小米30W无线车充开售:电动夹臂 iPhone也能用
天天快资讯:荣耀Magic5系列样张首曝光 AI无人抓拍或刷新拍照速度革命 2月27日全球发布!
全球头条:首发7999起 机械师曙光16 Pro开启预售:可选13代i9+RTX 4070
通讯!13倍浓缩:日本隅田川胶囊咖啡1.2元/杯大差价抄底
你最信任哪家快递公司?数千网友近一半投票给了它
露蜂房和蜂房有什么区别?露蜂房的功效和作用是什么?
漫画长歌行的结局是什么?漫画长歌行什么时候恢复更新?
汉武帝叫什么名字?汉武帝之后的皇位顺序
屏幕分辨率调不了是什么原因?屏幕分辨率调不了怎么解决?
荣事达手机怎么刷机?荣事达手机所有型号
海尔洗衣机e4怎么解决?海尔洗衣机故障代码大全
上海和首尔哪个更发达?上海和首尔咖啡馆数量
骁龙616处理器怎么样?骁龙616处理器相当于麒麟多少?
环球要闻:矩阵中的路径
当前速读:CF1753EF
环球微资讯!机器学习-决策树
三分钟使用chatGPT
全球观天下!关于Linux从内核启动选项中开启对ipv6的支持
京东券在哪里领?京东券怎么使用?
压力给到合资燃油车!比亚迪秦PLUS DM-i冠军版上市5天订单破2.5万
每日热闻!真我GT Neo5成为史上最畅销的安卓1TB手机:首销被抢购一空
热点!非机械键盘不买?你可能不了解薄膜键盘
天天报道:一箱油跑1100km 五菱凯捷混动铂金版将上市:演员周迅成首位车主
控制空调、收音机 无缝显示油量!全新一代苹果Carplay年底推出
全球百事通!面试官:Lambda 表达式中的 forEach 如何提前终止?这次被问倒了!
天天讯息:从青铜到王者,揭秘 Serverless 自动化函数最佳配置
Linux常用命令
微资讯!转移国内工厂 彻底摆脱中国制造?印度坑惨苹果 iPhone良品率不到50%
环球快播:一次性带走29包 奥利奥缤纷零食大礼包狂促:券后29.9元
世界滚动:比小米猛!曝Redmi K60将推出1TB版本:彻底解决微信存储焦虑
重庆阿姨参加免费活动微信被封 腾讯客服:发布刷单欺诈消息 已解封
天天精选!索尼出品!《圣斗士星矢》真人电影最新预告发布 4月28日上映
每日聚焦:UiPath 初探
canvas画板(鼠标和触摸)
天天速看:史上最大客机订单!印度航空采购波音、空客近500架客机
全球消息!199元 小米米家智能电子血压计众筹:支持联网远程监测
观天下!你怎么看?国内多地学校尝试推作业熔断机制:超过9点无条件停做
“中国复眼”二期开工!事关我国近地小行星撞击防御
环球热资讯!天选之子!女子来西安旅游买30元彩票中了1800万 网友调侃又骗我买彩票
【当前热闻】读Java实战(第二版)笔记10_函数式编程的技巧
历史一刻!欧洲宣布禁止燃油车 时间确定:中国新能源汽车笑了
天天资讯:2 - 【RocketMQ 系列】CentOS 7.6 安装部署RocketMQ
【全球快播报】前端安全--CSRF攻防
期末复习——操作系统概述 chapter(0+1)
全球热文:期末复习——进程与线程
精选!暴雪服务器消失后 《星际争霸2》多了个中国世界冠军
ChatGPT火爆 韩国厂商天降喜事:HBM内存价格涨了5倍
热门看点:情人节晚上 我的被窝里只有童年回忆杀
离开太阳系!旅行者号要给外星人讲讲人类的爱情
创建.a静态库, framework静态库
环球资讯:Android JetPack~ DataBinding(数据绑定)(一) 集成与使用
天天通讯!索尼正在研究如何把PS5塞进桌斗里:抱着送人太沉了
全球热消息:广汽埃安开放18城免费充电站:两个半月 所有品牌都能充
环球观察:顺丰寄6.5万元爱马仕包 运输中被烧毁:官方不给事故证明
期末复习——网络层
今日报丨chatgpt的时代,先用gpt3来做一个哪里都可以接入的代码吧
观焦点:《分布式技术原理与算法解析》学习笔记Day11
世界滚动:日本火山时隔5年再次活动 火山灰喷到2400米高:已3级警戒
Vue 插值语法与指令系统
全球要闻:「CSP-J2020」 直播获奖 —— 桶排序例题
面向老师的单机版“数学系统math”
自学前端最容易犯的10个的错误,新手学前端快来看看
天天热门:情人节礼物 三星Galaxy S23系列手机国行发布:12+1TB顶配12699元
焦点速读:比小米13屏幕更小!三星Galaxy S23预售:5199元起
精彩看点:男子情人节让老婆洗鞋 每双鞋放520元:结局够绝!钱收了鞋归位
邓超情人节送孙俪一盆菜 被赞深得我心:网友一句话暖心
全球动态:韩国民众向土耳其捐大量脏衣服引全球网友吐槽:太没品 还不如不捐
当前快播:白嫖一个WebAPI限流解决方案
音乐 APP 用户争夺战,火山引擎 VeDI 助力用户体验升级!
能用到安卓17 三星承诺Galaxy S23系统升级4代、5年安全更新
交管部门:等红灯时玩手机也属分心驾驶
焦点播报:三星Galaxy S23系列创预售新纪录 官方送福利:存储容量免费升杯