Java IO 初探

       这段时间,在给公司的一批新员工培训Java  IO的过程中,重新对自己之前学的Java IO有了新的认识。

先从一段代码说起:如下:

 import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
public class SequenceStreamTest {
 /**
  * @throws Exception 
  * @功能  顺序输入流测试
//  */
 public static void main(String[] args) throws Exception 
 {
  FileInputStream fis_01 = new FileInputStream("D:\\Java IO\\测试数据\\error.txt");
        ByteArrayInputStream byis = new ByteArrayInputStream("德邦信息技术中心欢迎您".getBytes("GBK"));
  FileInputStream fis_02 = new FileInputStream("D:\\Java IO\\测试数据\\清查明细.txt");
  List arrayList = new ArrayList();
  arrayList.add(fis_01);
  arrayList.add(byis);
  arrayList.add(fis_02);
  Enumeration cocel = Collections.enumeration(arrayList); 
  SequenceInputStream seq = new SequenceInputStream(cocel);
  byte[] buf = new byte[1024];
//  int i= -1;
  int n=0;
  FileOutputStream fout = new FileOutputStream("D:\\Java IO\\测试数据\\seq.txt");
  while((seq.read(buf))>0)
  {
            fout.write(buf);
            fout.flush();
  }
  
        seq.close();
  fout.close();
        
 }
}

         这段代码执行完成之后,我发现并不是我想要的结果。我的预期结果是,哪个流先加进去,就在结果文件中先出现它的内容。但是最后的结果是,第二个流的内容,在第一个流的内容里面,而且第一个流读取的内容有问题,出现了一些重复的内容。这个问题我在给新员工培训时,没有搞明白是什么问题。后来,课下,我思考了下,其实比较容易理解的。是这样的,对于同一个字节数组,从多个流读取数据,对每一个流的最后一次读取,并不一定能够装满这个字节数组,而没有装满这个数组的那部分内容,就是上一次读取的内容,就会出现内容重复及不同流的内容相互交叉的情况。所以,重点是要修改以下代码段:

		int n=0;
		FileOutputStream fout = new FileOutputStream("D:\\Java IO\\测试数据\\seq.txt");
                             while((n=seq.read(buf))>0)
                             {
                                       fout.write(buf,0,n);
                                       fout.flush();
		}

     接下来,又遇到一个问题:那就是教程里面说PrintStream这个类,在设置其自动刷新缓冲区后,只要调用println()即可自动把数据写到数据汇中,反之,就是如果不设置自动刷新,那么,调用println()就不会自动把数据写到数据汇中,但是接下来这段代码却出现了一些奇怪的现象:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.math.BigDecimal;


public class PrintStreamTest {

	/**
	 * @throws Exception 
	 * @功能 PrintStream测试
	 */
	public static void main(String[] args) throws Exception 
	{
		FileOutputStream fout = new FileOutputStream("H:\\常春藤培训\\韩旺坤\\Java IO\\测试数据\\ps.txt");
		fout.write("hanwangkunxx".getBytes());
                                PrintStream ps = new PrintStream(fout,false);
                                ps.print("2012年常春藤培训正式开始!");
                                ps.println("德邦信息技术中心欢迎大家加入这个大家庭!");
                                ps.println("2012年国庆中秋连续放假8天!");
                                ps.close();        
	}
}

    这段代码,按上面教程的理解,那么应该是:在每次调用println()后,不应该会把数据写到数据汇中,但是实际结果是每次调用之后都会把结果写到数据汇当中,这也是在课堂上未解决的问题。后来,在课下,我查看了源码及网上有关资料,发现是因为这样的:上面那条规则只是对有缓冲区的流才适用的,而我们的FileOutputStream及PrintStream都是没有缓冲区的,所以对这条规则是不适用的,所以如果换成下面的代码就可以了:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.math.BigDecimal;


public class PrintStreamTest {

	/**
	 * @throws Exception 
	 * @功能 PrintStream测试
	 */
	public static void main(String[] args) throws Exception 
	{
	     FileOutputStream fout   = new FileOutputStream("D:\\Java IO\\测试数据\\ps.txt");
                     fout.write("hanwangkunxx".getBytes());
                     PrintStream ps = new PrintStream(new BufferedOutputStream(fout),true);
                     ps.print("2012年常春藤培训正式开始!");
                     ps.println("德邦信息技术中心欢迎大家加入这个大家庭!");
                     ps.println("2012年国庆中秋连续放假8天!");
                     ps.close();       
	}
}

         从这个问题,我突然又发现了,不是说输出流只有在调用flush()方法或close()才会把数据写到数据汇中吗?但是第二个例子,却不是这样的。我查看了OutputStream及FileOutputStream两个流的源代码,发现对于OutputStream类,它的flush()方法是个空的方法,不做任何方法,而FileOutputStream并没有重写OutputStream的flush()方法,所以他们调用的是同一个方法,也就是说对于FileOutputStream流类,有没有调用flush()

方法,它都会把立即把数据写到数据汇中,再仔细一看FileOutputStream的write()方法,发现其是调用底层写的DLL文件来进行数据写操作的。

         

         此时,我又想起之前的一个问题,就是有些流的:markSupported()方法返回true,而有些返回false。经过查看源码,发现不仅这个方法,reset()和mark()方法都是针对有缓冲区的流来说的,对于有缓冲区的流这些方法都是

可以用的,使用这些方法对相应的数据源进行重复读写操作。

        

        至此,通过培训的几个问题,我对Java  IO有了更深入的认识。从而也映证了我的观点:通过给别人培训,可以大大加深你对这块知识的应用与理解,这对自学是非常有用的。

 

数据治理是确保数据准确性、可靠性、安全性、可用性和完整性的体系和框架。它定义了组织内部如何使用、存储、保护和共享数据的规则和流程。数据治理的重要性随着数字化转型的加速而日益凸显,它能够提高决策效率、增强业务竞争力、降低风险,并促进业务创新。有效的数据治理体系可以确保数据在采集、存储、处理、共享和保护等环节的合规性和有效性。 数据质量管理是数据治理中的关键环节,它涉及数据质量评估、数据清洗、标准化和监控。高质量的数据能够提升业务决策的准确性,优化业务流程,并挖掘潜在的商业价值。随着大数据和人工智能技术的发展,数据质量管理在确保数据准确性和可靠性方面的作用愈发重要。企业需要建立完善的数据质量管理和校验机制,并通过数据清洗和标准化提高数据质量。 数据安全与隐私保护是数据治理中的另一个重要领域。随着数据量的快速增长和互联网技术的迅速发展,数据安全与隐私保护面临前所未有的挑战。企业需要加强数据安全与隐私保护的法律法规和技术手段,采用数据加密、脱敏和备份恢复等技术手段,以及加强培训和教育,提高安全意识和技能水平。 数据流程管理与监控是确保数据质量、提高数据利用率、保护数据安全的重要环节。有效的数据流程管理可以确保数据流程的合规性和高效性,而实时监控则有助于及时发现并解决潜在问题。企业需要设计合理的数据流程架构,制定详细的数据管理流程规范,并运用数据审计和可视化技术手段进行监控。 数据资产管理是将数据视为组织的重要资产,通过有效的管理和利用,为组织带来经济价值。数据资产管理涵盖数据的整个生命周期,包括数据的创建、存储、处理、共享、使用和保护。它面临的挑战包括数据量的快速增长、数据类型的多样化和数据更新的迅速性。组织需要建立完善的数据管理体系,提高数据处理和分析能力,以应对这些挑战。同时,数据资产的分类与评估、共享与使用规范也是数据资产管理的重要组成部分,需要制定合理的标准和规范,确保数据共享的安全性和隐私保护,以及建立合理的利益分配和权益保障机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值