I/O流操做总结(三)
说实话,其实我并不是很喜欢Java这门语言,尽管它很强大,有很多现成的API可以调用
但我总感觉它把简单的事情弄得太过复杂,甚至有时候会让人迷失
弄不清到底是为了写出东西,还是为了语言本身
我学习的第一门编程语言是Python,虽然学的不深
但是它的简单优雅至今令人难忘(呃,其实也就两年前的事……)
我接触的第二门语言是C,它给我的感觉是一种纯粹,一种高效的灵活
而不是类似java,写一堆含糊的代码来实现一个小小的功能
坦白讲,如果一个人在学习自己不感兴趣的东西,那会很累
支撑我的是,我对移动开发有着异常的向往,对Android也相当喜欢,无奈开发Android的主要语言便是Java
虽然已经学了半年,但是我却到现在都不能解释神马企业级开发到底有哪些东西
我想要的,无非就是把编程当作生活中的一种调情,如果想要某个功能,就去实现,用尽可能简单的方式
甚至我的猜想是,等到日后发展,编程这门技术如同每个人使用office一般的时候
那么作为程序员的你们是该有多艰辛?
要知道,一个人将自己内心的利益盖过真正的想法,这是相当可怕的……
因此,每个人都应该用自己喜欢的,觉得高效的方式,做自己最想要做的
好了,说了那么多,我的目的其实只有一个
难道我会告诉你,我根本就搞不懂,也不想搞懂java那些复杂的垃圾语法么?
我只用那些最简单最好用的东西……
java以前的那些io写法我就懒得记录了,主要是System类对IO的支持
如果你觉得我写的代码不够深沉,那你就喷吧,可喷完之后你还能干些什么呢?
现在,步入正题……
这一节我们来讲Scanner类和PrintWriter类的用法
Scanner类
实例1:从键盘读取
|
1
2
3
4
5
6
7
8
9
10
|
import java.util.Scanner;public class Demo { public static void main(String[] args ) { Scanner input = new Scanner(System.in); System.out.println("请输出一个整数:"); int i = input.nextInt(); System.out.println("你输入的整数是:" + i); }} |
以上演示的只是读取一个整数,当然还有读取浮点数和其他数据类型的方法,比较简单,查看API即可

实例2:从字符串读取
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import java.util.Scanner;public class Demo { public static void main(String[] args ) { //这里的\r\n是换行符,Linux下其实只用\n即可 Scanner input = new Scanner("hello\r\nworld\r\n"); //循环读取,hasNext()方法和集合框架里面的一样使 while(input.hasNext()) { //每次读取一行,别的读取方法见API,比较简单 String s = input.nextLine(); System.out.println(s); } }} |

实例3:从文件读取
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
import java.io.File;import java.io.FileNotFoundException;import java.util.Scanner;public class Demo { public static void main(String[] args ) { String path = File.separator + "home" + File.separator + "siu" + File.separator + "work" + File.separator + "demo.txt"; File f = new File(path); Scanner input = null; try { //从文件构造Scanner对象,有可能产生异常 input = new Scanner(f); while(input.hasNext()) { String s = input.nextLine(); System.out.println(s); } } catch (FileNotFoundException e) { e.printStackTrace(); } finally { input.close(); } }} |
这里要注意的是,从文件创建Scanner对象得先要有File对象,当然你可以使用匿名对象来创建
此外,还需捕捉异常和关闭文件流

PrintWriter类
实例4:向文件写入内容
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
import java.io.File;import java.io.FileNotFoundException;import java.io.PrintWriter;public class Demo { public static void main(String[] args) { String path = File.separator + "home" + File.separator + "siu" + File.separator + "work" + File.separator + "demo.txt"; //创建文件对象 File file = new File(path); PrintWriter p = null; try { //此处构造函数还可以传其他对象,具体参考API文档 p = new PrintWriter(file); //向文件写入一行,此外还有print()和printf()方法 p.println("如果有一天我回到从前"); p.println("回到最原始的我"); p.println("你是否会觉得我不错"); //刷新流 p.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); } finally { p.close(); } }} |

与PrintWriter类似的还有一个PrintStream类,此处以PrintWriter举例是因为文本文件具有人为可读性
而二进制文件(字节模式)则需要使用专门的程序来读取
可能有人会问:FileOutputStream、 FileWriter都能写文件,那么为何还需要PrintWriter和PrintStream类
如果细看API文档,可以知道前者单纯的字符写入流和字节写入流操作的方式大多用数组进行
对文件的细化处理非常不方便,而PrintWriter和PrintStream则很好的解决了这一问题,提供print()等方法
并且,PrintWriter和PrintStream对于不存在文件对象的情况下会直接创建,如果已有文件对象
它们则会把原有文件给覆盖掉,却没有增加方法
解决这问题也很简单,再看API文档
PrintWriter有一个构造方法PrintWriter(Writer out),也就是能够传入Writer对象
PrintStream有一个构造方法PrintStream(OutputStream out),也就是能传入OutputStream对象
因此,我们这样写就可以了
new PrintWriter(new FileWriter(file,true))
new PrintStream(new FileOutputStream(file,true))
既能增加数据,也能更高效的处理文件,见如下代码示范
实例5:实现PrintWriter的数据追加功能
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter;public class Demo { public static void main(String[] args) { String path = File.separator + "home" + File.separator + "siu" + File.separator + "work" + File.separator + "demo.txt"; //创建文件对象 File file = new File(path); PrintWriter p = null; try { //利用FileWriter方式构建PrintWriter对象,实现追加 p = new PrintWriter(new FileWriter(file,true)); p.println("尼玛 这一句就是追加的 看到没"); p.flush(); } catch (IOException e) { e.printStackTrace(); } finally { //我们来小心翼翼的关闭流,好吧^_^ p.close(); } }} |
看,这样就能实现追加效果了,最后一行便是

System类对IO的支持
实例6:System类中的写入
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import java.io.IOException;import java.io.OutputStream;public class Demo { public static void main(String[] args) { //别忘了,OutputStream是所有字节写入流的父类 OutputStream out = System.out; try { //写入数据,只能是数组,所以用getBytes()方法 out.write("Hello,bitch!\r\n".getBytes()); } catch (IOException e) { e.printStackTrace(); } }} |
注意,此处正好印证了System.out的覆写行为
如果想学好io,整个io体系中的多态需要了解清楚才能驾轻就熟

实例7:System类中的读取
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import java.io.IOException;import java.io.InputStream;public class Demo { public static void main(String[] args) { //别忘了InputStream是所有字节输入流的父类 InputStream in = System.in; System.out.print("请输入文字: "); byte[] buf = new byte[1024]; int len = 0; try { //将输入的数据保证到数组中,len记录输入的长度 len = in.read(buf); } catch (IOException e) { e.printStackTrace(); } //用字符串的方式打印数组中的数据 System.out.println("你的输入是: " + new String(buf,0,len)); }} |
看,这样就能从键盘获取内容并且打印了

需要注意的是,这里的数组大小是1024字节
一旦输入的数据超过1024字节,那么超过的内容将被截取掉,所以此程序有局限性
并且,一个中文占两个字节,输入中文有时候会被意外截取掉
相信我,每个程序都是俺亲自编写编译的~!!!
实例8:利用BufferedReader实现对键盘的读取
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Demo { public static void main(String[] args) { BufferedReader b = new BufferedReader(new InputStreamReader(System.in)); System.out.print("请输入文本:"); try { String str = b.readLine(); System.out.println("你输入的是:" + str); } catch (IOException e) { e.printStackTrace(); } //循环读取方式 /* while(true) { System.out.print("请输入文本:"); String str = null; try { str = b.readLine(); } catch (IOException e) { e.printStackTrace(); } //如果输入over就结束循环 if("over".equals(str)) { break; } System.out.println("你输入的是:" + str); } */ try { //关闭流,不耐烦的就直接抛 b.close(); } catch (IOException e) { e.printStackTrace(); } }} |
这样做相对于上面一个方法的好处是:不用关心数组大小的问题
BufferedReader有一个最重要的方法就是readLine(),每次读取一行

I/O流操做总结(三)的更多相关文章
- 应答流式RPC 请求流式RPC 向流式RPC 流式RPC的三种具体形式
https://mp.weixin.qq.com/s/pWwSfXl71GQZ3KPmAHE_dA 用Python进行gRPC接口测试(二) 大帆船 搜狗测试 2020-02-07 上期回顾:用P ...
- 某个应用的CPU使用率居然达到100%,我该怎么做?(三)
某个应用的CPU使用率居然达到100%,我该怎么做?(三) 1. 引 你们好,可爱的小伙伴们^_^! 咱们最常用什么指标来描述系统的CPU性能呢?我想你的答案,可能不是平均负载,也不是CPU上下文切换 ...
- GPU编程和流式多处理器(三)
GPU编程和流式多处理器(三) 3. Floating-Point Support 快速的本机浮点硬件是GPU的存在理由,并且在许多方面,它们在浮点实现方面都等于或优于CPU.全速支持异常可以根据每条 ...
- 最大流 总结&&做题记录
最近一直很忙,为了节省时间,从今以后的题解会 一个专题 写一篇. 刷了一些题后,有了以下总结: 模型要点: 1.构造流量平衡,在满足流量平衡的情况下,找到要让什么最大. 2.一般用于判断性问题,即所有 ...
- 流式计算(三)-Flink Stream 篇一
原创文章,谢绝任何形式转载,否则追究法律责任! 流的世界,有点乱,群雄逐鹿,流实在太多,看完这个马上又冒出一个,也不知哪个才是真正的牛,据说Flink是位重量级选手,能流计算,还能批处理, 和其他伙 ...
- Java基础知识强化之IO流笔记62:三种方式实现键盘录入
1. 三种方式实现键盘录入 System.in 标准输入流.是从键盘获取数据的 键盘录入数据三种方式: A:main方法的args接收参数. java HelloWorld hello w ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——收流篇:(三)RTSP命令解析
一.RTSP命令简述 RTSP是用来控制实时流媒体“播放”.“暂停”.“停止”.“录像”等行为的传输协议.该协议规定了一系列命令以及这些命令的发送格式,RTSP客户端可以通过发送这些指定的命令,从而控 ...
- nginx限流方案的实现(三种方式)
通过查看nginx官方文档,小弟查看到了三种nginx限流方式. 1.limit_conn_zone 2.limit_req_zone 3.ngx_http_upstream_module 前两种只能 ...
- Java IO流详解(三)——字节流InputStream和OutPutStream
我们都知道在计算机中,无论是文本.图片.音频还是视频,所有的文件都是以二进制(字节)形式存在的,IO流中针对字节的输入输出提供了一系列的流,统称为字节流.字节流是程序中最常用的流.在JDK中,提供了两 ...
随机推荐
- JavaScript中的eval()函数详解
和其他很多解释性语言一样,JavaScript同样可以解释运行由JavaScript源代码组成的字符串,并产生一个值.JavaScript通过全局函数eval()来完成这个工作 eval(“1 ...
- spring-data详解之spring-data-jpa:简单三步快速上手spring-data-jpa开发
前言: 基于spring framework 4.x或spring boot 1.x开发环境 务必注意以下版本问题:Spring framework4.x(Spring boot1.x)对应sprin ...
- 有趣的Javascript:只需一个JS让万恶的IE5、IE6、IE7、IE8全都支持H5原生Canvas绘图(有演示demo)
该demo支持IE5以上任意内核的浏览器 查看演示demo:支持IE5以上版本的浏览器Canvas绘图demo 补充:chats.js和echarts等图表库也可以使用本方法兼容IE6以上浏览器 1. ...
- AtCoder Grand Contest 009 D:Uninity
题目传送门:https://agc009.contest.atcoder.jp/tasks/agc009_d 题目翻译 定义只有一个点的树权值为\(0\),若干棵(可以是\(0\)棵)权值为\(k\) ...
- 【转】Pro Android学习笔记(六):了解Content Provider(中)
Content Provider的架构 Authority类似web中的域名,每个content provider会通过AndroidManifest.xml向系统注册authority,如下.其中n ...
- Robot Framework基础学习(五)
Selenium2Library 常用关键字介绍 关于Selenium2Library 的关键字,我们可以参考:http://rtomac.github.io/robotframework-selen ...
- WPF PasswordBox鼠标进入时程序异常退出的解决办法
最近在开发了一个程序中用到了PasswordBox控件,但是在程序给别人用的时候,鼠标一进入控件时程序就异常退出,查了下windows日志,错误显示如下: 应用程序: WpfPasswordTest2 ...
- ubuntu安装vnc,远程链接时出现灰屏,配置文档不对吗
摘自:https://zhidao.baidu.com/question/1949169099296473348.html 1.在Ubuntu上首先需要安装vnc4server # apt-get i ...
- hdu 3037 费马小定理+逆元除法取模+Lucas定理
组合数学推推推最后,推得要求C(n+m,m)%p 其中n,m小于10^9,p小于1^5 用Lucas定理求(Lucas定理求nm较大时的组合数) 因为p数据较小可以直接阶乘打表求逆元 求逆元时,由费马 ...
- Android图片压缩框架-Tiny 集成
为了简化对图片压缩的调用,提供最简洁与合理的api压缩逻辑,对于压缩为Bitmap根据屏幕分辨率动态适配最佳大小,对于压缩为File优化底层libjpeg的压缩,整个图片压缩过程全在压缩线程池中异步压 ...