java中的IO操作总结(三)

el/2024/7/24 2:41:41

说实话,其实我并不是很喜欢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(),每次读取一行

 

 

 


http://www.ngui.cc/el/5557274.html

相关文章

匿名内部类精讲

匿名内部类适合创建那种只需要一次使用的类,例如命令模式时所需要的Command对象。匿名内部类的语法有点奇怪,创建匿名内部类时会立即创建一个该类的实例,这个类定义立即消失,匿名内部类不能重复使用。 定义匿名内部类的格式如…

如何安装安装nginx软件--nginx的自动安装

去官网下包的安装教程,可以参考:(手动安装教程) http://blog.csdn.net/u011630575/article/details/48033431 自动安装nginx软件 第一步: sudo apt-get install nginx 第二步:安装结束 nginx常用命令…

linux下安装安装pcre configure: error: You need a C++ compiler for C++ support

linux下安装安装pcre-*.** ./configure --prefix/usr/local/pcre 出现以下错误 configure: error: You need a C compiler for C support 只需要安装gcc-c即可。 (1)命令:sudo apt-get install gcc;(2)命…

ubuntu下编译php扩展的时候报缺少pcre解决办法

命令:apt-get update 命令:apt-get install libpcre3 libpcre3-dev 刚刚在编译php扩展的时候,报缺少pcre错误。 当然是想通过apt-get这个命令解决问题了,不过搜索了网络,只找到了CentOS的yum命令: yum up…

ubuntu下nginx的安装教程(过程可能有点不同)

注: 过程可能有点不同,详细可以参照下一篇博客。 http://blog.csdn.net/u011630575/article/details/48103243 第一步: 去官网下载http://nginx.org/下载nginx;下载nginx; 第二步: 解压 tar -zxvf nginx…

nginx+php(fastcgi)安装教程

安装nginx见下一篇博客: http://blog.csdn.net/u011630575/article/details/48103243 基础阶段:(搭建php前奏) 安装包 libiconv-1.1.0.tar.gz libmcrypt-2.5.8.tar.gz mhash-0.9.3.tar.gz mcrypt-2.6.4.tar.gz 第一步&…

linux命令(1):wget命令

Linux系统中的wget是一个下载文件的工具,它用在命令行下。对于Linux用户是必不可少的工具,我们经常要下载一些软件或从远程服务器恢复备份到本地服务器。wget支持HTTP,HTTPS和FTP协议,可以使用HTTP代理。所谓的自动下载是指&#…

linux命令(2):gzip命令

减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间。 gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用。gzip不仅可以用来压缩大的、较少使用的文件以…

Linux命令(3)打Patch的方法

作为程序员,了解diff&patch命 令是非常必要的。比如说我们发现某个项目有bug代码,而自己又没有svn的提交权限,那么此时最合适的解决方法就是用diff命令做一个补丁发给项目成员。项目成员通过patch命令可以立刻知道你的意图。有人会说直接…

linux命令(4)curl命令详解

对于windows用户如果用Cygwin模拟unix环境的话,里面没有带curl命令,要自己装,所以建议用Gow来模拟,它已经自带了curl工具,安装后直接在cmd环境中用curl命令就可,因为路径已经自动给你配置好了。 linux curl…