java基础之io类的使用

之前一直都没有怎么仔细学习过Java的io操作,都是半推半就的使用着,最近想学习一下网络编程,发现里面对于io的操作还是涉及较多的,于是乎学习了一下Java的io类。这篇文章简单介绍一下Java的io类。

1、什么是io? 什么是流?
io: 是input/output的缩写,意思是输入与输出。
流:流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。(来源于百度百科)

流的分类:

  1. 对于传输方向,分为输入流与输出流
  2. 对于传输的数据的单位,分为字节流与字符流(所有文件都可以以字节流的方式读取,至于打印输出能否得到想要的结果就不一定了)

对于一个流是输入流还是输出流,需要站在内存的角度来看待。
1、 input(输入流):从硬盘中读取文件将数据加载到内存中。
2、output(输出流):从内存中将数据写入到硬盘形成文件。

java.io包下有两个关于表示字节流的所有类的超类:
InputStream OutputStream,与字节流相关操作的类都是基于这两个超类。

先介绍关于文件操作的字节流类:
FileInputStream FileOutputStream,在 JDK API 1.6中文版帮助手册(文章结尾给出链接地址下载) 可以查找到信息如图:
在这里插入图片描述
红色区域是我们主要使用的方法,

FileInputStream(String name) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定,简单来说参数就是传入一个文件的绝对路径

int read() 从此输入流中读取一个数据字节。
int read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。

不带参数的read方法,一次只读取文件的一个字节,
传入一个byte[] b数组的read方法,一次读取b.length个字节,并将数据存储到b数组

注意:
当一个文件被读取到最后时,返回的就是-1,而不是文件内容

FileInputStreamDemo.java

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

public class FileInputStreamDemo {//文件输入流demo

    public static void main(String[] args) throws IOException {
    	//前提你的d盘下有一个a.txt文件
        FileInputStream fis = new FileInputStream("d:\\a.txt");
        
        //1.读取单个字节
        /*System.out.println("一次一个字节读取");
        int data = 0;
        while((data = fis.read) !=-1){
        	System.out.println((char) data);
        }
        fis.close();//使用完记住释放资源*/
        
        //2. 用一个byte[] 数组作为缓冲区
        byte[] bytes = new byte[1024];//大小可自行设置,此处设置为1KB
        int count = 0;//字节流读取到的数据个数
        while((count = fis.read(bytes)) != -1){
        	System.out.print(new String(bytes,0,count));
        }
        fis.close();
    }
}

在这里插入图片描述

FileOutputStreamDemo.java

import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamDemo {//文件输出流demo

   public static void main(String[] args) throws IOException {
       //后面的boolean设置写入文件是否为追加,true表示为追加
       //FileOutputStream fos = new FileOutputStream("d:\\b.txt",true);
       FileOutputStream fos = new FileOutputStream("d:\\b.txt");
       /*fos.write(97);//一次写入一个字节
       fos.write('b');
       fos.write('c');*/
       fos.write("你好世界!".getBytes());
       fos.close();
   }
}

基本上的操作就是这样,下面来一个小demo,复制文件:
读取文件,再写入文件

CopyFileDemo.java

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

public class CopyFileDemo {//文件字节流实现文件流复制demo

    public static void main(String[] args) throws IOException{
        FileInputStream fis = new FileInputStream("d:\\01.png");
        FileOutputStream fos = new FileOutputStream("d:\\01copy.png");
        byte[] bytes = new byte[1024];//一次读1KB
        int count = 0;
        int i = 0;
        while ((count = fis.read(bytes)) != -1){
            i++;
            fos.write(bytes,0,count);
        }
        fis.close();
        fos.close();
        System.out.println("一共读取"+i+"次");
    }
}

以上就是字节流类的基本操作,熟悉了这些操作,其他类只是对这些类进一步的封装完善。

例如:BufferedInputStream BufferedOutputStream这个类在内部有一个byte[]数组作为数据缓冲区,大小为8KB,直接将文件读取到这个数组,减少内存与硬盘的交互从而提高效率,也可以自定义缓冲区的大小。

字节流与字符流的区别就在于,英文字母阿拉伯数字等都是由一个字节存储在文件中,而汉字一般都大于一个字节,如果用字节流的方式读取汉字会出现乱码。文件的本质其实都是以0或者1存储,只不过因为表示不同所以显示的意义不同。字符流更适合于文本文件的操作。

以上就是对于Java的io操作的简单介绍,文末附上JDK API 1.6帮助手册链接:https://gitee.com/six_teen/necessary_utils/blob/master/JDK_API_1_6_zh_CN.CHM

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值