java文件流和管道流

文件流

文件流是指专门用于操作数据源中的文件的流,主要有FileInputStream、FileOutStream、FileReader、FileWriter四个类。

举个例子

1.比如用字节流读取文件

public static void main(String[] args) throws IOException {
        FileInputStream fin = null;
        try {
            fin = new FileInputStream("诗.txt");
            int i;
            while ((i = fin.read()) != -1) {
                System.out.print((char) i);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            fin.close();
        }

    }
}

结果正是文件中的内容
aaaaa
bbbbb
ccccc
但文件里面保存的是英文,如果是中文则是乱码,打印出一堆??????

2.比如用字节流写文件

public static void main(String[] args) {
        FileOutputStream fos = null;
        String s = "用字节流写的";
        try {
            fos = new FileOutputStream("诗.txt");
            int i;
            fos.write(s.getBytes());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

结果:
用字节流写的

注意:这个write( )括号里面是字节型,所以需要转换,需要注意的是我在fos = new FileOutputStream(“诗.txt”)这里括号里面没有true,所以每次运行都会重新开始写文件。


3.比如用字符流写文件

public static void main(String[] args) throws IOException {
        FileWriter fw = null;
        try {
            fw = new FileWriter("诗.txt");
            fw.write("用字符流写的");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            fw.close();
        }

    }
}

注意:FileWriter类的write( )方法有字符串型的形参。

4.比如用字符流读文件

public static void main(String[] args) throws IOException {
        FileReader fin = null;
        try {
            fin = new FileReader("诗.txt");
            int i;
            while ((i = fin.read()) != -1) {
                System.out.print((char) i);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            fin.close();
        }

    }
}

结果:
用字符流写的


5.用缓冲流和字符流写文件

public static void main(String[] args) throws IOException {
        BufferedWriter bw = null;
        try {
            bw = new BufferedWriter(new FileWriter("诗.txt"));
            bw.write("用缓冲流和字符流写的");
            bw.newLine();  //输出到下一行
            bw.write("真方便");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            bw.flush();
            bw.close();
        }
    }
}

6.用缓冲流和字符流读文件

public static void main(String[] args) {
        BufferedReader br = null;
        try {
            String s = null;
            br = new BufferedReader(new FileReader("诗.txt"));
            while ((s = br.readLine()) != null) {
                System.out.println(s);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

结果:
用缓冲流和字符流写的
真方便


随机存取文件流

对一个文件同时进行读或写操作,使用RandomAccessFile类。
其有以下两个特点:
1.对一个文件可以同时进行既读又写的操作;
2.可以在文件中的指定位置读取数据或写入数据。

RandomAccessFile类使用文件指针概念实现文件随机存取方式,文件指针指定当前读写数据的位置,就像数组中的下标。对于只读方式,文件指针只有一个,表示读取数据的位置;对于读写方式,文件指针有两个,分别表示读取数据的位置和写入数据的位置。文件指针是隐含的,不需要声明,由Java自动管理。当打开文件时,文件读指针的默认位置式文件开头的第一个元素位置;文件写指针的默认位置是文件尾。当读写一个数据后,文件读写指针会自动向后移动一个元素位置。一般情况下,不需要特别指定读写数据位置,有特殊需求时,可以调用getFilePointer()或seek()方法获得或设置文件指针位置。


输入输出流操作的一般步骤如下:
(1)使用引入语句引入java.io包:import java.io.*;
(2)根据不同数据源和输入输出任务,建立字节流或字符流对象。
(3)若需要对字节或字符流信息组织加工为数据,在已建字节流或字符流对象上构建数据流对象。
(4)用输入输出流对象类的成员方法进行读写操作。
(5)关闭流对象。


管道流

管道流提供在对象之间传输数据的基本手段。其分为输出流和输入流。既可以是字节流,也可以是字符流。一次数据传输操作需要两个管道流对象,一个输入流对象,一个输出流对象,并且这两个管道流对象需要建立连接,之后,一个对象可以向管道输出流对象写入数据,另一个对象可以从管道输入流对象中读取数据。
管道流包括字节流PipedInputStream类、PipedOutputStream类字符流PipedReader类、PipedWriter类。
两种建立连接的方法:

(1)在构造方法中连接
PipedInputStream pis = new PipedInputStream();
PipedOutputStream pos = new PipedOutputStream(pis);

(2)用connect()方法进行连接
PipedInputStream pis = new PipedInputStream();
PipedOutputStream pos = new PipedOutputStream();
pis.connect(pos);

举个例子:
PipedInputStrem类和PipedOutputStream类创建管道流举例。

public static void main(String[] args) {
        byte a1 = 123, a2 = 111;
        PipedInputStream pis = null;
        PipedOutputStream pos = null;
        pis = new PipedInputStream();
        try {
            pos = new PipedOutputStream(pis);
            pos.write(a1);
            pos.write(a2);
            System.out.println(pis.read());
这里用pis.available()!=-1 或者 pis.read()!=-1 都会造成线程死锁,原因是PipedInputStream类和PipedOutputStream类在同一个线程中会造成线程死锁。
            System.out.println(pis.read());
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

结果仅限于验证本例,同一线程不能这样写Java在它的jdk文档中提到不要在一个线程中同时使用PipeInpuStream和PipeOutputStream,这会造成死锁
123
111

字符管道流

PipedWriter和PipedReader在线程之间传输字符信息。
与 PipedOutputStream和PipedInputStream类似PipedWriter 是Writer的直接子类,PipedReader是Reader的直接子类。
PipedWriter拥有一个允许指定输入管道字符流的构造方法,而PipedReader拥有一个允许指定输出管道字符流的构造方法。从而使得PipedWriter和PipedReader往往成对出现、配合使用。

标准输入输出流和错误流

System.out:
把输出送到缺省的显示(通常是显示器)
System.in
从标准输入获取输入(通常是键盘)
System.err
把错误信息送到缺省的显示
System是final类,in,out,err是System的静态成员变量,因此可以用System.in等形式直接使用。out的用法大家已熟知了,err的用法与out一样。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值