当前位置:首页 > 操作系统 > MacOs

JAVA之旅(三十)——打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码

com.lgl.hellojava; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; public class HelloJJAVA { public static void main(String[] args) { try { BufferedReader bufr = new BufferedReader(new InputStreamReader( System.in)); PrintWriter oWriter = new PrintWriter(System.out, true); String line = null; while ((line = bufr.readLine()) != null) { if (line.equals("over")) { break; } oWriter.write(line); } oWriter.close(); bufr.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

要想存到文件里,也是可以直接把文件给放进去的

二.合并流

我们来看看什么是合并流,在API文档上说,他可以串联流

<code><span class="hljs-keyword">package</span> com.lgl.hellojava;

<span class="hljs-keyword">import</span> java.io.FileInputStream;
<span class="hljs-keyword">import</span> java.io.FileNotFoundException;
<span class="hljs-keyword">import</span> java.io.FileOutputStream;
<span class="hljs-keyword">import</span> java.io.IOException;
<span class="hljs-keyword">import</span> java.io.SequenceInputStream;
<span class="hljs-keyword">import</span> java.util.Enumeration;
<span class="hljs-keyword">import</span> java.util.Vector;

<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">HelloJJAVA</span> {</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args) {
        <span class="hljs-keyword">try</span> {
            Vector<FileInputStream> v = <span class="hljs-keyword">new</span> Vector<FileInputStream>();
            v.add(<span class="hljs-keyword">new</span> FileInputStream(<span class="hljs-string">"1.txt"</span>));
            v.add(<span class="hljs-keyword">new</span> FileInputStream(<span class="hljs-string">"2.txt"</span>));
            Enumeration<FileInputStream> elements = v.elements();
            SequenceInputStream sis = <span class="hljs-keyword">new</span> SequenceInputStream(elements);

            FileOutputStream fos = <span class="hljs-keyword">new</span> FileOutputStream(<span class="hljs-string">"3.txt"</span>);

            <span class="hljs-keyword">byte</span>[] buf = <span class="hljs-keyword">new</span> <span class="hljs-keyword">byte</span>[<span class="hljs-number">1024</span>];
            <span class="hljs-keyword">int</span> len = <span class="hljs-number">0</span>;
            <span class="hljs-keyword">while</span> ((len = sis.read(buf)) != -<span class="hljs-number">1</span>) {
                fos.write(buf, <span class="hljs-number">0</span>, len);
            }   

            fos.close();
            sis.close();

        } <span class="hljs-keyword">catch</span> (FileNotFoundException e) {
            <span class="hljs-comment">// TODO Auto-generated catch block</span>
            e.printStackTrace();
        } <span class="hljs-keyword">catch</span> (IOException e) {
            <span class="hljs-comment">// TODO Auto-generated catch block</span>
            e.printStackTrace();
        }
    }
}
</code>

把1.txt和2.txt乃至add更多的内容合并到3.txt文件中,这就是流的合并

三.切割文件

合并文件可以,那肯定可以切割了,我们来看下具体是怎么去制作的

<code><span class="hljs-comment">// 切割文件</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">splitFile</span>() {
        <span class="hljs-keyword">try</span> {
            FileInputStream fis = <span class="hljs-keyword">new</span> FileInputStream(<span class="hljs-string">"1.jpg"</span>);
            FileOutputStream fos = <span class="hljs-keyword">null</span>;
            <span class="hljs-keyword">byte</span>[] buf = <span class="hljs-keyword">new</span> <span class="hljs-keyword">byte</span>[<span class="hljs-number">1024</span> * <span class="hljs-number">1024</span>];

            <span class="hljs-keyword">int</span> len = <span class="hljs-number">0</span>;
            <span class="hljs-keyword">int</span> count = <span class="hljs-number">1</span>;
            <span class="hljs-keyword">while</span> ((len = fis.read(buf)) != -<span class="hljs-number">1</span>) {
                fos = <span class="hljs-keyword">new</span> FileOutputStream((count++) + <span class="hljs-string">".patch"</span>);
                fos.write(buf, <span class="hljs-number">0</span>, len);
                fos.close();
            }

            fis.close();
        } <span class="hljs-keyword">catch</span> (FileNotFoundException e) {
            <span class="hljs-comment">// TODO Auto-generated catch block</span>
            e.printStackTrace();
        } <span class="hljs-keyword">catch</span> (IOException e) {
            <span class="hljs-comment">// TODO Auto-generated catch block</span>
            e.printStackTrace();
        }
    }</code>

当运行结束之后,我们可以看到

JAVA之旅(三十)——打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码 - 文章图片

已经成功切割了

切割完我们可以合并了

<code><span class="hljs-comment">// 合并文件</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">merge</span>() {
        ArrayList<FileInputStream> al = <span class="hljs-keyword">new</span> ArrayList<>();
        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">1</span>; i <= <span class="hljs-number">2</span>; i++) {
            <span class="hljs-keyword">try</span> {
                al.add(<span class="hljs-keyword">new</span> FileInputStream(i + <span class="hljs-string">".patch"</span>));
            } <span class="hljs-keyword">catch</span> (FileNotFoundException e) {
                <span class="hljs-comment">// TODO Auto-generated catch block</span>
                e.printStackTrace();
            }
        }
        Iterator<FileInputStream> iterator = al.iterator();
        Enumeration<FileInputStream> en = <span class="hljs-keyword">new</span> Enumeration<FileInputStream>() {

            <span class="hljs-annotation">@Override</span>
            <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">hasMoreElements</span>() {
                <span class="hljs-comment">// TODO Auto-generated method stub</span>
                <span class="hljs-keyword">return</span> iterator.hasNext();
            }

            <span class="hljs-annotation">@Override</span>
            <span class="hljs-keyword">public</span> FileInputStream <span class="hljs-title">nextElement</span>() {
                <span class="hljs-comment">// TODO Auto-generated method stub</span>
                <span class="hljs-keyword">return</span> iterator.next();
            }

        };
        <span class="hljs-keyword">try</span> {
            SequenceInputStream seq = <span class="hljs-keyword">new</span> SequenceInputStream(en);
            FileOutputStream fos = <span class="hljs-keyword">new</span> FileOutputStream(<span class="hljs-string">"2.jpg"</span>);

            <span class="hljs-keyword">byte</span>[] buf = <span class="hljs-keyword">new</span> <span class="hljs-keyword">byte</span>[<span class="hljs-number">1024</span>];

            <span class="hljs-keyword">int</span> len = <span class="hljs-number">0</span>;

            <span class="hljs-keyword">while</span> ((len = seq.read(buf)) != -<span class="hljs-number">1</span>) {
                fos.write(buf, <span class="hljs-number">0</span>, len);
            }

            fos.close();
            seq.close();

        } <span class="hljs-keyword">catch</span> (FileNotFoundException e) {
            <span class="hljs-comment">// TODO Auto-generated catch block</span>
            e.printStackTrace();
        } <span class="hljs-keyword">catch</span> (IOException e) {
            <span class="hljs-comment">// TODO Auto-generated catch block</span>
            e.printStackTrace();
        }
    }
</code>

这样我们就把图片拷贝出来了,可以看到

JAVA之旅(三十)——打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码 - 文章图片

这段代码是非常帮的,我们一定会用到的,希望能用的上

四.对象的序列化Serializable

其实就是可以直接操作对象的流,他会实现一个Serializable()接口,我们用代码来看下他是怎么用的,我们直接写读取对象的类了

<code><span class="hljs-keyword">package</span> com.lgl.hellojava;

<span class="hljs-keyword">import</span> java.io.FileInputStream;
<span class="hljs-keyword">import</span> java.io.FileOutputStream;
<span class="hljs-keyword">import</span> java.io.IOException;
<span class="hljs-keyword">import</span> java.io.ObjectInputStream;
<span class="hljs-keyword">import</span> java.io.ObjectOutputStream;
<span class="hljs-keyword">import</span> java.io.Serializable;

<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">HelloJJAVA</span> {</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args) {
        <span class="hljs-comment">// writeObj();</span>
        readObj();
    }

    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">readObj</span>() {
        <span class="hljs-keyword">try</span> {
            ObjectInputStream ois = <span class="hljs-keyword">new</span> ObjectInputStream(<span class="hljs-keyword">new</span> FileInputStream(
                    <span class="hljs-string">"obj.txt"</span>));
            Person p = (Person) ois.readObject();
            System.out.println(p);
            ois.close();
        } <span class="hljs-keyword">catch</span> (IOException e) {
            <span class="hljs-comment">// TODO Auto-generated catch block</span>
            e.printStackTrace();
        } <span class="hljs-keyword">catch</span> (ClassNotFoundException e) {
            <span class="hljs-comment">// TODO Auto-generated catch block</span>
            e.printStackTrace();
        }

    }

    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">writeObj</span>() {
        <span class="hljs-keyword">try</span> {
            ObjectOutputStream oos = <span class="hljs-keyword">new</span> ObjectOutputStream(
                    <span class="hljs-keyword">new</span> FileOutputStream(<span class="hljs-string">"obj.txt"</span>));
            oos.writeObject(<span class="hljs-keyword">new</span> Person(<span class="hljs-string">"zhangsan"</span>, <span class="hljs-number">20</span>));
            oos.close();
        } <span class="hljs-keyword">catch</span> (IOException e) {
            <span class="hljs-comment">// TODO Auto-generated catch block</span>
            e.printStackTrace();
        }

    }
}

class Person implements Serializable {

    String name;
    <span class="hljs-keyword">int</span> age;

    <span class="hljs-keyword">public</span> <span class="hljs-title">Person</span>(String name, <span class="hljs-keyword">int</span> age) {
        <span class="hljs-keyword">this</span>.name = name;
        <span class="hljs-keyword">this</span>.age = age;
    }

}</code>

OK,自己去验证一下

五.管道流

输入输出可以直接进行连接,通常结合线程使用

JAVA之旅(三十)——打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码 - 文章图片

<code>package com.lgl.hellojava;

import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;

<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> HelloJJAVA {
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args) {

        PipedInputStream pi = <span class="hljs-keyword">new</span> PipedInputStream();
        PipedOutputStream po = <span class="hljs-keyword">new</span> PipedOutputStream();

        <span class="hljs-keyword">try</span> {
            pi.connect(po);
        } <span class="hljs-keyword">catch</span> (IOException e) {
            <span class="hljs-comment">// TODO Auto-generated catch block</span>
            e.printStackTrace();
        }

        Read read = <span class="hljs-keyword">new</span> Read(pi);
        Write write = <span class="hljs-keyword">new</span> Write(po);

        <span class="hljs-keyword">new</span> Thread(read).start();
        <span class="hljs-keyword">new</span> Thread(write).start();
    }
}

class Read implements Runnable {

    <span class="hljs-keyword">private</span> PipedInputStream <span class="hljs-keyword">in</span>;

    <span class="hljs-keyword">public</span> <span class="hljs-title">Read</span>(PipedInputStream <span class="hljs-keyword">in</span>) {
        <span class="hljs-keyword">this</span>.<span class="hljs-keyword">in</span> = <span class="hljs-keyword">in</span>;
    }

    @Override
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span>() {
        <span class="hljs-keyword">try</span> {
            <span class="hljs-keyword">byte</span>[] buf = <span class="hljs-keyword">new</span> <span class="hljs-keyword">byte</span>[<span class="hljs-number">1024</span>];
            <span class="hljs-keyword">int</span> len = <span class="hljs-keyword">in</span>.read(buf);
            String s = <span class="hljs-keyword">new</span> String(buf, <span class="hljs-number">0</span>, len);
            System.<span class="hljs-keyword">out</span>.println(s);
            <span class="hljs-keyword">in</span>.close();
        } <span class="hljs-keyword">catch</span> (IOException e) {
            <span class="hljs-comment">// TODO Auto-generated catch block</span>
            e.printStackTrace();
        }

    }

}

class Write implements Runnable {

    <span class="hljs-keyword">private</span> PipedOutputStream <span class="hljs-keyword">out</span>;

    <span class="hljs-keyword">public</span> <span class="hljs-title">Write</span>(PipedOutputStream <span class="hljs-keyword">out</span>) {
        <span class="hljs-keyword">this</span>.<span class="hljs-keyword">out</span> = <span class="hljs-keyword">out</span>;
    }

    @Override
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span>() {
        <span class="hljs-keyword">try</span> {
            <span class="hljs-keyword">out</span>.write(<span class="hljs-string">"yes"</span>.getBytes());
            <span class="hljs-keyword">out</span>.close();
        } <span class="hljs-keyword">catch</span> (IOException e) {
            <span class="hljs-comment">// TODO Auto-generated catch block</span>
            e.printStackTrace();
        }
    }

}</code>

现在就可以联通了

六.RandomAccessFile

这是一个很特别的家伙,他继承的是Object

JAVA之旅(三十)——打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码 - 文章图片

  • 该类不是IO体系中的子类
  • 但是他是IO包中的成员,他同时具备读写功能
  • 内部封装了一个数组,而且通过指针对数组中的元素进行操作
  • 可以通过getFilePointer或者指针位置同时可以通过seek改变指针的位置

其实完成读写的原理就是内部封装了字节输入,输出流,通过构造函数可以看出该类具备操作文件的能力,而且操作文件还有模式

<code><span class="hljs-keyword">package</span> com.lgl.hellojava;

<span class="hljs-keyword">import</span> java.io.FileNotFoundException;
<span class="hljs-keyword">import</span> java.io.IOException;
<span class="hljs-keyword">import</span> java.io.RandomAccessFile;

<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">HelloJJAVA</span> {</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args) {
            writeFile();
    }

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">writeFile</span>() {
        <span class="hljs-keyword">try</span> {
            RandomAccessFile raf = <span class="hljs-keyword">new</span> RandomAccessFile(<span class="hljs-string">"1.txt"</span>, <span class="hljs-string">"rw"</span>);
            raf.write(<span class="hljs-string">"zhangssan"</span>.getBytes());
            raf.writeInt(<span class="hljs-number">99</span>);

            raf.close();
        } <span class="hljs-keyword">catch</span> (FileNotFoundException e) {
            <span class="hljs-comment">// TODO Auto-generated catch block</span>
            e.printStackTrace();
        } <span class="hljs-keyword">catch</span> (IOException e) {
            <span class="hljs-comment">// TODO Auto-generated catch block</span>
            e.printStackTrace();
        }
    }
}
</code>

这只是一个写的过程,我们的特性还没有体现出来,我们来看下他是怎么读的

<code><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">ReadFile</span>() {
        <span class="hljs-keyword">try</span> {
            RandomAccessFile raf = <span class="hljs-keyword">new</span> RandomAccessFile(<span class="hljs-string">"1.txt"</span>, <span class="hljs-string">"r"</span>);

            <span class="hljs-comment">// 调整对象指针</span>
            raf.seek(<span class="hljs-number">8</span> * <span class="hljs-number">0</span>);

            <span class="hljs-keyword">byte</span>[] buf = <span class="hljs-keyword">new</span> <span class="hljs-keyword">byte</span>[<span class="hljs-number">1024</span>];

            raf.read(buf);

            String s = <span class="hljs-keyword">new</span> String(buf);

            System.<span class="hljs-keyword">out</span>.println(s);

            raf.close();
        } <span class="hljs-keyword">catch</span> (FileNotFoundException e) {
            <span class="hljs-comment">// TODO Auto-generated catch block</span>
            e.printStackTrace();
        } <span class="hljs-keyword">catch</span> (IOException e) {
            <span class="hljs-comment">// TODO Auto-generated catch block</span>
            e.printStackTrace();
        }

    }
</code>

如果操作的文件不存在,就会自动创建,如果存在,直接覆盖

七.IO其他类

IO其他包里,还有一些其他的使用

  • 操作基本数据类型
  • 字节数组
  • 字符数组

1.基本数据类型

我们先来看下基本数据类型的,我直接读写都写出来

<code>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">readData</span>() {
        <span class="hljs-keyword">try</span> {
            DataInputStream dis = <span class="hljs-keyword">new</span> DataInputStream(<span class="hljs-keyword">new</span> FileInputStream(
                    <span class="hljs-string">"data.txt"</span>));
            <span class="hljs-keyword">int</span> num = dis.readInt();
            boolean d = dis.readBoolean();

            System.<span class="hljs-keyword">out</span>.println(num + <span class="hljs-string">""</span> + d + <span class="hljs-string">""</span>);

            dis.close();

        } <span class="hljs-keyword">catch</span> (FileNotFoundException e) {
            <span class="hljs-comment">// TODO Auto-generated catch block</span>
            e.printStackTrace();
        } <span class="hljs-keyword">catch</span> (IOException e) {
            <span class="hljs-comment">// TODO Auto-generated catch block</span>
            e.printStackTrace();
        }

    }

    <span class="hljs-comment">// 基本数据类型</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">writeDatea</span>() {
        <span class="hljs-keyword">try</span> {
            DataOutputStream dos = <span class="hljs-keyword">new</span> DataOutputStream(<span class="hljs-keyword">new</span> FileOutputStream(
                    <span class="hljs-string">"data.txt"</span>));

            dos.writeInt(<span class="hljs-number">55</span>);
            dos.writeBoolean(<span class="hljs-keyword">true</span>);

            dos.close();

        } <span class="hljs-keyword">catch</span> (FileNotFoundException e) {
            <span class="hljs-comment">// TODO Auto-generated catch block</span>
            e.printStackTrace();
        } <span class="hljs-keyword">catch</span> (IOException e) {
            <span class="hljs-comment">// TODO Auto-generated catch block</span>
            e.printStackTrace();
        }

    }</code>

读取基本数据类型

二.字节数组

这个偶尔用下,但是我们还是要去学习一下的

  • ByteArrayInputStream: 在构造的时候,需要接收数据源,而且数据源是一个字节数组

  • ByteArrayOutputStream:在构造的时候,不用定义数据的目的,因为该对象中已经内部封装了可变程度的字节数组

因为这两个流的对象都操作的数组,并且没有使用系统资源,所以,不用进行close关闭!

<code>package com.lgl.hellojava;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> HelloJJAVA {
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args) {

        <span class="hljs-comment">// 数据源</span>
        ByteArrayInputStream bis = <span class="hljs-keyword">new</span> ByteArrayInputStream(<span class="hljs-string">"123"</span>.getBytes());
        <span class="hljs-comment">// 数据目的</span>
        ByteArrayOutputStream bos = <span class="hljs-keyword">new</span> ByteArrayOutputStream();

        <span class="hljs-keyword">int</span> ch = <span class="hljs-number">0</span>;

        <span class="hljs-keyword">while</span> ((ch = bis.read()) != -<span class="hljs-number">1</span>) {
            bos.write(ch);
        }

        System.<span class="hljs-keyword">out</span>.println(bos.size());
        System.<span class="hljs-keyword">out</span>.println(bos.toString());

    }
}
</code>

是不是比较简单,字符流我就不说了,和字节流是类似的,但是他会衍生出一个新的内容就是字符编码

八.字符编码

这些乱七八糟的编码说真的,东西还是挺多的,但是我并不想讲那么多,因为本身我也不是很清楚,其次这玩意大致的知道一点就可以了(个人觉得),什么ASCLL,GBK,UTF-8之类的

<code>        String s = <span class="hljs-string">"hello java"</span><span class="hljs-comment">;</span>
        byte [] b1 = s<span class="hljs-preprocessor">.getBytes</span>()<span class="hljs-comment">;</span>
        System<span class="hljs-preprocessor">.out</span><span class="hljs-preprocessor">.println</span>(Arrays<span class="hljs-preprocessor">.toString</span>(b1))<span class="hljs-comment">;</span></code>

他得到的是什么?

JAVA之旅(三十)——打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码 - 文章图片

现在我换一个编码

<code><span class="hljs-keyword">byte</span> [] b1 = s.getBytes(<span class="hljs-string">"GBK"</span>);</code>

我设置成GBK,他的值是一样的,说明默认的是GBK

九.练习

写完这个练习,我们的I/O流就GG了,感慨颇多,写I/O写了很多篇,但是仍然晕乎乎的,应该继续加深印象的,我们来看下需求

  • 有五个学生,每个学生有三门课程,从键盘输入以下数据(包括姓名,三门课成绩),输入的格式,如zhangsan,30,60,96计算出总成绩,并把学生的信息和计算出的总分数高低顺序存入文件student.txt中去;

好了,开始撸代码了

<code><span class="hljs-keyword">package</span> com.lgl.hellojava;

<span class="hljs-keyword">import</span> java.io.BufferedReader;
<span class="hljs-keyword">import</span> java.io.BufferedWriter;
<span class="hljs-keyword">import</span> java.io.FileWriter;
<span class="hljs-keyword">import</span> java.io.IOException;
<span class="hljs-keyword">import</span> java.io.InputStreamReader;
<span class="hljs-keyword">import</span> java.util.Set;
<span class="hljs-keyword">import</span> java.util.TreeSet;

<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">HelloJJAVA</span> {</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args) {

        <span class="hljs-javadoc">/**
         * 逻辑: 
         * 1.通过获取键盘录入一行数据,然后取出数据封装成学生对象 
         * 2.需要从高到低排列,需要排序,使用集合TreeSet就可以了
         * 3.写入文件
         */</span>

        <span class="hljs-keyword">try</span> {
            Set<Student> stus = StudentInfoTool.getStudents();
            StudentInfoTool.writeFile(stus);

        } <span class="hljs-keyword">catch</span> (IOException e) {
            <span class="hljs-comment">// TODO Auto-generated catch block</span>
            e.printStackTrace();
        }

    }
}

<span class="hljs-comment">// 比较数据,Comparable接口</span>
class Student implements Comparable<Student> {

    <span class="hljs-comment">// 姓名</span>
    <span class="hljs-keyword">private</span> String name;
    <span class="hljs-comment">// 三科分数</span>
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> n1, n2, n3;
    <span class="hljs-comment">// 总分</span>
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> sum;

    <span class="hljs-comment">// 构造函数</span>
    <span class="hljs-keyword">public</span> <span class="hljs-title">Student</span>(String name, <span class="hljs-keyword">int</span> n1, <span class="hljs-keyword">int</span> n2, <span class="hljs-keyword">int</span> n3) {
        <span class="hljs-keyword">this</span>.name = name;
        <span class="hljs-keyword">this</span>.n1 = n1;
        <span class="hljs-keyword">this</span>.n2 = n2;
        <span class="hljs-keyword">this</span>.n3 = n3;
        sum = n1 + n2 + n3;
    }

    <span class="hljs-keyword">public</span> String <span class="hljs-title">getName</span>() {
        <span class="hljs-keyword">return</span> name;
    }

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setName</span>(String name) {
        <span class="hljs-keyword">this</span>.name = name;
    }

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getSum</span>() {
        <span class="hljs-keyword">return</span> sum;
    }

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setSum</span>(<span class="hljs-keyword">int</span> sum) {
        <span class="hljs-keyword">this</span>.sum = sum;
    }

    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">compareTo</span>(Student o) {
        <span class="hljs-keyword">int</span> num = <span class="hljs-keyword">new</span> Integer(<span class="hljs-keyword">this</span>.sum).compareTo(<span class="hljs-keyword">new</span> Integer(o.sum));
        <span class="hljs-keyword">if</span> (num == <span class="hljs-number">0</span>) {
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.name.compareTo(o.name);
        }
        <span class="hljs-keyword">return</span> num;
    }

    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">hashCode</span>() {
        <span class="hljs-comment">// TODO Auto-generated method stub</span>
        <span class="hljs-keyword">return</span> name.hashCode() + sum * <span class="hljs-number">78</span>;
    }

    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">equals</span>(Object obj) {
        <span class="hljs-keyword">if</span> (!(obj <span class="hljs-keyword">instanceof</span> Student)) {
            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> ClassCastException(<span class="hljs-string">"Type Error"</span>);
        }
        Student s = (Student) obj;
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.name.equals(s.name) && <span class="hljs-keyword">this</span>.sum == s.sum;
    }

}

<span class="hljs-comment">// 工具类</span>
class StudentInfoTool {
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> Set<Student> <span class="hljs-title">getStudents</span>() <span class="hljs-keyword">throws</span> IOException {
        BufferedReader bufr = <span class="hljs-keyword">new</span> BufferedReader(<span class="hljs-keyword">new</span> InputStreamReader(
                System.in));
        String line = <span class="hljs-keyword">null</span>;
        <span class="hljs-comment">// 集合</span>
        Set<Student> stus = <span class="hljs-keyword">new</span> TreeSet<>();

        <span class="hljs-keyword">while</span> ((line = bufr.readLine()) != <span class="hljs-keyword">null</span>) {
            <span class="hljs-keyword">if</span> (line.equals(<span class="hljs-string">"over"</span>)) {
                <span class="hljs-keyword">break</span>;
            }
            String[] info = line.split(<span class="hljs-string">","</span>);
            Student student = <span class="hljs-keyword">new</span> Student(info[<span class="hljs-number">0</span>], Integer.parseInt(info[<span class="hljs-number">1</span>]),
                    Integer.parseInt(info[<span class="hljs-number">2</span>]), Integer.parseInt(info[<span class="hljs-number">3</span>]));
            stus.add(student);
        }
        bufr.close();
        <span class="hljs-keyword">return</span> stus;
    }

    <span class="hljs-comment">// 写入文件</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">writeFile</span>(Set<Student> stus) {
        <span class="hljs-keyword">try</span> {
            BufferedWriter bufw = <span class="hljs-keyword">new</span> BufferedWriter(<span class="hljs-keyword">new</span> FileWriter(
                    <span class="hljs-string">"student.txt"</span>));
            <span class="hljs-keyword">for</span> (Student stu : stus) {
                bufw.write(stu.getName());
                bufw.write(stu.getSum() + <span class="hljs-string">""</span>);
                bufw.newLine();
                bufw.flush();
            }

            bufw.close();
        } <span class="hljs-keyword">catch</span> (IOException e) {
            <span class="hljs-comment">// TODO Auto-generated catch block</span>
            e.printStackTrace();
        }

    }
}
</code>

输出的结果,可以看到

JAVA之旅(三十)——打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码 - 文章图片

总数,从小到大,如果你想从高到低的话,自己去实现下排序,看看你们学的怎么样了

好的,我们本篇到这里就结束了,这篇也是憋了挺久的才别出来的,终于把IO写完了

有兴趣的可以加群:555974449

JAVA之旅(三十)——打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码

标签:

本文系统来源:http://blog.csdn.net/qq_26787115/article/details/51922882


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐