流概述与字节流输入输出

概述

File类可以对文件或目录的属性进行操作,但是File类不能访问文件的内容,即不能从文件中读取数据或者往文件里写数据。

读文件是指把文件中的数据读取到内存中。反之,写文件是把内存中的数据写到文件中。读写文件的工具是流。

流是指一连串流动的字符,是以先进先出的方式发送和接受数据的通道。流分为输入流和输出流。如果数据输入到内存,则称为输入流,如果从内存中输出则称为输出流。java中的输出流主要由OutputStream和Write作为基类,而输入流则主要由InputStream和Reader作为基类。

这个地方我可不可以这么理解:流有其对应的类,类是对象的抽象,可以把流理解为一个接受和发送数据通道,在构造流对象时把这个通道和数据源关联起来,然后用这个通道的方法来把数据源里面的数据读取或者发送。

那java中的类都是对现实之中存在的实体实物的抽象吗?还是说也可以对过程进行抽象?

在java.io包中,封装了许多输入、输出流的API。在程序中,这些输入、输出流类的对象称为流对象。可以通过这些流对象将内存中的数据以流的方式写入文件,也可以通过流对象将文件中的数据以流的方式读取到内存。

构造流对象往往会和数据源(文件)联系起来。数据源分为源数据源和目标数据源。输入流关联的是源数据源,输出流关联的是目标数据源。

输入\输出流又分为字节流和字符流两种形式。

字节流是8位通用字节流,其基本单位是字节。字节流的基类是InputStream类和OutputStream类它们是抽象类。

字符流是16位Unicode字符流,基本单位是Unicode字符。字符流最适合用来处理字符串和文本,因为它们支持国际上大多数的字符集和语言。字符流的基类是Reader类和Writer类,它们也是抽象类。

字节输入流常用方法

InputStream是一个抽象类,里面定义了字节输入流常用的方法。因为抽象类不能实例化,所以在实际中我们通常使用的都是它的子类FileInputStream类。

image

int read():从输入流中读取下一个字节数据;将数据源中的数据以一个字节一个字节的形式读入进来,而且读进来之后会把这些字节对应的整数形式返回给你。如果到了输入流的末尾,则返回-1。

int read (byte[] b):从输入流中读取数据,并将数据存储在缓冲区数组b中,返回实际读取的字节数(注:这个方法在读的时候也是将读进来的字节以对应整数形式存储在数组中,当从数组中读取时,需要进行强制装换(char))。如果到了输入流的末尾,则返回-1。

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class FileInputStreamDemo {
    public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream("H:/demo.txt");
            System.out.println(fis.available());
            byte[] save = new byte[4];
            int length = fis.read(save);
            while (length != 0) {
                for (int i = 0; i < length; i++) {
                    System.out.print((char) save[i]);
                }
                length = fis.read(save);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

字节输出流常用方法

OuputStream是一个抽象类,里面定义了字节输出流常用的方法。因为抽象类不能实例化,所以在实际中我们通常使用的都是它的子类FileOuputStream类。


image.png

实例:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileoutputStreamDemo {
    public static void main(String[] args) {
        FileOutputStream fos = null;
        FileInputStream fis = null;
        try {
            fos = new FileOutputStream("H:/demo.txt");
            String str = "醉后不知天在水,满船清梦压星河。";
            byte[] b = str.getBytes();
            fos.write(b);

            fis = new FileInputStream("H:/demo.txt");
            System.out.println(fis.available());
            byte[] c = new byte[10];
            int length = fis.read(c);
            while (length != 0) {
                for (int i = 0; i < length; i++) {
                    System.out.println((char) c[i]);
                }
                length = fis.read(c);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fis.close();
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

注:
1、在上面这个程序中当输入的字符串是abcdefg时,可以在后面的输出流中正常输出,但是要是是汉字的话,就比如“醉后不知天在水,满船清梦压星河。”就会出现一堆问号。可以写进去,但是读不出来。
这个问题后面有解答。
2、因为在输出的时候需要判定是追加还是覆盖,所以在FileOuputStream的构造方法后面可以加true或者不加。同时若目标文件不存在,还可以自己创建目标文件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容