FileInputStream、FileReader、FileInputStream、FileWriter使用小结

本文是基于Linux环境运行,读者阅读前需要具备一定Linux知识

InputStream包含如下三个方法:

  • int read():从输入流中读取单个字节,返回所读取的字节数据(字节数据可直接转化为int类型)
  • int read(byte[] b):从输入流中最多读取b.length个字节的数据,并将其存储在字节数组b中,返回实际读取的字节数
  • int read(byte[] b, int off, int len):从输入流中最多读取len个字节的数据,并将其存储在数组b中;放入数组b中时,并不是从数组起点开始,而是从off位置开始,返回实际读取的字节数

FileInputStream继承InputStream,使用FileInputStream读取文件内容

代码1-1

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

public class FileInputStreamTest {

	public static void main(String[] args) {
		if (args == null || args.length == 0) {
			throw new RuntimeException("请输入路径");
		}
		FileInputStream fis = null;
		try {
			byte[] bbuf = new byte[1024];
			int hasRead = 0;
			fis = new FileInputStream(args[0]);
			while ((hasRead = fis.read(bbuf)) > 0) {
				System.out.print(new String(bbuf, 0, hasRead));
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if (fis != null) {
					fis.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

}

代码1-1运行结果:

[email protected]:/home/software/.io# cat text
Hello Spring
Hello Hibernate
Hello MyBatis
[email protected]:/home/software/.io# java FileInputStreamTest text
Hello Spring
Hello Hibernate
Hello MyBatis

Reader包含如下三个方法:

  • int read():从输入流中读取单个字符,返回从读取的字符数据(字符数据可直接转化为int类型)
  • int read(char cbuf[]):从输入流中最多读取cbuf.length个字符的数据,并将其存储在字符数组的cbuf中,返回实际读取的字符数
  • int read(char cbuf[], int off, int len):从输入流中最多读取len个字符的数据,并将其存储在数组b中;放入数组cbuf中时,并不是从数组起点开始,而是从off位置开始,返回实际读取的字节数

FileReader的父类继承自Reader,使用FileReader读取文件

代码1-2

import java.io.FileReader;
import java.io.IOException;

public class FileReaderTest {

	public static void main(String[] args) {
		if (args == null || args.length == 0) {
			throw new RuntimeException("请输入路径");
		}
		FileReader fr = null;
		try {
			fr = new FileReader(args[0]);
			char[] cbuf = new char[32];
			int hasRead = 0;
			while ((hasRead = fr.read(cbuf)) > 0) {
				System.out.print(new String(cbuf, 0, hasRead));
			}
		} catch (IOException e) {
			// TODO: handle exception
			e.printStackTrace();
		} finally {
			try {
				if (fr != null) {
					fr.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}
}

代码1-2运行结果:

[email protected]:/home/software/.io# cat text
Java编程思想
算法
编译原理
[email protected]:/home/software/.io# java FileReaderTest text
Java编程思想
算法
编译原理

代码1-3

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

public class FileOutputStreamTest {

	public static void main(String[] args) {
		if (args == null || args.length < 2) {
			throw new RuntimeException("请输入两个路径");
		}
		FileInputStream fis = null;
		FileOutputStream fos = null;
		try {
			fis = new FileInputStream(args[0]);
			fos = new FileOutputStream(args[1]);
			byte[] bbuf = new byte[32];
			int hasRead = 0;
			while ((hasRead = fis.read(bbuf)) > 0) {
				fos.write(bbuf, 0, hasRead);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if (fis != null) {
					fis.close();
				}
				if (fos != null) {
					fos.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

OutputStream和Writer:

  • void write(int b):将指定的字节/字符输出到输出流中,其中c代表字节,也可以代表字符
  • void write(byte b[]/char cbuf[]):将字节数组/字符数组中的数据输出到指定输出流中
  • void write(byte b[]/char cbuf[], int off, int len):将字节数组/字符数组中从off位置开始,长度为len的字节/字符输出到输出流中

Writer里还包含如下两个方法:

  • void write(String str):将str字符串里包含的字符输出到指定输出流中
  • void write(String str, int off, int len):将str字符串里从off位置开始,长度为len的字符输出到指定的输出流中

使用FileInputStream来执行输入,FileOutputStream来执行输出

代码1-3运行结果:

[email protected]:/home/software/.io# cat input
Java编程思想
算法
编译原理
[email protected]:/home/software/.io# cat output
[email protected]:/home/software/.io# java FileOutputStreamTest input output
[email protected]:/home/software/.io# cat output
Java编程思想
算法
编译原理

使用FileWriter来执行输出

代码1-4

import java.io.FileWriter;
import java.io.IOException;

public class FileWriterTest {

	public static void main(String[] args) {
		if (args == null || args.length == 0) {
			throw new RuntimeException("请输入路径");
		}
		FileWriter fw = null;
		try {
			fw = new FileWriter(args[0]);
			fw.write("数据结构与算法\n");
			fw.write("Python基础教程\n");
			fw.write("C和指针\n");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if (fw != null) {
					fw.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

代码1-4运行结果:

[email protected]:/home/software/.io# cat book
[email protected]:/home/software/.io# java FileWriterTest book
[email protected]:/home/software/.io# cat book
数据结构与算法
Python基础教程
C和指针

Java7之后,很多IO资源类都实现了AutoCloseable接口,只要在try语句中声明的IO流都可以自动关闭,但有一些IO流像FileWriter这样的输出流,如果IO流不显示的关闭,输出流缓冲区的数据无法flush到实际的物理节点,因为执行IO流的close()方法前,会先执行flush()方法

时间: 2024-10-06 20:56:17

FileInputStream、FileReader、FileInputStream、FileWriter使用小结的相关文章

理解IO流:InputStream和OutputStream,FileInputStream和FileOutputStream,Reader和Writer,FileReader和FileWriter,BufferedInputStream 和 BufferedOutputStream, BufferedReader 和 BufferedWriter,转换流

/* * 1.理解 "流" ? * 动态性.连续性.方向性. * * 2.在java语言中,将数据的输入/输出称之为 IO流. IO流的分类: * 1) 从方向分: 输入流 , 输出流. (参照计算机的内存) * 将数据送到内存中去称之为输入流.反之,称之为输出流. * * 2) 从处理单位来分: 字节流(8位二进制数据), 字符流(16位二进制数据). * * 3) 从是否有数据源来分: 节点流(有数据源), 处理流(必须套在节点流上). * * 3.在Java语言中,所有流类均来自

Java 之 FileReader FileInputStream InputStreamReader BufferedReader 作用与区别

一直搞不清楚FileReader FileInputStream InputStreamReader BufferedReader 之间的区别联系,每次写读取文档的java程序都是网上百度.今天专门就这个问题进行了深入探讨. 一.来源 java.io下有两个抽象类InputStream和Reader,上述类都是继承了这两个超类.它们之间区别是:InputStream是字节流的输入,Reader是字符流输入. 二.具体每类 InputStream    | __FileInputStream Fi

J04-Java IO流总结二《 FileReader和FileWriter 》

FileReader和FileWriter的源码非常简单,下面通过分析它们的源码以更好地进行理解这两个流 1. FileReader FileReader实现了读取底层的字节数据并将其转换为字符数据的功能,转换时依赖的字符集为平台默认的字符集GBK(Windows平台). FileReader源码如下: public class FileReader extends InputStreamReader { public FileReader(String fileName) throws Fil

java - I/O - FileReader, FileWriter

字节流: FileInputStream FileOutputStream 字节流每次读取一个字节,好处是什么类型文件都可以读取,坏处是处理纯文本时可能出现问题(中文每个字占2个字节,可能导致读取错误出现乱码). 字符流: FileReader, FileWriter 只能操作纯文本文件(右键记事本可以打开而且不影响内容),txt,html等. 字节流用byte接收数据,byte是8位 字符流用char接受数据,char是16位 汉字占用两个字节,也就是16位 所以字节流有可能乱码,而字符流不会

JAVA学习--文件流FileReader和FileWriter应用

* 使用FileReader.FileWriter 可以实现文本文件的复制. * 对于非文本文件(视频文件.音频文件.图片),只能使用字节流! 1 @Test 2 public void testFileReader(){ 3 FileReader fr = null; 4 try { 5 File file = new File("dbcp.txt"); 6 fr = new FileReader(file); 7 char[] c = new char[24]; 8 int len

JAVA之IO技术用字节流对文本文件进行读写FileInputStream,FileInputStream

package ioTest.io2; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /* * IO: * 字符流:Writer,Reader * 字节流:OutPutStream,InPutStream * * 下面的实例仍然是对文本文件进行操作.但是字节流大多用于操作非文本文件, * 比如音频视频图片等文件 */ public class FileSte

Java中的IO操作 字符流:FileReader和 FileWriter

FileReader和 FileWriter  读写字符串 1 package object.io; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.FileReader; 6 import java.io.FileWriter; 7 import java.io.IOException; 8 9 public class FileWrite { 10 11 public s

FileReader和FileWriter文件复制

FileReader和FileWriter文件复制 1.一次读写一个字符 1 import java.io.FileReader; 2 import java.io.FileWriter; 3 import java.io.IOException; 4 5 public class CopyFile { 6 public static void main(String[] args) throws IOException { 7 //创建输入流对象 8 FileReader fr=new Fil

FileReader和FileWriter的应用简例

import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; /* * IO流分类: * 流向 * 输入流 读取数据 FileReader Reader * 输出流 写出数据 FileWriter Writer * 数据类型 * 字节流 * 字节流入 读取数据 InputStream * 字节流出 写出数据 OutputStream * 字符流 * 字符流入 读取数据 Reader * 字符流出

JavaIO流学习总结-FileReader和FileWriter基本操作练习

package io; import java.io.FileReader;import java.io.FileWriter;import java.io.IOException; /* * 修改日期:2020/04/05 * 修改人:牟松 * 字符流FileReader和FileWriter基本操作练习 */public class ceshi { public static void main(String[] args) {   try {   //实例化字符输入流对象,如何只是读取文件