浅析javaIO的原理过程

浅析javaIO的原理过程IO流用来处理设备之间的数据传输。Java程序中,对于数据的输入/输出操作以”流(stream)”的方式进行。是指从源节点到目标节点的数据流动源节点和目标节点可以是文件、网络、内存、键盘、显示器等等。java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。输…

大家好,又见面了,我是你们的朋友全栈君。

IO流用来处理设备之间的数据传输。

Java程序中,对于数据的输入/输出操作以”流(stream)” 的方式进行。是指从源节点到目标节点的数据流动

源节点和目标节点可以是文件、网络、内存、键盘、显示器等等。

java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。

输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。

输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中

按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)  

按数据流的流向不同分为:输入流,输出流

 

字节流

字符流

输入流

InputStream(基类)

Reader(基类)

输出流

OutputStream (基类)

Writer(基类)

流中的数据

二进制字节(8位)

Unicode字符(16位)

 

Java的IO流共涉及40多个类,实际上非常规则,都是从如下4个抽象基类派生的。

由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。

无论是文本文件还是二进制文件,当需要读取文件数据时,需要完成以下步骤:

使用文件输入流打开指定文件:

               对于文本文件,应使用字符输入流FileReader流

                对于二进制文件,应使用字节输入流FileInputStream流

读取文件数据

关闭输入流

无论是文本文件还是二进制文件,当需要将数据写入文件时,需要完成以下步骤:

使用文件输出流打开指定文件:

对于文本文件,应使用字符输出流FileWriter流

对于二进制文件,应使用字节输出流FileOutputStream流

将数据写入文件

关闭输出流

package com.xatu.IO;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

import org.junit.Test;

public class IOTest {
/*
 * 要处理IO三步
 * 打开
 * 处理
 * 关闭(通道)//因为流不是内存资源,而是和操作系统有关的资源,所以必须现实关闭
 *不关闭无法写入文件
 */
	@Test
	public void testFileReader() {
		Reader fr = null;
		
			try {//打开流,创建对象
				fr = new FileReader("input.txt");
				//处理流中的数据
				char[] buf = new char[100];
				int realCount = 0;
				while ((realCount = fr.read(buf)) != -1) {
					//for (int i = 0; i <buf.length; i++) {//如果最后一次读取可能读到脏数据
					for (int i = 0; i < realCount; i++) {
						System.out.print(buf[i]);
					}
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		finally {
			// 
			if (fr != null) {
				try {//关闭流先写
					fr.close();
				} catch (IOException e) {
				}
			}
		}
	}
}

在打开一个现有文件的输出流以准备写入数据时,有两种方式可供选择:

以清空方式打开

以添加方式打开

Reader 和 InputStream 是所有输入流的基类。

Reader(典型实现:FileReader)

int read() // 读取一个字符

int read(char [] c) //一次性读多个字符到缓冲区数组

int read(char [] c, int off, int len)

InputStream(典型实现:FileInputStream)

int read() //读取一个字节

int read(byte[] b) //一次性读多个字节到缓冲区数组

int read(byte[] b, int off, int len)

程序中打开的文件 IO 资源不属于内存里的资源,而是和操作系统相关的资源。垃圾回收机制无法回收该资源,所以应该显式关闭文件 IO 资源。

Writer 和 OutputStream 也非常相似:

void write(int b/int c);// 向流中写一个字节/字符

void write(byte[] b/char[] cbuf);//向流中写一个数组

void write(byte[] b/char[] buff, int off, int len);

void flush();

void close(); 需要先刷新,再关闭此流

因为字符流直接以字符作为操作单位,所以 Writer 可以用字符串来替换字符数组,即以 String 对象作为参数

void write(String str);

void write(String str, int off, int len);

@Test
	public void testFileWriter() {
		Writer fw = null;
		try {
			fw = new FileWriter("output",true);//后面的参数true指明写入文件时用追加的方式
			
			String[] text = {
					"zheshiyaoxiedewenjian\n",
					"zheshiyaoxiedewenjian\n",
					"zheshiyaoxiedewenjian\n",
					"zheshiyaoxiedewenjian\n",
					"zheshiyaoxiedewenjian\n",
					"zheshiyaoxiedewenjian\n",
					"zheshiyaoxiedewenjian\n"
			};
			for (String line : text) {
				char[] buf = line.toCharArray();//把字符串对象转换成为相应的字符数组
				//fw.write(buf);//把数组内容写入输出流
				fw.write(buf, 0, 22);//把数组下标3开始,总共写9个字符写入输出流
			}
					
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			try {
				fw.close();//输出流调用close会间接调用flush把缓冲区的数据强行写入硬盘
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

在Windows系统中,文本文件每行结尾都有两个不可见的特殊字符表示该行结束。

这两个字符为<回车>符(Unicode码为13)和<换行>符(Unicode码10 )称为<回车>-<换行>序列。

在Unix系统中,文本文件每行结尾只有<换行>符。

在Java语言中, <回车>符用’ \r’表示,<换行>符用’ \n’表示。

System.out.println语句,就是在输出一行内容后,继续输出<回车>-<换行>序列,从显示效果上使光标移动下一行开始。

通常情况下只需要\n即可换行

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/134663.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SMO算法笔记及个人理解

    SMO算法笔记及个人理解SMO算法介绍SMO算法是一种启发式算法,其基本思路是:如果所有变量的解都满足此优化问题的KKT条件,那么这个最优化问题的解就得到了。(KKT条件是该最优化问题的充分必要条件)。否则,选择两个变量,固定其他变量针对这两个变量构建一个二次规划问题。特点:将原始的二次规划问题分解为只含有两个变量的二次规划子问题,对子问题不断求解,使得所有的变量满足KKT条件包含两部分:1、求解两个变量二次规划的解析方法2、选择变量的启发式方法(1)第1个变量的选择:确定在当前的分类器中,违反K.

    2022年6月22日
    37
  • C++之constexpr详解

    C++之constexpr详解constexpr表达式是指值不会改变并且在编译过程就能得到计算结果的表达式。声明为constexpr的变量一定是一个const变量,而且必须用常量表达式初始化:constexprintmf=20;//20是常量表达式constexprintlimit=mf+1;//mf+1是常量表达式constexprintsz=size();//之后当siz…

    2025年8月6日
    3
  • mt4平台交易系统下载_mt4软件下载工具

    mt4平台交易系统下载_mt4软件下载工具我们在使用ea回测的时候,如果使用自带的数据回测,因为数据质量问题,无法回测出ea的实际盈亏能力。这时就需要一个高质量的数据来回测,而自带的数据往往不能满足这一点我今天要介绍的是一款tickstory的数据下载。以英镑美元为例:1、选中你要下载的货币对,右键,选择导出mt4中。2、选择导出的时间范围,最高可以10年。3、选择时间周期,按照默认的就行。4、选择…

    2022年8月15日
    8
  • Iphone Installous IPA file folder location

    Iphone Installous IPA file folder locationMyIphoneisIOS4.3.3,the Installous4DownloadFolderLocationisas:/private/var/mobile/Documents/Installous/DownloadsUsingtheSSHcanaccess.

    2026年2月5日
    5
  • 究竟什么是可重入锁?

    究竟什么是可重入锁?经历很久之前就听说了可重入锁,可重入锁究竟是什么意思,以前是囫囵吞枣的,只要记住ReentrantLock和sychronized是可重入锁就行了,爱咋用咋用,好吧,原谅我的无知,最近对基础查漏补缺,发现竟然对其一问三不知,赶紧预习一波,觉得有必要写一篇博客来讲解,就当做什么都没有发生吧,嘿嘿。。。释义广义上的可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(

    2022年6月26日
    24
  • 用python做一个贪吃蛇游戏_免费贪吃蛇试玩的游戏

    用python做一个贪吃蛇游戏_免费贪吃蛇试玩的游戏一、前言距上次更新博客,又过去很长时间了,感觉再不更新一下,自己写博客的习惯就要废了,哈哈。从去年九月份开学之后,疫情学期期末考试开学考、实验室项目软著申请和新项目设计、课程集训等事情较多,没有很多时间;然后这个学期我到大三下学期,实验室工作交接完就准备考研,之后也没有很多时间来写博客,所以赶紧来更新一下,和大家分享一些知识和心得,希望喜欢的小伙伴可以点赞、收藏和关注,哈哈。二、贪吃蛇大冒险小游戏一、游戏简介1.1游戏操作及游戏规则(1)游戏开始后,通过键盘上下左右键控制贪吃蛇移动寻找食物;(2

    2022年8月11日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号