Java 学习I/O典型使用方式

目录

缓存输入文件

内存输入

格式化内存输入

基本文件输出

存储与恢复数据


缓存输入文件

读取文件内容:

package StreamDemo;

import java.io.BufferedReader;
import java.io.*;

public class BufferedInputDemo {
    public static String read(String filename)throws IOException {
        BufferedReader in=new BufferedReader(new FileReader(filename));
        String s;
        StringBuilder sb = new StringBuilder();
        while ((s=in.readLine())!=null){
            sb.append(s+"\n");//读取每一行文件

        }
        in.close();
        return sb.toString();
    }

    public static void main(String[] args) throws IOException {
        //using test.txt
        /**
         * 这里写绝对路径
         */
        System.out.println(read("C:\\MySpace\\MyCode\\IdeaCode\\IO\\src\\StreamDemo\\test.txt"));
    }
}

test.txt文件内容: 

Google
Tencent
Baidu
IBM
Intel
Huawei

内存输入

使用上文所使用BufferedInputDemo类,每次读取一个字符,打印到控制台:

package StreamDemo;
import java.io.*;
public class MemoryInDemo {
    //using test.txt
    public static void main(String[] args) throws IOException {
        StringReader reader = new StringReader(BufferedInputDemo.read("C:\\MySpace\\MyCode\\IdeaCode\\IO\\src\\StreamDemo\\test.txt"));
        int c;
        while ((c = reader.read()) != -1) {
            System.out.print((char)c+" ");//read()以int形式返回下一字节,必须转化为(char)
        }
    }
}

Output:


G o o g l e 
 T e n c e n t 
 B a i d u 
 I B M 
 I n t e l 
 H u a w e i 

格式化内存输入

使用BufferedInputDemo类

格式化数据,一般使用面向字节的DataInputStream类,必须使用InputStream类而不是Reader类(它是面向字符流的)。

package StreamDemo;
import java.io.*;

public class FormattedMemoryInput {
    public static void main(String[] args)throws IOException {
        //using test.txt
        try {
            DataInputStream dis=new DataInputStream(
                    new ByteArrayInputStream(
                            BufferedInputDemo.read("C:\\MySpace\\MyCode\\IdeaCode\\IO\\src\\StreamDemo\\test.txt").getBytes()));
            while (true) {
                System.out.print((char) dis.readByte());
            }
        } catch (EOFException e) {
            System.out.println("数据流末尾");
        }
    }
}

必须为ByteArrayInputStream提供字节数组,为了产生该数组String包含一个可以实现此项工作的getBytes()方法。数据一层一层传递:

Output:

Google
Tencent
Baidu
IBM
Intel
Huawei
数据流末尾

 

DataInputStream的readByte()方法一个一个字节地读取字符,任何字节的值都是合法结果,返回值不能用来检测输入是否结束,我们可以用available()方法查看还有多少可供存取的字符。
package StreamDemo;

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class TestEOF {
    public static void main(String[] args)
    throws IOException {
        //using test.txt
        DataInputStream in=new DataInputStream(
                new BufferedInputStream(
                        new FileInputStream("C:\\MySpace\\MyCode\\IdeaCode\\IO\\src\\StreamDemo\\test.txt")
                )
        );
        while (in.available()!=0){
            System.out.print((char) in.readByte());
        }
    }
}

Output结果同上。

基本文件输出

新建一个test1.txt文件

使用上文中BufferedInputDemo 类的read()方法,把文件变成字符串

package StreamDemo;

import java.io.*;

public class FileOutput {
    public static void main(String[] args)
    throws IOException {
        //using test.txt test1.txt
        BufferedReader in=new BufferedReader(
                new StringReader(
                        BufferedInputDemo.read("C:\\MySpace\\MyCode\\IdeaCode\\IO\\src\\StreamDemo\\test.txt")
                )
        );//输入文件流
        PrintWriter out = new PrintWriter(
                new BufferedWriter(new FileWriter("C:\\MySpace\\MyCode\\IdeaCode\\IO\\src\\StreamDemo\\test1.txt"))
        );//输出文件流
        int lineCnt = 1;//行号
        String s;
        while ((s = in.readLine()) != null) {
            out.println(lineCnt++ +":"+s);
        }
        out.close();
        System.out.println("---------------");
        System.out.println(BufferedInputDemo.read("C:\\MySpace\\MyCode\\IdeaCode\\IO\\src\\StreamDemo\\test1.txt "));


    }
}

常用BufferedWriter包装起来用以缓存输出。

一旦读完数据流,readLine()返回空,需要管不out输出流,如果不关闭,就会发现缓存区内容不会刷新情况,内容就会不完整。

Output:

---------------
1:Google
2:Tencent
3:Baidu
4:IBM
5:Intel
6:Huawei

存储与恢复数据

新建Data.txt文件

package StreamDemo;

import java.io.*;

public class SavingAndRecovering {
    /**using Data.txt
     *        DataOutputStream写入数据,DataInputStream恢复数据
     *        且都面向字节
     *
     */
    public static void main(String[] args) throws IOException {

        DataOutputStream out=new DataOutputStream(
                new BufferedOutputStream(
                        new FileOutputStream("C:\\MySpace\\MyCode\\IdeaCode\\IO\\src\\StreamDemo\\Data.txt")//文件路径
                )
        );
        out.writeUTF("Google is an Internet company");//写入数据
        out.writeInt(90000);
        out.writeUTF("employees");
        out.close();
        DataInputStream in=new DataInputStream(
                new BufferedInputStream(
                        new FileInputStream("C:\\MySpace\\MyCode\\IdeaCode\\IO\\src\\StreamDemo\\Data.txt")
                )
        );
        System.out.println(in.readUTF());//一次读取一行
        System.out.println(in.readInt());
        System.out.println(in.readUTF());




    }
}

Output:

Google is an Internet company
90000
employees

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值