Java IO流详解(三)

Scanner类

1 从键盘读取

public class ScannerTest {
    public static void main(String[] args ) {
        Scanner input = new Scanner(System.in);
        System.out.println("请输出一个整数:");
        int i = input.nextInt();
        System.out.println("你输入的整数是:" + i);
    }
}

结果:

2 从字符串读取

public class ScannerTest2 {

    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 从文件读取

public class ScannerTest3 {
    public static void main(String[] args ) {

        String path = "D:\\Program Files (x86)\\ADT\\workspace\\JavaIO\\demoTest.txt";

        File f = new File(path);
        Path path2 = f.toPath();
        Scanner input = null;
        try {
            //从文件构造Scanner对象,有可能产生异常
            input = new Scanner(path2);

            System.out.println(f.getAbsolutePath());
            System.out.print(input.hasNext());
            while(input.hasNext()) {
                String s = input.nextLine();
                System.out.println(s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            input.close();
        }
    }
}

结果图:

从上图可以看出编码格式不同,对于中文扫描输出是乱码。

还有一点需要注意:

public class ScannerTest3 {
    public static void main(String[] args ) {

        String path = "D:\\Program Files (x86)\\ADT\\workspace\\JavaIO\\demoTest.txt";

        File f = new File(path);
        Scanner input = null;
        try {
            //从文件构造Scanner对象,有可能产生异常
            input = new Scanner(f);
            System.out.println(f.getAbsolutePath());
            System.out.print(input.hasNext());
            while(input.hasNext()) {
                String s = input.nextLine();
                System.out.println(s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            input.close();
        }
    }
}

在我进行测试的时候,使用如上的方式进行文件的读取操作,读取不到文件的内容。不知为何!!!??请大家谁知道的话,不吝赐教~~~!!

PrintWriter类

4 向文件写入内容

public class PrintWriterToFile {
    public static void main(String[] args) {
        String path = "D:\\Program Files (x86)\\ADT\\workspace\\JavaIO\\demoTest.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的数据追加功能

public class PrintWriterAppendFile {
    public static void main(String[] args) {
        String path = "D:\\Program Files (x86)\\ADT\\workspace\\JavaIO\\demoTest.txt";

        //创建文件对象
        File file = new File(path);
        PrintWriter p = null;
        try {
            //利用FileWriter方式构建PrintWriter对象,实现追加
            p = new PrintWriter(new FileWriter(file,true));
            p.println("wqnmglb 这一句就是追加的 看到没");

            p.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //我们来小心翼翼的关闭流,好吧^_^
            p.close();
        }
    }
}

结果:

System类对IO的支持

6 System类中的写入

public class SystemOutTest {
    public static void main(String[] args) {
        //别忘了,OutputStream是所有字节写入流的父类
        OutputStream out = System.out;
        try {
            //写入数据,只能是数组,所以用getBytes()方法
            out.write("Hello,son of bitch!\r\n".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

结果:

7 System类中的读取

public class SystemInTest {
    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));

    }
}

结果:

不过对于上面的情况,如果输入中文,则输出为乱码。请大家注意。原因在于读取的是字节的缘故。如果读取字符,则不存在乱码的情况。

其实,对于目前可能出现的乱码情况,大家大可不必纠结。因为在实际开发过程中,都会基本一定的环境当中。例如:进行android开发,android上面默认的字符编码是utf-8,你是知道的,所以即使出现了乱码的情况,使用字符格式转换Charset类就可以纠正。在例如:进行WEB开发,在WEB开发的过程中需要指定字符编码格式,或者GBK 或者UTF-8 不过推荐使用utf-8,因为平台移植性好。

8 利用BufferedReader实现对键盘的读取

public class BufferedReaderFromScanner {
    public static void main(String[] args) {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("请输入文本:");
        try {
            String str = bufferedReader.readLine();
            System.out.println("你输入的是:" + str);
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            //关闭流,不耐烦的就直接抛
            bufferedReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

结果:

如果有什么问题或者错误 请留言!谢谢~~~~【握手】

源码稍后提供下载

时间: 2024-11-05 20:34:50

Java IO流详解(三)的相关文章

java IO流详解(一)

从本篇博文开始,详细讲解JAVA IO流的基本操作,力求每一个例子都给大家一个DEMO,在最终完成的时候,我会贴出最终的源码,方便大家交流学习. 上一篇博文中转载了大神的博文和图片,非常好! 文章链接如下:Java IO流 下面一个个的用实例进行讲解每个IO流的基本用法. 1 File文件 public static void main(String[] args) throws IOException { File file = new File("."); myPrint(file

《java基础知识》Java IO流详解

Java IO概念 1. 用于设备之间的数据传输. 2. Java 将操作数据流的功能封装到了IO包中. 3. 数据流流向分:输入流和输出流,操作对象为文件. 4. 流按照操作数据分:字节流(通用)和字符流. 5. 将计算机语言:二进制数据转换成文件显示到电脑上. IO包:继承关系图: 字符流: Reader :读取字符流,方法见API. Writer :写入字符流,方法见API. 案例(Writer ): import java.io.*; public class var { public

Java IO流详解(二)——File类

在上一章博客中简单的介绍了Java IO流的一些特征.也就是对文件的输入输出,既然至始至终都离不开文件,所以Java IO流的使用得从File这个类讲起. File类的描述:File类是文件和目录路径名的抽象表示形式,主要用于文件和目录的创建.查找和删除等操作.即Java中把文件或者目录(文件夹)都封装成File对象.也就是说如果我们要去操作硬盘上的文件或者目录只要创建File这个类即可. 不过要注意的是File类只是对文件的操作类,只能对文件本身进行操作,不能对文件内容进行操作. 1.File

Java IO流详解(五)——缓冲流

缓冲流也叫高效流,是处理流的一种,即是作用在流上的流.其目的就是加快读取和写入数据的速度. 缓冲流本身并没有IO功能,只是在别的流上加上缓冲效果从而提高了效率.当对文件或其他目标频繁读写或操作效率低,效能差时.这时使用缓冲流能够更高效的读写信息.因为缓冲流先将数据缓存起来,然后一起写入或读取出来.所以说,缓冲流还是很重要的,在IO操作时加上缓冲流提升性能. Java IO流中对应的缓冲流有以下四个: 字节缓冲流:BufferedInputStream.BufferedOutputStream 字

Java IO流详解

初学java,一直搞不懂java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂.而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正,也希望大家提出宝贵意见. 首先看个图:(如果你也是初学者,我相信你看了真个人都不好了,想想java设计者真是煞费苦心啊!) 这是java io 比较基本的一些处理流,除此之外我们还会提到一些比较深入的基于io的处理类,比如console类,SteamTokenzier,Externalizable接口,Serializa

Java IO流详解(五)

使用的是InputStreamReader和OutputStreamWriter,它们本身属于的是reader和writer字符流,我们之所以会用到这些转化流是因为系统有时候只给我们提供了字节流,为了方便操作,要用到字符流.比如说System.in标准输入流就是字节流.你想从那里得到用户在键盘上的输入,只能是以转换流将它转换为Reader以方便自己的程序读取输入.再比如说Socket里的getInputStream()很明显只给你提供字节流,你要想读取字符,就得给他套个InputStreamRe

Java IO流详解(四)

Serializable序列化 1 对象的序列化 class Person implements Serializable { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String toString() { return "Name:" + this.name + ", Age:&

Java IO流详解(二)

1 文件对象 public class CreateFile { public static void main(String[] args) { //创建要操作的文件路径和名称 //其中,File.separator表示系统相关的分隔符,Linux下为:/ Windows下为:\\ //path在此程序里面代表父目录,不包含子文件 String path = "D:\\Program Files (x86)\\ADT\\workspace\\JavaIO\\parent"; //ch

java知识点分享,IO流详解!

Java知识IO流详解有人觉得IO知识不太重要,其实不然,IO的使用范围很广,最能体现IO价值的就是网络上的数据传递,尤其是进入互联网时代后,各种常见的分布式架构,都少不了IO的体现.并且很多大厂的面试题中都会体现出对IO的重视,包括衍生出来的NIO.序列化等等.因此学好IO,变成了一件很重要的事情.IO基本概念IO可以简单的理解成INPUT和OUT,代表输入输出的意思.输入就是读,输出就是写.IO可以读写硬盘.光盘.内存.键盘.网络等资源上的数据.流IO中的流就相当于现实生活中的水流一样,一打