Java输入输出流

输入输出流
简介:
输入输出:

输入/输出(Input/Output)是指对某个设备或环境进行数据的输入或输出.任何语言都有输入输出的功能,在Java程序中,是通过流来完成输入和输出的,它通过Java输入输出系统连接到物理设备,虽然输入输出流所连接的实际物理设备并不一样,但却可以以同一种方式工作.例如对硬盘的输入输出,对网络主机进行输入输出,因此设备或者环境的不同会有各式各样的输入输出的问题与解决方案.

流:

流是指在计算机的输入与输出之间运动的数据序列.流序列中的数据既可以是未经加工的原始的二进制数据,也可以是经一定编码处理后符合某种格式规定的特定数据.习惯上称代码相关的部分为内部,称与代码无关的部分为外部.

从数据的传输方式划分,流可分为输入流和输出流;从流的内容上划分,流可分为字节流和字符流.

分类
按照处理单位:
  • 字符流:操作数据单元是字符 Reader Writer 是抽象操作基类
  • 字节流:操作数据单元是字符 InputStream OutputStream 是抽象操作基类
按照流的作用:
  • 节点流:程序直接与数据源连接,和实际的输入/输出节点连接;

  • 处理流:对节点流进行包装,扩展原来的功能,由处理流执行IO操作。

  • 处理流的分类和作用:

    • 作用:处理流可以隐藏底层设备上节点流的差异,无需关心数据源的来源,程序只需要通过处理流执行IO操作。处理流以节点流作为构造参数。通常情况下,推荐使用处理流来完成IO操作

    • 分类:

      • 缓冲流:提供一个缓冲区,能够提高输入/输出的执行效率,减少同节点的频繁操作。

        • BufferedInputStream/BufferedOutputStream、BufferedReader/BufferWriter
          
      • 转换流:将字节流转成字符流。字节流使用范围广,但字符流更方便。例如一个字节流的数据源是纯文本,转成字符流来处理会更好

        • InputStreamReader/OutputStreamWriter
          
      • 打印输出流:打印输出指定内容,根据构造参数中的节点流来决定输出到何处。

        • PrintStream :打印输出字节数据。PrintWriter : 打印输出文本数据。
          
I/O 流中的三类数据源:
磁盘文件:

FileInputStream、FileOutputSteam、FileReader、FileWriter

内存:

ByteArrayInputStream ByteArrayOutputStream(ps:字节数组都是在内存中产生)

网络:

SocketInputStream、SocketOutputStream(ps:网络通信时传输数据)

图解

在这里插入图片描述

File类操作文件或者目录的属性
属性

列出的是常用的,fs 是指当前系统下。

    • 属性作用理解
      static charpathSeparatorChar 系统依赖路径分隔符字符。
      static Stringseparator 系统依赖的默认名称分隔符字符,表示为方便的字符串。File.Separator: UNIX系统上,这个字段的值是 '/';微软Windows系统是 '\\'
      static charseparatorChar 系统依赖的默认名称分隔符字符。
      static StringpathSeparator 系统依赖路径分隔符的字符,表示为方便的字符串。路径分隔符,win下面分号,Linux上冒号
构造:
  • File(String pathname);根据路径名创建
  • File(URL url);根据一个URL创建
  • File(File parent, String child);在给定的File对象下创建
  • File(String parent, String child);根据指定路径去创建
常用方法
    • 返回类型方法
      booleancanExecute() 测试应用程序是否可执行文件的路径名表示的抽象。
      booleancanRead() 检查应用程序是否可以读取文件的抽象路径名记。
      booleancanWrite() 检查应用程序是否可以修改文件的抽象路径名记。
      intcompareTo(File pathname) 比较两个抽象路径名的字典。
      booleancreateNewFile() 自动创建一个新的空文件命名的抽象路径名的当且仅当该文件不存在。
      static FilecreateTempFile(String prefix, String suffix) 在默认的临时文件目录中创建一个空文件,使用给定的前缀和后缀来生成它的名称。
      static FilecreateTempFile(String prefix, String suffix, File directory) 在指定的目录中创建一个新的空文件,使用给定的前缀和后缀字符串来生成它的名称。
      booleandelete() 删除文件或目录的路径名表示的抽象。
      voiddeleteOnExit() 请求的文件或者目录的抽象路径名记被删除时,虚拟机终止。
      booleanequals(Object obj) 测试这个抽象路径名与给定对象的平等。
      booleanexists() 检查文件或目录是否存在这种抽象路径名记。
      FilegetAbsoluteFile() 返回此抽象路径名的绝对形式。
      StringgetAbsolutePath() 返回此抽象路径名的绝对路径名的字符串。
      FilegetCanonicalFile() 返回此抽象路径名的规范形式。
      StringgetCanonicalPath() 返回此抽象路径名的规范文件。
      longgetFreeSpace() 通过这种抽象路径名返回分区中的 named未分配的字节数。
      StringgetName() 返回的名称的文件或目录的路径名表示的抽象。
      StringgetParent() 返回此抽象路径名的父路径名的字符串,或 null如果路径名不叫父目录。
      FilegetParentFile() 返回此抽象路径名的母抽象路径名,路径名或 null如果这不叫父目录。
      StringgetPath() 转换这个抽象路径名为路径名的字符串。
      longgetTotalSpace() 通过这种抽象路径名返回分区 named大小。
      longgetUsableSpace() 通过这种抽象路径名 named返回分区上的可用虚拟机的字节数。
      inthashCode() 计算哈希代码的抽象路径名。
      booleanisAbsolute() 测试是否这个抽象路径名是绝对的。
      booleanisDirectory() 测试文件是否通过这种抽象路径名表示是一个目录。
      booleanisFile() 测试文件是否通过这种抽象路径名表示的是一种正常的文件。
      booleanisHidden() 测试文件是否通过这种抽象路径名的命名是隐藏文件。
      longlastModified() 返回文件的抽象路径名表示上次修改时间。
      longlength() 返回文件的抽象路径名表示的长度。
      String[]list() 返回的字符串在该目录下的抽象路径名的文件和目录命名为数组。
      String[]list(FilenameFilter filter) 返回的字符串在该目录下的抽象路径名,满足指定的过滤器表示文件和目录命名数组。
      File[]listFiles() 返回表示抽象路径名的目录中的文件的路径名表示抽象的数组。
      File[]listFiles(FileFilter filter) 返回表示的抽象路径名的文件和目录的目录,这个抽象路径名满足指定过滤器表示数组。
      File[]listFiles(FilenameFilter filter) 返回表示的抽象路径名的文件和目录的目录,这个抽象路径名满足指定过滤器表示数组。
      static File[]listRoots() 列出可用的文件系统根。
      booleanmkdir() 创建该目录下的抽象路径名命名。
      booleanmkdirs() 创建该目录下的抽象路径名命名,包括任何必要的但不存在父目录。
      booleanrenameTo(File dest) 重命名文件的抽象路径名记。
      booleansetExecutable(boolean executable) 一套业主的这种抽象路径名执行权限的便利方法。
      booleansetExecutable(boolean executable, boolean ownerOnly) 集所有者或大家的这种抽象路径名的执行权限。
      booleansetLastModified(long time) 设置文件或目录的抽象路径名命名的最后修改时间。
      booleansetReadable(boolean readable) 一个为这个抽象路径名集所有者的读权限的便利方法。
      booleansetReadable(boolean readable, boolean ownerOnly) 集所有者或大家的这种抽象路径名的读取权限。
      booleansetReadOnly() 标记文件或通过这种抽象路径名命名的目录,只有读操作是允许的。
      booleansetWritable(boolean writable) 一个方便的方法来设置业主写出这一抽象路径名的权限。
      booleansetWritable(boolean writable, boolean ownerOnly) 集的所有者或大家写出这一抽象路径名的权限。
      PathtoPath() 返回一个 java.nio.file.Path对象由抽象路径。
      StringtoString() 返回此抽象路径名的文件。
      URItoURI() 构建了一个 file: URI表示此抽象路径名。
      URLtoURL() 过时的。 这种方法不会自动地逃避在网址中是非法的字符。建议新的代码转换成一个抽象路径名的URL首先将其转换成一个URI,通过toURI方法,然后转换成一个URL URI通过URI.toURL方法。
常用举例
package com.bigdata.practice1007;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;

public class FileTest {

	public static void main(String[] args) throws IOException {
		// 文件的创建 删除 获取描述符
		String path = "D:"+File.separator+"kaifamiao"+File.separator+"java se"+File.separator+"io";
		createFolder(path);
		createFile(path,fileName);
		listFile("C:/");
		listDisk();
		fileInfo(path, fileName);
		deleteFile(path + File.separator + fileName);
	}

	/**
	 * 显示文件信息
	 * length():方法用于获取文件大小
	 * lastModified():方法用于获取文件最后操作时间 返回字符串
	 */
	public static void fileInfo(String path, String fileName){
		File file = new File(path, fileName);
		System.out.println("文件大小:" + file.length() + "byte");
		System.out.println("文件最后修改日期::" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:sss").format(file.lastModified()));
	}

	/**
	 * 删除文件
	 * file.delete():删除文件
	 * file.exists():判断文件是否存在
	 * file.isFile():判断file是否指向文件
	 * file.canExecute():判断文件是否可以删除权限
	 */
	public static void deleteFile(String fileFullName){
		File file = new File(fileFullName);
		if (!file.exists()){
			System.out.println("文件不存在!");
			return;
		}
		if (!file.isFile()){
			System.out.println(fileFullName + "不是文件,停止删除!");
			return;
		}
		if (file.canExecute()) {
			file.delete();
		}else {
			System.out.println("没有删除权限!");
		}
	}

	/**
	 * 创建目录
	 * file.mkdirs():用于创建多级目录
	 * file.mkdir():用于创建单机目录
	 */
	public static void createFolder(String path){
		File file = new File(path);
		if (!file.exists()){
			file.mkdirs();
		}
	}

	/**
	 * 创建文件
	 * file.createNewFile():仅用于创建文件
	 */
	public static void createFile(String path, String fileName) throws IOException{
		File file = new File(path, fileName);
		if (!file.exists()){
			file.createNewFile();
		}
	}

	/**
	 * 显示指定目录下的子目录和文件
	 * file.listFiles():用于获取指定目录中的子目录和文件 不会递归
	 * files[i].isDirectory():判断是否指向目录
	 * files[i].getAbsolutePath():取回绝对路径
	 * files[i].getName():获得文件名称
	 */
	public static void listFile(String diskName){
		File file = new File(diskName);
		File[] files = file.listFiles();
		if (files != null && files.length > 0){
			for (int i = 0; i < files.length; i++) {
				if (files[i].isDirectory()){
					System.out.println("目录名:" + files[i].getAbsolutePath());
				}
				if (files[i].isFile()){
					System.out.println("文件名:" + files[i].getName());
				}
			}
		}
	}

	/**
	 * 显示系统盘和磁盘空间
	 * File.listRoots():静态方法获得所有盘符
	 * disks[i].getTotalSpace():磁盘总大小
	 * disks[i].getFreeSpace():磁盘剩余空间
	 */
	public static void listDisk(){
		File[] disks = File.listRoots();
		if (disks != null && disks.length > 0){
			for (int i = 0; i < disks.length; i++) {
				System.out.println("磁盘:" + disks[i]);
				System.out.println("磁盘大小:" + disks[i].getTotalSpace() / 1000 / 1000 /1000 + "G");
				System.out.println("磁盘剩余空间:" + disks[i].getFreeSpace() / 1000 / 1000 /1000 + "G");
			}
		}
	}
}
字节流读写任何文件
字节流BufferedOutputStream和FileOutputStream读写文件
字节流BufferedInputStream和FileInputStream读文件
package com.bigdata.practice1007;

import java.io.*;

public class IOTest {
	public static void main(String[] args) {
		try {
			byteOutput();
			byteInput();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * OutputStream 字节输出流的子类 文件输出流 FileOutputStream 作用是把内存中的数据输出到文件中
	 * BufferedOutputStream 这两个能够增加上述字节输入输出操作的效率
	 * 1.导入相关类
	 * 2.创建文件输出流对象 创建缓存输出流对象 并包装文件输出流对象
	 * 3.把要输入的字符串对象转为字节数组【str.getBytes()】
	 * 4.用write方法把字节数组中的数据写入到文件
	 * 5.关闭两个流
	 */
	public static void byteOutput() throws  Exception{
		File file = new File("D:"+File.separator+"kaifamiao"+File.separator+"java se"+File.separator+"io"+File.separator+"bbb.txt");
		FileOutputStream fos = null;
		BufferedOutputStream bos = null;
		try {
			fos = new FileOutputStream(file);
			bos = new BufferedOutputStream(fos);
			String str = "ABC 你是";
			byte[] bytes = str.getBytes();
			bos.write(bytes, 0, bytes.length);
			System.out.println("写入完毕!");
		} catch(IOException e){
			System.out.println("创建文件出错!");
		}
		finally {
			bos.close();
			fos.close();
		}
	}

	/**
	 * InputStream 字节输入流的子类 文件输入流 FileInputStream 作用是将文件中的数据读入到java程序中
	 * BufferedInputStream提高速度
	 * 1.导包
	 * 2.创建文件字节输入流和对应的缓存字节输入流
	 * 3.给定读取字节数组【fis.available()】和字符串变量[用于输出]
	 * 4.while循环读取字节数组的数据
	 * 5,打印:将字节数组转为String
	 * 6.关闭两个流
	 */
	public static void byteInput() throws Exception{
		FileInputStream fis = null;
		BufferedInputStream bis = null;
		try{
			fis = new FileInputStream("D:"+File.separator+"kaifamiao"+File.separator+"java se"+File.separator+"io"+File.separator+"bbb.txt");
			bis = new BufferedInputStream(fis);
			System.out.println("可以读取的字节数:" + fis.available());
			System.out.println("文件内容:");
			String str = "";
			byte[] bytes = new byte[fis.available()];
			while(bis.read(bytes) != -1){
				str = new String(bytes);
			}
			System.out.println(str);
		}catch(Exception e){
			System.out.println("读取文件时出错!");
		}finally{
			bis.close();
			fis.close();
		}
	}
}
字符流读写文本文件
package com.bigdata.practice1007;

import java.io.*;

public class IOTest1 {
    /**
     * 使用字符流读写文本文件
     */
    public static void main(String[] args) {
        try {
            charWrite();
            charReader();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 字符流写入到文本文件
     * BufferedWriter和FileWriter都是Writer的子类
     * bw.write("AAA");:写入字符文本到缓存区
     * bw.newLine();:换行
     * bw.flush();:刷新缓存区 并将数据写入到文本文件中
     */
    public static void charWrite() throws IOException{
        File file = new File("D:"+File.separator+"kaifamiao"+File.separator+"java se"+File.separator+"io"+File.separator+"ccc.txt");
        FileWriter fw = null;
        BufferedWriter bw = null;
        try {
            fw = new FileWriter(file);
            bw = new BufferedWriter(fw);
            bw.write("字符流写入到文本文件");
            bw.newLine();
            bw.write("AAA");
            bw.flush();
            System.out.println("写入完毕!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            bw.close();
            fw.close();
        }
    }

    /**
     * 字符流读文本文件
     * FileReader和BufferedReader是Reader的子类
     *
     */
    public static void charReader() throws Exception{
        FileReader fr = null;
        BufferedReader br = null;
        try{
            fr = new FileReader("D:"+File.separator+"kaifamiao"+File.separator+"java se"+File.separator+"io"+File.separator+"ccc.txt");
            br = new BufferedReader(fr);
            String str = "";
            while((str = br.readLine()) != null){
                System.out.println(str);
            }
        }catch (Exception e) {
            System.out.println("读文件出错!");
        } finally {
            br.close();
            fr.close();
        }
    }
}
字符流方式读写字节流
简介:

InputStreamReader OutputStreamWriter :字节输入输出流,可以指定编码方式将字节流转换为字符流,并进行读写操作

情况:
  • 不使用默认的字符编码格式,需要指定编码格式;
  • 第三方提供了基于字节的流,想包装为基于字符的流
示例:
  • 在使用FileOutputStream和FileWrite输出数据时 默认使用 ASAN 编码格式
  • 如果在输出时要指定编码方式 需要使用OutputStreamWriter
package com.bigdata.practice1007;

import java.io.*;

public class IOTest2 {
    /**
     * 使用字符流方式读写字节流
     */
    public static void main(String[] args) {
       outputStreamWriter();
       inputStreamReader();
    }
    /**
     * 以字符流方式读写字节流
     * InputStreamReader OutputStreamWriter :字节输入输出流,可以指定编码方式将字节流转换为字符流,并进行读写操作
     * 使用情况:不使用默认的字符编码格式,需要指定编码格式;第三方提供了基于字节的流,想包装为基于字符的流
     *
     * 在使用FileOutputStream和FileWrite输出数据时 默认使用ASAN  如果在输出时要指定编码方式 需要使用OutputStreamWriter
     */

    public static void outputStreamWriter(){
        try{
            File file = new File("D:"+File.separator+"kaifamiao"+File.separator+"java se"+File.separator+"io"+File.separator+"ddd.txt");
            FileOutputStream fos = new FileOutputStream(file, true);
            OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8");
            BufferedWriter bw = new BufferedWriter(osw);
            if (!file.exists()){
                file.createNewFile();
            }
            bw.write("我不是ANSI编码格式的!");
            bw.newLine();
            bw.write("而是UTF-8编码的!");
            bw.flush();
            System.out.println("写入完毕!");
            bw.close();
            osw.close();
            fos.close();
        } catch (FileNotFoundException e) {
            System.out.println("文件未找到");
        }catch (IOException e1) {
            System.out.println("写入失败!");
        }
    }

    public static void inputStreamReader(){
        try{
            File file = new File("D:"+File.separator+"kaifamiao"+File.separator+"java se"+File.separator+"io"+File.separator+"ddd.txt");
            FileInputStream fis = new FileInputStream(file);
            InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
            BufferedReader br = new BufferedReader(isr);
            String app;
            while((app = br.readLine()) != null){
                System.out.println(app);
            }
        } catch (FileNotFoundException e) {
            System.out.println("文件未找到!");
        }  catch (IOException e) {
            System.out.println("读取失败!");
        }
    }
}
读写二进制文件
复制文件
  • 【一般不能用记事本打开的文件都可以操作】
package com.bigdata.practice1007;

import java.io.*;

public class CopyFile {
    /**
     * 二进制文件的读写
     * 使用字节流读写二进制文件的:常用类是 DataInputStream 、 DataOutputStream
     */
    private  String sourcePath;
    private  String distPath;

    public CopyFile(){

    }

    public CopyFile(String sourcePath, String distPath){
        this.sourcePath = sourcePath;
        this.distPath = distPath;
    }

    /**
     * 是否要删除源文件
     * @param sourcePath
     * @param distPath
     * @param flag
     */
    private static void deletSourceFile(String sourcePath, String distPath, boolean flag) {
        File file1 = new File(sourcePath);
        File file2 = new File(distPath);
        if (flag == true && file2.exists() && file2.length() == file1.length()){
            file1.delete();
        }
    }

    /**
     * 复制二进制文件【记事本不能打开的文件】
     * @param sourcePath  原文件路径
     * @param distPath  复制文件目标路径
     * 1.建立输入流
     * 2.建立输出流【记得处理异常:抛出 调用处理;内部处理】
     * 3.读写操作
     * 4.关闭流
     */
    private static boolean copyFile(String sourcePath, String distPath) {

        if (sourcePath != null && distPath != null) {
            File file1 = new File(sourcePath);
            File file2 = new File(distPath);
            FileInputStream fis = null;
            FileOutputStream fos = null;
            try {
                fis = new FileInputStream(file1);
                BufferedInputStream bis = new BufferedInputStream(fis);
                DataInputStream dis = new DataInputStream(bis);

                fos = new FileOutputStream(file2);
                BufferedOutputStream bos  = new BufferedOutputStream(fos);
                DataOutputStream dos = new DataOutputStream(bos);
                int num;
                while ((num = dis.read()) != -1) {
                    dos.write(num);
                }
                dos.flush();
                dos.close();
                bos.close();
                fos.close();
                dis.close();
                bis.close();
                fis.close();
            }
            catch(IOException e){
                System.out.println("复制出错!");
                e.printStackTrace();
            }
            System.out.println("复制成功!");
            return true;
        } else {
            System.out.println("传入的文件名不合适!");
            return false;
        }
    }

    /**
     * 测试
     */
//    public static void main(String[] args) {
//        String sourcePath = "D:"+File.separator+"kaifamiao"+File.separator+"阿里巴巴Java开发手册v1.2.0.pdf";
//        String distPath = "D:"+File.separator+"kaifamiao"+File.separator+"java se"+File.separator+"阿里巴巴Java开发手册v1.2.0.pdf";
//        boolean flag = copyFile(sourcePath, distPath);
//        deletSourceFile(sourcePath, distPath, flag);
//    }
}
网页源码读取到本地文件
package com.bigdata.practice1007;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class NetDataTest {
	/**
	 * 从网络上取源码并保存到文件中
	 * 1.网址
	 * 2.建立网络连接
	 * 3.建立输入输出流
	 * 4.读数据
	 * 5.输出到控制台和保存到文件
	 * 6.关闭输入输出流
	 */
	public static void main(String[] args) {
		// 1.网址
		String str = "https://mirrors.tuna.tsinghua.edu.cn/";
		
		try {
			URL url = new URL(str);
			
			// 2.建立网络连接
			HttpURLConnection httpConn = (HttpURLConnection)url.openConnection();
			
			// 3.建立输入输出流
			InputStream is = httpConn.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(is,"UTF-8"));
			
			File file = new File("D:"+File.separator+"kaifamiao"+File.separator+"java se"+File.separator+"mirrors.html");
			if (!file.exists()) {
				file.createNewFile();
			}
			FileWriter fw = new FileWriter(file, true);
			BufferedWriter bw = new BufferedWriter(fw);
			
			// 4.读取数据
			String data;	// 存读到缓存区的每一行数据
			StringBuilder sb = new StringBuilder(); // 追加存所有数据输出到控制台
			while ((data = br.readLine()) != null) {
				sb.append(data + "/n");
				bw.write(data);
				bw.newLine();
			}
			
			// 5.输出
			System.out.println(sb);
			bw.flush(); // 清空缓存区 并将数据写入到文件中
			
			// 6.关闭
			br.close();
			is.close();
			bw.close();
			fw.close();
			
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值