当前位置: 首页 > 编程日记 > 正文

IO流(文件的读写)---本文的正确性有待您验证。

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

JAVA的I/O介绍。<<疯狂JAVA编程>>第15章有详细介绍,如下:

http://www.cnblogs.com/lijunamneg/archive/2013/03/22/2975087.html

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 流
 * 流可以读写很多设备,但是读写操作是规范的.
 * 流根据方向分为:
 * 输入流:输入流用于"读",将数据从外界设备读入程序
 * 输出流:输出流用于"写",将数据发送到外界设备
 *
 * 流还可以分为:
 * 节点流(低级流):数据源明确,真实负责读写数据的流
 * 处理流(高级流):不能独立存在,需要基于其他流进行处理工作,使用高级流的目的是简化读写操作    
 *              
 * 使用文件流与RandomAccessFile读写文件的区别:
 * RAF是基于指针进行读写文件数据的,所以可以操作指针位置随意读写文件任何位置的数据.
 * 文件流是基于流的形式读写文件数据,所以只能按顺序读写文件数据,

 * 且不能返回去重新读写,除非重新创建流进行.     
 *              
 * java.io.FileOutputStream
 * 文件字节输出流,是一个低级流,负责向文件中写出数据.             
 * @author  Romanceling
 *
 */
public class FOSTest{
    public static void main(String[] args) throws IOException {
        /*
         * 默认创建出来的FOS是覆盖操作,即:
         * 当创建好该留针对某文件进行写操作前,流会将该文件所有数据删除.
         * 只有本次通过该流写出的数据会存于该文件中.
         */
        FileOutputStream fos = new FileOutputStream("fos.txt");
        String str = "我爱北京天安门!";
        byte[] data = str.getBytes("UTF-8");
        fos.write(data);
        System.out.println("写出完毕!");

        /*
         * FOS的构造方法支持第二个参数,是一个boolean值,若为true,则是追加写模式.
         * 通过该流写出的数据会在该文件末尾追加.
         */
        FileOutputStream fos= new FileOutputStream("fos.txt",true);    
        String str = "天安门上太阳升!";
        fos.write(str.getBytes("UTF-8"));
        System.out.println("写出完毕!");

        //释放资源
        fos.close();

    }

}

/**
 * java.io.FileInputStream
 * 文件字节输入流
 * 是一个低级流,作用是从文件中读取字节数据
 * @author  Romanceling
 *
 */

public class FISTest{
    public static void main(String[] args) throws IOException {
        FileInputStream fis= new FileInputStream("fos.txt");
        byte[] data = new byte[100];
        int len = fis.read(data);
        String str = new String(data,0,len,"UTF-8");
        System.out.println(str);
        fis.close();
    }
}

/**
 * 使用文件字节输入输出流实现文件复制
 * @author Romanceling
 */
public class CopyTest1 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("music.mp3");
        FileOutputStream fos = new FileOutputStream("muisc_copy.mp3");
        
        int len = -1;
        byte[] data = new byte[1024*10];
        while((len=fis.read(data))!=-1){
            fos.write(data,0,len);
        }
        System.out.println("复制完毕!");
        fis.close();
        fos.close();
    }
}
/**

 * java.io.BufferedOutputStream 缓冲输出流    用于写出数据

 * java.io.BufferedInputStream 缓冲输入流    用于读取数据

 * 使用缓冲输入流和缓冲输出流实现文件复制
 * @author Romanceling
 *
 */
public class CopyTest2 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("bos.txt");
        BufferedInputStream bis = new BufferedInputStream(fis);
        FileOutputStream fos = new FileOutputStream("bos_copy.txt");
        BufferedOutputStream bos = new BufferedOutputStream(fos);

        /* void flush();
         * 强制将缓冲区内容写出,无论缓冲区是否装满(各种缓冲流的close方法内部带有flush)
         */
        bos.flush();

        int d = -1;
        long start = System.currentTimeMillis();
        /*
         * 缓冲流读取字节:
         * 当调用bis.read()方法读取一个字节时,缓冲流会一次性读取若干字节回来,

         *并存入内部维护的一个字节数组中,然后将第一个字节返回,
         * 当再次调用该方法读取一个字节时,会直接将字节数组中下一个字节返回,
         * 而不是再去读取数据,直到字节数组所有字节全部返回后才会再一次性读取一组字节回来.
         * 所以实际上还是提高了读取数据量减少读取次数提高的读取效率.
         */
        while((d = bis.read())!=-1){
            bos.write(d);
        }

        long end = System.currentTimeMillis();
        System.out.println("复制完毕!耗时:"+(end-start)+"ms");
        bis.close();
        bos.close();      
    }
}

/**
 * 字符流
 * 字符流读写数据的单位是字符.但是底层依然是读写字节
 * 所以字符流都是高级流,使用它们可以方便读写文本数据.
 *
 * OutputStreamWriter
 * 该字符输出流的特点是可以按照指定的字符集写出字符
 * @author  Romanceling
 */
public class OSWTest {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos= new FileOutputStream("osw.txt");
        /*
         * 默认创建的字符输出流是按照当前系统默认的字符集将写出的字符串转换为对应的字节.
         */
//        OutputStreamWriter osw = new OutputStreamWriter(fos);
        /*
         * 也可以按照指定的字符集写出字符串.
         */
        OutputStreamWriter osw= new OutputStreamWriter(fos,"UTF-8");
        
        osw.write("摩擦摩擦,似魔鬼的步伐");

        /**
         * java.io.InputStremReader
         * 字符输入流,可以按照指定的字符集读取字符
         */

        FileInputStream fis = new FileInputStream("osw.txt");
        InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
        int d = -1;
        while((d=isr.read())!=-1){
            System.out.print((char)d);
        }                
        isr.close();

        osw.close();
    }
}
/**
 * java.io.PrintWriter
 * 缓冲字符输出流
 * 特点:可以按行写出字符串.并且带有自动行刷新功能
 * 通常创建PrintWriter时,其内部会自行创建一个高级流BufferedWriter作为缓冲功能.
 *
 * java.io.BufferedWriter
 * 缓冲字符输出流
 * @author  Romanceling
 *
 */
public class PWDTest {
    public static void main(String[] args) throws IOException {
        /*
         * 针对文件写出操作的构造方法:
         * PrintWriter(File file)
         * PrintWriter(String path)
         */
        PrintWriter pw = new PrintWriter("pw.txt","UTF-8");
        pw.println("大家好");


        /**
         * PrintWriter可以直接处理字节流,也可以处理字符流
         * 但是,直接处理字节流是时不能指定字符集!
         */

        FileOutputStream fos = new FileOutputStream("pw1.txt");
        //直接处理字节流不能指定字符集,只能用系统默认
//        PrintWriter pw = new PrintWriter(fos);
        
        //中间添加一层OSW可以指定字符集了.
        OutputStreamWriter osw= new OutputStreamWriter(fos,"UTF-8");
        PrintWriter pw  = new PrintWriter(osw);

        pw.println("哈哈哈");

        /**
         * 当创建PrintWriter时处理的是流(字节字符均可)
         * 就可以创建具有自动行刷新功能的.
         * 自动行刷新:每当使用println方法写出字符串时,会自动flush
         */

/*
         * 当创建PW时第一个参数为流时,就支持第二个参数,
         * 该参数是一个boolean值,若为true,则PW具有自动行刷新
         */
        PrintWriter pw = new PrintWriter(fos,true);
        /*
         * 具有自动行刷新功能的PW在使用println方法写出字符串时会自动进行flush.

         * 注意,print方法写出字符串不会进行flush.
         */
        pw.println("你好!");

        pw.close();
    }
}

/**
 * java.io.BufferedReader
 * 缓冲字符输入流,可以按行读取字符串
 * @author  Romanceling
 *
 */
public class BRTest {
    public static void main(String[] args) throws IOException {
        FileInputStream fis= new FileInputStream( "src"+File.separator+
                                                                        "day08"+File.separator+"BRDemo.java");
        InputStreamReader isr = new InputStreamReader(fis);        
        BufferedReader br = new BufferedReader(isr);
        /*
         * BufferedReader提供方法:
         * String readLine()
         * 该方法会连续读取若干字节,直到读取到换行符为止,然后将换行符之前的所有字符
         * 组成一个字符串后返回,但是返回的字符串中不含有最后的换行符.
         * 当读取到文件末尾,返回值为NULL.
         */
        String line = null;
        while((line = br.readLine())!=null){
            System.out.println(line);
        }  
        br.close();
    }
}

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * java.io.ObjectOutputStream
 * 对象输出流,是一个高级流,使用该流可以很方便的
 * 将java中的对象转换为一组字节后写出.
 * @author Administrator
 *
 */
public class OOSTest {
    public static void main(String[] args) throws IOException {
        /*
         * 将Person类的一个实例写入到person.obj文件中保存.
         */
        Person p = new Person();
        p.setName("范老师");
        p.setAge(24);
        p.setGender("男");        
        List<String> otherInfo
            = new ArrayList<String>();
        otherInfo.add("是一名段子手");
        p.setOtherInfo(otherInfo);       
        System.out.println(p);

       
        FileOutputStream fos = new FileOutputStream( "person.obj" );        
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        /*
         * OOS提供的写出对象的方法,该方法:
         * 将给定的对象装换位一组字节后写出.
         *
         * 调用writeObject方法后,首先将p对象转换为了一组字节,
         * 将对象转换为一组字节的过程称为:对象的序列化
         * 然后将这组字节通过fos写入到文件中的过程称为:持久化
         */
        oos.writeObject(p);
        System.out.println("写出完毕!");
        oos.close();
    }
}
/**
 * java.io.ObjectInputStream
 * 对象输入流,是一个高级流,可以读取一组字节然后将其还原为对象.
 * 读取的字节应当是由ObjectOutputStream将对象转换的.
 * @author Romanceling
 *
 */
public class OISTest {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        FileInputStream fis = new FileInputStream("person.obj");        
        ObjectInputStream ois = new ObjectInputStream(fis);
        /*
         * 将一组字节还原回对象的过程称为:对象反序列化
         */
        Person p = (Person)ois.readObject();        
        System.out.println(p);
        ois.close();
    }
}

/**
 * 该类是用于测试对象流的读写对象操作
 * 若一个类需要被ObjectOutputStream写出,该类必须实现接口Serializable
 * @author Romanceling
 *
 */
public class Person implements Serializable {    
    /**
     * 当一个类实现了序列化接口后,应当定义一个常量表示版本号.
     * 版本号对对象的反序列化结果产生直接影响.
     *
     * 对象在进行序列化时,会将版本号信息也加入到字节中,
     * 若我们没有定义版本号,对象输出流会根据当前类的结构生成一个版本号,
     * 只要当前类的属性没有发生过结构上的变化,版本号是不变的.
     * 但是建议将版本号自行定义出来,以便维护.
     *
     * 对象输入流ObjectInputStream在反序列化对象时,会检查该对象的版本号与当前类版本号
     * 是否一致。 若字节中该对象的版本号与当前类版本号一致,反序列化成功.
     * 就算类的结构发生了变化,也一样可以成功.
     * 但是若版本号不一致,那么反序列化时会抛出异常.
     */
    private static final long serialVersionUID = 1L;
    /*
     * 当前类若想序列化,除了当前类需要实现序列化接口外,引用类型的属性都要实现序列化接口.
     * java API提供的类基本都实现了.例如下面使用的String.
     */
    private String name;
    private int age;
    private String gender;
    /*
     * transient关键字修饰的属性的作用:
     * 当前对象在进行序列化时,该属性的值将被忽略.
     */
    private transient List<String> otherInfo;
    
    public Person(){       
    }
    public Person(String name, int age, String gender, List<String> otherInfo) {
        super();
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.otherInfo = otherInfo;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public List<String> getOtherInfo() {
        return otherInfo;
    }
    public void setOtherInfo(List<String> otherInfo) {
        this.otherInfo = otherInfo;
    }  
    public String toString(){
        return name+","+age+","+
               gender+","+otherInfo;
    }
}


转载于:https://my.oschina.net/langgege/blog/656319

相关文章:

创建图像 php,详解php创建图像具体步骤

php 的图像处理在验证码是最常见的&#xff0c;下面说下使用php创建图像的具体步骤。简要说明&#xff1a;PHP 并不仅限于创建 HTML 输出&#xff0c; 它也可以创建和处理包括&#xff0c;&#xff0c;&#xff0c;以及在内的多种格式的图像。 更加方便的是&#xff0c;PHP 可以…

Java语法基础-序列化

33&#xff0e; Java序列化中如果有些字段不想进行序列化&#xff0c;怎么办&#xff1f; 答&#xff1a;对于不想进行序列化的变量&#xff0c;使用transient关键字修饰。 transient关键字的作用是&#xff1a;阻止实例中那些用此关键字修饰的的变量序列化&#xff1b;当对象被…

Spring AOP与IOC

Spring AOP实现日志服务pom.xml需要的jar <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.4</version> </dependency> <dependency><groupId>org.springfr…

matlab求解外弹道,基于MATLAB∕Simulink的通用质点外弹道程序设计.pdf

2017.01 设计与研发基于 MATLAB/Simulink 的通用质点外弹道程序设计崔 瀚(沈阳工学院兵器类虚拟仿真实验教学中心, 辽宁抚顺 ,113122 )摘要&#xff1a;本文以弹丸质点外弹道学为研究对象&#xff0c;通过分析以时间为 自变量的质点外弹道方程组&#xff0c;借助 MATLAB/Simuli…

深入Java虚拟机读书笔记[10:20]

第十章 栈和局部变量操作 第十一章 类型转换 第十二章 整数运算 第十三章 逻辑运算 第十四章 浮点运算 第十五章 对象和数组 第十六章 控制流 第十七章 异常 以上一些是操作码相关的内容&#xff0c; 第十八章 finally子句 微型子例程 字节码中的finally子句表现的很像微型子例…

docker Rails Permission denied @ dir_s_mkdir

sudo chmod 777 -R public转载于:https://www.cnblogs.com/znsongshu/p/9777543.html

图形化的Redis监控系统redis-stat安装

Redis需要监控才知道具体运行信息&#xff0c;虽然Redis也提供了info等命令行&#xff0c;但是毕竟不方便而且不能保存历史信息。 redis-stat是一个用ruby写成的监控redis的程序&#xff0c;基于info命令获取信息&#xff0c;而不是通过monitor获取信息。 关于Redis的安装参考此…

Oracle简单脚本演示样例

Oracle简单脚本演示样例 1.添加表 --改动日期&#xff1a;2014.09.21 --改动人&#xff1a;易小群 --改动内容&#xff1a;新增採购支付情况表 DECLARE VC_STR VARCHAR2(5000); VN_COUNT NUMBER; BEGIN --查看现有系统是否有BT_PRODUCT_MODEL表 SELECTCOUNT(…

matlab看fft帮助,日记 [2009年06月02日] MATLAB FFT HELP 帮助文档及我的翻译

fftFast Fourier Transform 的缩写&#xff0c; 即为快速傅氏变换&#xff0c;是离散傅氏变换的快速算法&#xff0c;它是根据离散傅氏变换的奇、偶、虚、实等特性&#xff0c;对离散傅立叶变换的算法进行改进获得的。它对傅氏变换的理论并没有新的发现&#xff0c;但是对于在…

用Kotlin在IntelliJ Idea中无法生成 spring-configuration-metadata.json 文件

为什么80%的码农都做不了架构师&#xff1f;>>> 问题描述 在百度搜索关键词,搜索到了 Stack Overflow 有相关问题 spring-configuration-metadata.json file is not generated in IntelliJ Idea for Kotlin ConfigurationProperties class 原文链接: https://stack…

Linux系统轻量级监控工具monitorix和munin安装

提到监控工具&#xff0c;大家都会想到zabbix等重量级的&#xff0c;这些好是好&#xff0c;但是需要安装数据库等等&#xff0c;如果有时候希望简单点其实可以借助一些轻量级的监控工具&#xff0c;例如monitorix和munin。需要做点前置工作开启Nginx和php-fpm的status&#xf…

MySql 查询表字段数

MySql 查询表字段数 SELECT COUNT(*) FROM information_schema.columns WHERE table_schematest_cases AND table_namecases_send ; test_cases 为数据库名称 cases_send 为表名 列出表字段名称 SHOW COLUMNS FROM cases_send

phpstudy2014 php7.0,phpstudy下载_phpStudy下载2014 官方版_php环境集成包 1.0_零度软件园...

phpStudy 1.7.0 (phpStudy V1.65 Build 080120)该程序包集成最新的ApachePHPmysqlphpMyAdminZendOptimizer&#xff0c;一次性安装&#xff0c;无须配置即可使用&#xff0c;是非常方便、好用的PHP调试环境。该程序不仅包括PHP调试环境&#xff0c;还包括了开发工具、开发手册等…

AndroidApplication优化解耦

Application后处理器&#xff08;AndroidPostProcessing&#xff09;&#xff1a; 通过注解配置初始化各模块及应用所需 sdk&#xff0c;按优先级/延时时间/是否只在Debug下有效/执行线程 等条件初始化 sdk 通常&#xff0c;我们要在 Application 中处理一堆的三方 SDK 和自定义…

Git 详解

1. Git 1.1. Git是何方神圣? Git是用C语言开发的分布版本控制系统。版本控制系统可以保留一个文件集合的历史记录&#xff0c;并能回滚文件集合到另一个状态&#xff08;历史记录状态&#xff09;。另一个状 态可以是不同的文件&#xff0c;也可以是不同的文件内容。举个例子&…

shell基础语法以及监控进程不存在重启

转码 # dos2unix ./test.sh 权限# chmod ax ./test.sh语法 变量 var"111" echo $var echo ${var}运算 no14; no25; let resultno1no2 echo $result;自增自减少 let no let no--[]和let类似 result$[ no1 no2 ] result$[ $no1 5 ] 也可以使用(())&#xff0c;但使…

java md5算法,JAVA实现MD5算法

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼package org.zcq100.Other;public class MD5 {static final int S11 8;static final int S12 13;static final int S13 18;static final int S14 23;static final int S21 7;static final int S22 11;static final int S23 …

Hulu直播服务难点解析(一):系统需求

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/vn9PLgZvnPs1522s82g/article/details/83053654 Hulu在其博客发布了建立直播服务遇到的挑战及解决方案&#xff0c;这对于以前只提供点播服务的系统而言是一次彻底的升级。Li…

Velocity 入门(一)

Velocity是一种Java模版引擎技术&#xff0c;该项目由Apache提出。因为非常好用&#xff0c;和工作中有啥用&#xff0c;所以我在在理简单的入门一下。 网上找了很多教程&#xff0c;写的不是很明白&#xff0c;要么就是全部拷贝下来时候运行不起来。 在这里我来写一份比较完成…

php 魔术方法 多继承,day23:单继承多继承菱形继承__init__魔术方法

原文&#xff1a;https://www.cnblogs.com/libolun/p/13434675.html单继承关于继承的一些基本概念1.什么是子类?什么是父类?如果一个类继承另外一个类&#xff0c;该类叫做子类(衍生类)&#xff0c;被继承的类叫做父类(基类&#xff0c;超类)2.继承的种类:1.单继承 2.多继承3…

最新版IntelliJ IDEA 15开发Java Maven项目

IntelliJ IDEA是最好的java开发IDE之一 下载地址&#xff1a;http://www.jetbrains.com/idea/download/1.安装好之后开始创建项目2.选择Maven类型项目&#xff0c;选择JDK3.设置Maven坐标4.需要给新项目Add Framework support5.选择Java EE项目模板6.初始的网站修改pom.xml文件…

Android APP全面屏适配技术要点

全面屏的概念 为什么先要解释一下全面屏&#xff0c;因为这个词在现在来讲就是一个伪命题。全面屏字面意思就是手机的正面全部都是屏幕&#xff0c;100%的屏占比。但是现在推出所谓“全面屏”手机的厂商没有一个能达到全面的。 那么下面来说一下Android开发领域对全面屏的理解和…

PHP数据库连接池SQL Relay安装使用

SQL Relay按照其官网http://sqlrelay.sourceforge.net/index.html上所说是&#xff1a;A powerful database connection management solution. 翻译为中文也就是说SQL Relay是一个开源的数据库池连接代理服务器。目前SQL Relay支持的数据库很多&#xff1a; SQL Relay supports…

oracle实例由,Oracle数据库和实例

Oracle数据库服务器由一个数据库和至少一个数据库实例组成。 数据库是一组存储数据的文件&#xff0c;而数据库实例是一组管理数据库文件的内存结构。 另外&#xff0c;数据库由后台进程组成。一个数据库和一个实例是紧密相连的&#xff0c;因此术语 - Oracle数据库 通常用来指…

说一说activity

activity与service&#xff0c;provider&#xff0c;receiver并称为 android的四大对象。 而activity&#xff0c;是展现界面的必不可少的组件。我这里有几个问题要问了&#xff0c;他是如何加载&#xff0c;他是如何进行npc的。具体是怎么实现的了。 说道activity的加载&#…

zookeeper脑裂

出现&#xff1a; 在搭建hadoop的HA集群环境后&#xff0c;由于两个namenode的状态不一&#xff0c;当active的namenode由于网络等原因出现假死状态&#xff0c;standby接收不到active的心跳&#xff0c;因此判断active的namenode宕机&#xff0c;但实际上active并没有死亡。此…

C语言编写的PHP框架--yaf入门编程

首先--添加dll&#xff0c;修改php.ini--不同的版本&#xff0c;不同的需求 其次&#xff0c;根据教程http://www.laruence.com/manual/tutorial.firstpage.html#tutorial.directory手动搭建好目录结构 入口文件index.php位置稍作修改--个人习惯 入口文件内容 <?php header…

调试JDK源码-ConcurrentHashMap实现原理

调试JDK源码-一步一步看HashMap怎么Hash和扩容 调试JDK源码-ConcurrentHashMap实现原理 调试JDK源码-HashSet实现原理 调试JDK源码-调试JDK源码-Hashtable实现原理以及线程安全的原因ConcurrentHashMap线程安全的总结是我从源码分析出来的&#xff1a; ConcurrentHashMap所谓线…

oracle某个表丢失,丢失一个控制文件并恢复数据库

只丢失或损坏一个控制文件的情况下来恢复数据库&#xff0c;相对来说简单一点。一般来说&#xff0c;控制文件都需要形成一个多路径冗余策略&#xff0c;来提高数据库的安全性。这样的话只需将完好的控制文件复制一个副本放到丢失或者损坏了的控制文件所在路径的目录下&#xf…

MySQL:一个死锁分析 (未分析出来的死锁)

最近一个朋友给了我一个死锁 没分析出来搞了好几天&#xff0c;但是把以前出现的一个死锁理了一下流程。这里大概记录一下&#xff0c;并且给出朋友的案例。 RC 隔离级别很少出GAP我已经知道的 继承和分裂会出LOCK_GAP这是代码写死的purge线程可能触发页的分裂融合可能触发内部…