文件读入写出字节流

18 篇文章 0 订阅

 一次读取一个字节

public static void read1() throws IOException { 
    // 1. 建立程序与文件之间的连接,用来读取这个文件 
    try(InputStream inputStream = new FileInputStream("test1.txt")){ 
        //2.读取数据,先声明一个变量,read方法的返回值,就是读取的数据 
        //注意:返回-1,默认认为数据读完了 int num = 0; 
        // num = inputStream.read(); 
        //3.直接读取数据 
        //想显示字符需要自己强转 
        // System.out.println((char)num); 
        // num = inputStream.read(); 
        // System.out.println((char)num); 
        // num = inputStream.read(); 
        // System.out.println((char)num); 
        // num = inputStream.read(); 
        // System.out.println((char)num); 
        // num = inputStream.read(); 
        // System.out.println((char)num); 
        // num = inputStream.read(); 
        // System.out.println(num);
        //返回-1,默认认为数据读完了 
        //4.使用循环读取数据 
        while ((num = inputStream.read()) != -1) { 
            System.out.print((char)num); 
        } 
    } catch (IOException e) { 
        e.printStackTrace(); 
    } 
}

一次读取多个字节

public static void read2() throws IOException { 
    // 1. 建立程序与文件之间的连接,用来读取这个文件 
    try (InputStream inputStream = new FileInputStream("test1.txt")) { 
        // 2. 读取字节流中的数据,需要有一个字节数组,用来读取数据 
        //创建临时数组 
        /* 数组是临时存放数据的地方,我们会将读到的字符放到临时数组中,数组的 大小决定了我们一次可以读到的字符个数. 
         * 一般这个数组的大小<=1kB
         * 返回值代表本次读到的真实的字符个数,如果返回值是-1代表读完了. 
         */  
        byte[] arr = new byte[2]; 
        // 3. 声明一个整型变量,用来记录每次读取了多少个字节的数据 
        int num = 0;  
        //4.直接读取数据 
        // num = reader.read(arr);
        // System.out.println(new String(arr,0,num)+" num:"+num); 
        // num = reader.read(arr); 
        // System.out.println(new String(arr,0,num)+" num:"+num); 
        // num = reader.read(arr); 
        //转部分字符到字符串,第二个参数是指定的下标,第三参数是字符数量
        // 将读取到的字节数组中的数据,转成字符串输出
        // 为了去除最后一次进行读取数据的时候,上次读取残留的问题
        // 最后一次读取的数据,只有指定部分是我们需要的数据
        // System.out.println(new String(arr,0,num)+" num:"+num);
        // num = reader.read(arr);
        // System.out.println(" num:"+num);
        //5.使用循环读取数据
        while ((num = inputStream.read(arr)) != -1){ 
            System.out.println(new String(arr,0,num)+" num:"+num);
        } 
    } catch (IOException e) { 
        e.printStackTrace(); 
    } 
}

一次性全部读入

public static void read3() throws IOException {
    // 1. 建立程序与文件之间的连接,用来读取这个文件 
    try (InputStream inputStream = new FileInputStream("test1.txt")) { 
        // 2. 读取字节流中的数据,需要有一个字节数组,用来读取数据 
        //获取文件的字节个数 
        //注意:这种方式适合文件的字节数比较小的时候,大概是几kb之内. 
        int num = inputStream.available(); 
        //2.读
        byte[] bytes = new byte[num]; 
        inputStream.read(bytes); 
        System.out.println(new String(bytes)); 
    } catch (IOException e) { 
        e.printStackTrace(); 
    } 
}

字节输出流

public class OutputStreamTest { 
    public static void main(String[] args) { 
        // 1. 实例化一个管道,连接文件和程序。 
        // 对于FileOutputStream来说,如果目标文件不存在,则会自动的创建,如果 存在,会将原来的内容覆盖 
        // 当无法创建这个文件的时候(父级目录不存在),创建会失败,会触发 FileNotFoundException 。 
        //OutputStream outputStream = new FileOutputStream("test1.txt") 
        //文件的续写:FileWriter(String file,boolean value) 
        //当value位true的时候,不会将原来的内容覆盖,会接着写    
        try (OutputStream outputStream = new FileOutputStream("test1.txt",true)) { 
            // 2. 准备需要写入到这个文件中的数据 String message = "你好,师姐"; 
            // 3. 将数据写入到输出流中,由输出流写入到文件中 
            //将字符串转成字节数组 
            outputStream.write(message.getBytes()); 
            // 冲刷缓冲区,将缓冲区中的数据强制流动到文件中。 
            // 在流关闭的时候,会自动的调用。 
            //注意:当我们进行循环写入操作时,最好通过flush()方法刷新 
            outputStream.flush(); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
    } 
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第十三章 文件 对数据的管理无论是用数组还是链表,都是存储在内存中的,程序结束后都会丢失,下一次运行程序时,要重新输入或运算生成数据。要把程序运行的数据保存起来以便下次运行继续使用,在计算机中持久保存数据的方式是利用文件保存。 13.1 文件概述 文件一般是指存储在外部介质上数据的集合。文件以数据形式存放在外部介质上,操作系统以文件为单位对数据进行管理。想找到存在外部介质上的数据,必须按文件名找到指定的文件然后再从该文件中读取数据。要想在外部介质上存储数据必须先建立一个文件(以文件名标识),才能向它输出数据。从操作系统角度,每一个与主机相连的输入输出设备都可以被看作一个文件。在程序运行时,常常需要将一些数据(运行的最终结果或中间数据)输出到磁盘上保存,以后要用时再从磁盘中输入到计算机的内存,这就要用到磁盘文件。 操作系统的文件标识包括三部分: (1)文件路径:表示文件在外部存储设备中的位置。 (2)文件名:遵循标识符的命名规则。 (3)文件扩展名:表示文件的性质(.txt .dat .c)。 如:d:\c++\temp\flie1.dat 文件操作是一种典型的IO操作(输入输出操作)。输入输出是针对内存而言的,进内存为输入,出内存为输出。 标准输入输出就是标准输入设备(键盘)和标准输出设备(显示器),键盘和显示器就是一种文件。C语言将文件看成字符(字节)的序列,即由一个一个字符(字节)的数据顺序组成。C语言中对文件的存取是以字符(字节)为单位的,输入输出数据流的开始和结束仅受程序控制不受物理符号控制(如回车换行符)。输出时不会自动增加回车换行符作为记录结束的标志,输入时不以回车换行符作为记录的间隔(实际上C文件不是由记录构成的),这种文件称为流式文件。 ANSI新标准文件采用缓冲方式,系统自动地在内存区为每一个正在使用的文件开辟一个缓冲区。从内存向磁盘输出数据必先送到输出缓冲区,装满缓冲区后才一起送到磁盘。从磁盘向内存输入数据先送到输入缓冲区,程序需要数据时去缓冲区读取,若缓冲区无数据,则程序进入阻塞状态(等待数据)。 C语言把数据看作是一连串的字符(字节),根据数据的组成形式,分为ASCII文件和二进制文件。 文本文件又称ASCII文件,每个字节存放一个ASCII码,代表一个字符。如1、2的ASCII码分别为49、50,所以整数12用ASCII文件存放时,存放形式为00110001 00110010 二进制文件是直接用数据的二进制形式存放的,即把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。 程序中实现对文件的处理通常分三步: (1)打开文件:将程序与文件建立联系。 (2)操作文件:对文件进行读写操作,即输入输出。 (3)关闭文件:操作完成应当切断文件与程序的联系。 C语言中没有输入输出语句,对文件的读写都是用库函数实现的。ANSI规定了标准输入输出函数,用它们对文件进行读写,这些函数的声明包含在头文件stdio.h中。 13.2 文件的打开与关闭 文件进行读写操作前先要打开,使用完毕要关闭。打开文件,是建立文件的各种有关信息,并使文件指针指向该文件,以便进行其他操作。关闭文件则断开指针与文件之间的联系。 1.打开文件(fopen函数) 原型:FILE *fopen(char *filename, char *mode); FILE是在stdio.h头文件中定义的一个结构体,用来保存文件信息。 fopen函数用来打开一个文件,其调用的一般形式为: 文件指针名=fopen(文件名,使用文件方式); 其中: ·“文件指针名”必须是被说明为FILE类型的指针变量。 ·“文件名”是被打开文件文件名,是字符串常量或字符串数组。 ·“使用文件方式”是指文件的类型和操作要求。 如: FILE *fp; fp=fopen("file1.txt","r"); 其意义是在当前目录下打开文件file1.txt,只允许读操作,并使fp指向该文件。 又如: FILE *fp; fp=fopen("c:\\file2.txt","rb"); 意义是打开C驱动器磁盘根目录下的文件file2.txt,对其按二进制方式进行读操作。两个反斜线\\中的第一个表示转义字符,第二个表示根目录。 文件打开方式 r 只读打开一个文本文件,只允许读数据 w 只写打开或建立一个文本文件,只允许写数据 a 追加打开一个文本文件,并在文件末尾写数据 r+ 读写打开一个文本文件,允许读和写 w+ 读写打开或建立一个文本文件,允许读和写 a+ 读写打开一个文本文件,允许读和在文件末尾写数据 rb 只读打开一个二进制文件,只允许读数据 wb 只写打开或建立一个二进制文件,只允许写数据 ab 追加打开一个二进制文件,并在文件末尾写数据 rb+ 读写打开一个二进制文件,允许读和写 wb+ 读写打开或建立一个二进制文件,允许读和写 ab+ 读写打开一个二进制文件,允许读和在文件末尾写数据 (1)文件使用方式由r、w、a、b、+拼成,含义分别为: r(read) 读 w(write) 写 a(append) 追加 b(binary)二进制文件 + 读和写 (2)用r方式打开文件文件必须存在,只能从该文件读出。 (3)用w方式打开只能向文件写入。若打开的文件不存在,则以指定的文件名建立新文件。若存在,则将存在的文件删除,重建新文件。 (4)向一个已存在的文件追加新的信息,只能用a方式打开。文件必须存在,否则会出错。 (5)打开文件出错时fopen将返回一个空指针值NULL。程序中可用这一信息判断是否完成打开文件的工作,并做相应的处理。因此常用以下程序段打开文件: if((fp=fopen("c:\\file2.txt","rb"))==NULL) { printf("\nerror on open c:\\file2.txt!"); exit(0); } (6)把文本文件读入内存时,要将ASCII码转换成二进制码。把内存数据以文本方式写入磁盘时,要将二进制码转换成ASCII码。因此文本文件的读写花费较多的转换时间,对二进制文件的读写不存在这些转换。 (7)标准输入文件(键盘)、标准输出文件(显示器)、标准出错输出(出错信息)是由系统打开的,可直接使用。 2.关闭文件(fclose函数) 文件使用完毕,应用关闭文件函数把文件关闭,从而把缓冲区的数据写入文件中。否则程序结束时可能造成数据丢失。 fclose函数使用形式: fclose(文件指针); 如:fclose(fp); 正常完成关闭文件操作时,fclose函数返回值0。发生错误时返回EOF。 13.3 文件读写 对文件的读和写是最常用的文件操作,在C语言标准库中提供了多种文件读写的函数。 字符读写函数:fgetc和fputc 字符串读写函数:fgets和fputs 数据块读写函数:fread和fwrite 格式化读写函数:fscanf和fprintf 13.3.1 字符读写函数 1.读字符函数fgetc 规格:int fgetc(FILE * stream); 功能:从指定的文件中读一个字符。 参数:stream为指向文件的指针。 返回值:从stream所指的文件流中读取一个字符,转换为int类型返回。若已到文件尾返回EOF,文件状态改为结束状态。若读错误返回EOF,文件改为错误状态。EOF在stdio.h中定义为-1。 例如: ch=fgetc(fp); 其含义是从打开的文件fp中读取一个字符并送入ch中。 对于fgetc函数的使用有几点说明: (1)在fgetc函数调用中,读取的文件必须是以读或读写方式打开的。 (2)文件内部有一个位置指针,用来指向文件的当前读写字节,文件打开时,位置指针总指向文件的第一个字节。使用fgetc函数后位置指针向后移动一个字节。因此可连续多次使用fgetc函数读取多个字符。文件指针是指向整个文件的,要在程序中定义说明,只要不重新赋值文件指针值不变。文件内部的位置指针用于指示文件内部的当前读写位置,每读写一次,位置指针向后移动,它无需在程序中定义说明,由系统自动设置。 例:读取文本文件file.txt,把其中所有非空格字符输出在标准输出设备上。 #include<stdio.h> #include<conio.h> #include<stdlib.h> int main() { FILE *fp; char ch; if((fp=fopen("file.txt","r"))==NULL) { printf("\nCan't open file,strike any key exit!"); getch(); /*等待敲键盘,显示Can't open file,strike any key exit!*/ exit(1); /*结束程序*/ } ch=fgetc(fp); while(ch!=EOF) /*文件结束时读取得到EOF*/ { if(ch!=' ') putchar(ch); ch=fgetc(fp); } fclose(fp); return 0; }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值