`
gengu
  • 浏览: 88001 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

java IO学习笔记[1]

阅读更多

每次看javaIO的时候就很烦躁,一是因为太繁琐了,看到这么多类,又是字节流又是字符流的,二是我做javaEE开发的时候用的实在不多,过两天就忘了。

 

流又分为输入流和输出流:这个是以内存为参照的,如果是向内存存入的就是输入流,从内存流出就是输出流。

 

java的IO分为字符流和字节流,字节输入流每次都是从文件或者内存中的读取都是以字节为单位的,在abstract类InputStream中有一个abstract的read方法

 

/**
Reads the next byte of data from the input stream. The value byte is
     * returned as an <code>int</code> in the range <code>0</code> to
     * <code>255</code>. If no byte is available because the end of the stream
     * has been reached, the value <code>-1</code> is returned

*/

public abstract int read() throws IOException;//这个方法的的用法是返回一个int类型的,虽然是int但是0~255那么只有一个字节的大小

public int read(byte b[]) throws IOException {
	return read(b, 0, b.length);
    }
//以上方法是将读取的字节存储到一个字节数组中

public int read(byte b[], int off, int len) throws IOException 

 在这个类中读取字节的主要方法是一个abstract的,我以为会在子类中得到源码,打开FileInputStream后发现是一个native方法

 public native int read() throws IOException;
//那么java在底层调用了C++写的代码了

 所以我们看不到他的具体实现是什么,不过可以知道的是在读取文件的时候还负责了游标的后移等的操作

 

在javaIO字节输入流中这个方法是核心,再来看一下DataInputStream,它是能够从文件或者内存中读取入int,char,short,long之类的数据的,字节输出流每次读取的都是字节,那么它是怎么读取返回数据的呢?

public final int readInt() throws IOException {
        int ch1 = in.read();
        int ch2 = in.read();
        int ch3 = in.read();
        int ch4 = in.read();
        if ((ch1 | ch2 | ch3 | ch4) < 0)
            throw new EOFException();
        return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
    }

//这上面是一个读取int类型的数据方法,仔细看会发现它实际上每次读取了四个字节,将第一个字节左移三个字节长度,
//第二个字节左移两个字节长度,第三个字节左移一个字节长度,然后将他们相加起来就得到了一个int

很相像的还有
public final char readChar() throws IOException {
        int ch1 = in.read();
        int ch2 = in.read();
        if ((ch1 | ch2) < 0)
            throw new EOFException();
        return (char)((ch1 << 8) + (ch2 << 0));
    }

//在这里值得注意的是判断条件ch1 | ch2) < 0
//为什么这么判断呢?是因为读取的是字节那么范围在0~255,这样两者或运算应该是正数,而出现负数只有一种可能那就是读到文件结尾不够了,返回了-1
public final int readUnsignedShort() throws IOException {
        int ch1 = in.read();
        int ch2 = in.read();
        if ((ch1 | ch2) < 0)
            throw new EOFException();
        return (ch1 << 8) + (ch2 << 0);
    }

 

我一直不清楚的是在字节输入输出流中的布尔类型的数据是这么存储的,看了源码发现是这样的

在DataOutPutStream类中

  /**
     * Writes a <code>boolean</code> to the underlying output stream as 
     * a 1-byte value. The value <code>true</code> is written out as the 
     * value <code>(byte)1</code>; the value <code>false</code> is 
     * written out as the value <code>(byte)0</code>. If no exception is 
     * thrown, the counter <code>written</code> is incremented by 
     * <code>1</code>.
     *
     * @param      v   a <code>boolean</code> value to be written.
     * @exception  IOException  if an I/O error occurs.
     * @see        java.io.FilterOutputStream#out
     */
    public final void writeBoolean(boolean v) throws IOException {
	out.write(v ? 1 : 0);
	incCount(1);
    }
//就是说java将boolean存储成了一个byte大小的数据


在DataInputStream类中读取boolean是这样的
public final boolean readBoolean() throws IOException {
	int ch = in.read();
	if (ch < 0)
	    throw new EOFException();
	return (ch != 0);
    }
 

再来看看对象字节流,我们甚至可以使用字节的方式将对象写入文件中,当然该对象的类必须实现了Serializable接口,当我们需要再恢复这个对象的时候,系统不需要再调用构造器来执行初始化。当然了恢复出来的对象与原对象还是不同的对象,除了他们在堆中的地址之外具有其他一样的属性。

package com.gengu.input;

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

import com.gengu.assist.Book;

/**
 * 这个类测试对象字节输入流
 * */
public class TestObjectInput {

	public static Object objectInput(String filename) throws IOException, ClassNotFoundException{
		FileInputStream fin = new FileInputStream("F://新建文件夹 (2)/TestIO/src/com/gengu/input/test.txt");
		ObjectInputStream oin = new ObjectInputStream(fin);
		
		Object object = oin.readObject();
		fin.close();
		oin.close();
		return object;		
		
	}
	
	//向文件中写入对象
	public static  void objectOutput(String filename,Object obj) throws IOException{
		FileOutputStream fout = new FileOutputStream(filename,false);
		ObjectOutputStream oout = new ObjectOutputStream(fout);
		
		oout.writeObject(obj);
		oout.close();
		fout.close();
		
	}
	
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		Book book = new Book();
		TestObjectInput.objectOutput("F://新建文件夹 (2)/TestIO/src/com/gengu/input/test.txt", book);
		Book book1 = (Book) TestObjectInput.objectInput("F://新建文件夹 (2)/TestIO/src/com/gengu/input/test.txt");
		System.out.println(book1.getClass()==book.getClass());
	}
}
 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    COMSOL多物理模拟下二氧化碳驱替甲烷:热流固耦合中煤层变形及物性变化对产气量及封存能力的影响

    内容概要:本文详细介绍了使用COMSOL多物理场仿真软件,在热流固耦合框架下,研究二氧化碳驱替甲烷过程中的煤层变形、孔渗变化及其对甲烷产量和二氧化碳封存量的影响。首先,文章解释了二氧化碳驱替甲烷作为一种关键技术的意义,然后逐步展示了模型的构建方法,包括设定煤层作为多孔介质、考虑其复杂物理特性(如渗透率、孔隙度)以及模拟二氧化碳注入和甲烷释放过程。接着,通过对模拟结果的分析,揭示了煤层在二氧化碳注入后的明显变形、孔渗特性的显著变化,最终得出甲烷产量与煤层孔渗特性紧密相关,而二氧化碳封存量受煤层变形和孔渗变化影响的结论。最后,强调了该模型对未来理解和优化驱替过程的重要性。 适合人群:从事能源领域研究的专业人士,尤其是关注二氧化碳驱替甲烷技术的研究人员和技术人员。 使用场景及目标:适用于需要深入了解二氧化碳驱替甲烷过程中煤层变形和孔渗变化机理的研究项目,旨在提高甲烷产量和二氧化碳封存量的理解和优化。 其他说明:文中提供了详细的建模步骤和代码分析,有助于读者掌握COMSOL多物理场仿真的具体操作方法。

    少儿编程scratch项目源代码文件案例素材-我的世界 守卫者.zip

    少儿编程scratch项目源代码文件案例素材-我的世界 守卫者.zip

    【制造业AGV调度系统】基于Python的两交叉轨道AGV调度优化:任务分配、路径规划与充电管理设计了一个针对制造业环境中(含详细可运行代码及解释)

    内容概要:本文详细探讨了制造业工厂中两条交叉轨道(红色和紫色)上的自动导引车(AGV)调度问题。系统包含2辆红色轨道AGV和1辆紫色轨道AGV,它们需完成100个运输任务。文章首先介绍了AGV系统的背景和目标,即最小化所有任务的完成时间,同时考虑轨道方向性、冲突避免、安全间隔等约束条件。随后,文章展示了Python代码实现,涵盖了轨道网络建模、AGV初始化、任务调度核心逻辑、电池管理和模拟运行等多个方面。为了优化调度效果,文中还提出了冲突避免机制增强、精确轨道建模、充电策略优化以及综合调度算法等改进措施。最后,文章通过可视化与结果分析,进一步验证了调度系统的有效性和可行性。 适合人群:具备一定编程基础和对自动化物流系统感兴趣的工程师、研究人员及学生。 使用场景及目标:①适用于制造业工厂中多AGV调度系统的开发与优化;②帮助理解和实现复杂的AGV调度算法,提高任务完成效率和系统可靠性;③通过代码实例学习如何构建和优化AGV调度模型,掌握冲突避免、路径规划和电池管理等关键技术。 其他说明:此资源不仅提供了详细的代码实现和理论分析,还包括了可视化工具和性能评估方法,使读者能够在实践中更好地理解和应用AGV调度技术。此外,文章还强调了任务特征分析的重要性,并提出了基于任务特征的动态调度策略,以应对高峰时段和卸载站拥堵等情况。

    MATLAB中基于FDTD方法模拟电磁波自由空间传播的仿真系统(含ABC边界与正弦脉冲激励源)

    内容概要:本文介绍了一个使用MATLAB编写的基于FDTD(时域有限差分)方法的电磁波在自由空间中传播的仿真系统。该系统采用了ABC(吸收边界条件)和正弦脉冲激励源,并附有详细的代码注释。文中首先介绍了关键参数的选择依据及其重要性,如空间步长(dx)和时间步长(dt),并解释了它们对算法稳定性和精度的影响。接着阐述了电场和磁场的初始化以及Yee网格的布局方式,强调了电场和磁场分量在网格中的交错排列。然后详细讲解了吸收边界的实现方法,指出其简单而有效的特性,并提醒了调整衰减系数时需要注意的问题。最后,描述了正弦脉冲激励源的设计思路,包括脉冲中心时间和宽度的选择,以及如何将高斯包络与正弦振荡相结合以确保频带集中。此外,还展示了时间步进循环的具体步骤,说明了磁场和电场分量的更新顺序及其背后的物理意义。 适合人群:对电磁波传播模拟感兴趣的科研人员、高校学生及工程技术人员,尤其是那些希望深入了解FDTD方法及其具体实现的人群。 使用场景及目标:适用于教学演示、学术研究和技术开发等领域,旨在帮助使用者掌握FDTD方法的基本原理和实际应用,为后续深入研究打下坚实基础。 阅读建议:由于本文涉及较多的专业术语和技术细节,建议读者提前熟悉相关背景知识,如电磁理论、MATLAB编程等。同时,可以通过动手实践代码来加深理解和记忆。

    少儿编程scratch项目源代码文件案例素材-小鸡会飞.zip

    少儿编程scratch项目源代码文件案例素材-小鸡会飞.zip

    房地产 -云南农博园项目一组团(河尾村)产业规划构思.pptx

    房地产 -云南农博园项目一组团(河尾村)产业规划构思.pptx

    haproxy-2.2.17

    haproxy-2.2.17

    少儿编程scratch项目源代码文件案例素材-音乐飞翔.zip

    少儿编程scratch项目源代码文件案例素材-音乐飞翔.zip

    少儿编程scratch项目源代码文件案例素材-信仰.zip

    少儿编程scratch项目源代码文件案例素材-信仰.zip

    scratch少儿编程逻辑思维游戏源码-锯切片.zip

    scratch少儿编程逻辑思维游戏源码-锯切片.zip

    scratch少儿编程逻辑思维游戏源码-货车.zip

    scratch少儿编程逻辑思维游戏源码-货车.zip

    scratch少儿编程逻辑思维游戏源码-火箭动力超级鱿鱼.zip

    scratch少儿编程逻辑思维游戏源码-火箭动力超级鱿鱼.zip

    scratch少儿编程逻辑思维游戏源码-滚动的天空.zip

    scratch少儿编程逻辑思维游戏源码-滚动的天空.zip

    scratch少儿编程逻辑思维游戏源码-极速求生.zip

    scratch少儿编程逻辑思维游戏源码-极速求生.zip

    scratch少儿编程逻辑思维游戏源码-火柴人战争.zip

    scratch少儿编程逻辑思维游戏源码-火柴人战争.zip

    MATLAB一维PCHE微通道换热器模型:基于系统参数的换热性能研究及应用

    内容概要:本文详细介绍了MATLAB一维PCHE微通道换热器模型在能源工质系统中的应用。首先,文章阐述了PCHE的设计与模型建立,强调了进出口节点温度参数对确定PCHE长度和换热量的重要性。接着,文中采用了湍流型长直半圆通道Gnielinki方程来计算流动换热的努塞尔数,从而评估PCHE的换热性能。最后,通过MATLAB调用Refprop物性库求解普朗特数,进一步优化PCHE的设计,提升其换热效率。研究表明,这种模型有助于提高能源工质系统的换热性能,推动微通道换热器在能源领域的广泛应用。 适合人群:从事能源工程、热力学、换热器设计等相关领域的研究人员和技术人员。 使用场景及目标:适用于需要精确计算和优化微通道换热器性能的研究项目,旨在提高能源利用效率并减少环境污染。 其他说明:随着计算机技术的发展,一维PCHE微通道换热器模型将进一步完善,为能源领域的发展提供更强有力的支持。

    少儿编程scratch项目源代码文件案例素材-星际飞船.zip

    少儿编程scratch项目源代码文件案例素材-星际飞船.zip

    少儿编程scratch项目源代码文件案例素材-外星异形战跑.zip

    少儿编程scratch项目源代码文件案例素材-外星异形战跑.zip

    图25. 火焰成像装置捕获图像示意图

    图25. 火焰成像装置捕获图像示意图

    scratch少儿编程逻辑思维游戏源码-僵尸射击.zip

    scratch少儿编程逻辑思维游戏源码-僵尸射击.zip

Global site tag (gtag.js) - Google Analytics