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

Java基础系列——IO流

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

---恢复内容开始---

Java对数据的操作都是通过流的方式,数据的输入和输出是相对内存来说的,将外设的数据读到内存:输入流;将内存的数据写到外设:输出流。

流按操作数据分为两种:字节流,字符流。

输入输出的数据全都是以字节为单位的二进制,字符流后期才出现,字符流出现的目的是让机器识别日常生活文字,编码表(美国ascii,中国GBK)记录了文字和数字的对应关系,从而字节流+编码表=字节流,从硬盘读取字节流之后,先查表,转换成对应的文字,从而形成字符流。(注:国际统一的为unicode(java内置),无论什么字符都用2个字节表示)

字节流的抽象基类(顶层父类):inputStream,outputStream.(数据载体)

字符流的抽象基类 :Reader,Writer.

这些子类的后缀都是父类名,前缀是子类实现的功能。

java.lang.Object                                                                                                java.lang.Object

|--java.io.writer   (写入字符流的抽象类)                                                                  |--java.io.writer

|--java.io.OutputStreamWriter(字符流通向字节流的桥梁,转换流)                                  |--BufferedWriter

|--java.io.FileWriter

1.FileWriter:将字符写入到文本文件(和文本编辑器,word等工具一个原理)

public static void main(String[] args) throws IOException{

FileWriter fw = new FileWriter("demo.txt",true);       // 如果demo存在,则会覆盖,如果不存在,创建。如果加入      true,那么不会覆盖,会续写。

fw.write("abc");                                                     //abc写入到了临时存储缓冲区中。

fw.flush();                                                            //将数据直接写入到demo。

fw.close();                                                            //关闭流,释放资源。close中调用了flush,flush可省略。

}

IO异常的处理:

public static void main(String[] args){

FileWriter fw = null;                                             //流对象的创建方式,因为一般都会发生异常。

try{

fw = new FileWriter("demo.txt",true);

fw.write("abc");

}

catch (IOException e){

System.out.println(e.toString());

}

finally{

if(fw != null)                                   //如果要创建的路径不存在,比如F盘没有,那么fw这个流就不能创建,如果这里不判断,就会抛出异常。

try{

fw.close();

}   catch (IOException e) {throw new RuntimeException("关闭失败");}

}

}

2.FileReader:读取文本文件中的字符

FileReader fr = new FileReader("demo.txt");

int a = 0;

while((a=fr.read())!=-1)

{

sop(char(a));                                                          //每次读取一个字符,但是以二进制的数字格式输出(0-65535  0x00-0xffff)。如果读取完了,会返回-1

}

/*

也可以以数组的形式来读

char[] buf = new char[3];

int num = fr.read(buf);                                           //num是读取的字符个数

sop(num+":"+new String(buf,0,num));                    //这里string里用num可以保证读几个打印几个。

如果存的是abcde五个字符,那么第一次逐个读取abc到内存里的长度为3的数组,然后输出num=3和abc,下次读取时de放到了内存数组的前两位,覆盖了ab所在位置, 第三位读不到但是内存中还是c,所以第二次读取num=2和dec,第三次返回num=0和dec。

while((num=fr.read(buf))!=-1){

sop(new String(buf,0,num));                                  //buf越大,效率越高

}

*/

例子:复制文本文件 先读再写

public static void main(String[] args) {
  FileReader fr = null;
        FileWriter fw = null;
        try{
         fr = new FileReader("demo.txt");
         fw = new FileWriter("demo123.txt");
         char[] buf = new char[1024];                                                 // 读流读出来以后,放到内存中缓冲区,然后进写流,写流flush或close,写入demo123

int ch = 0;
         while((ch=fr.read())!=-1)
         {
          fw.write(buf);
         }
        }
         catch(IOException e){
          e.toString();
         }
         finally{
          if(fw!=null )
           try{
            fw.close();
            
           }
          catch( Exception e){
           throw new RuntimeException("读写异常");
          }
          if(fr!=null)
           try{
            fr.close();
           }
          catch( Exception e){
           throw new RuntimeException("读写异常");
          }
         }      
 }

3.字符流的缓冲区BufferedReader,BufferedWriter(其实就是在类里面封装的上面的char数组)

BufferedReader和BufferedWriter,结合流才可以使用,提高流的使用效率。 数据库的连接池

BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符,数组和字符串的高效写入。可以设置大小,但是默认大小一般够用。

方法:行分隔符newline();由line.seperate定义。

public static void main(String[] args) throws IOException {
   FileWriter fw = new FileWriter("demo1.txt");

FileReader fr = new FileReader("demo.txt");

BufferedReader bufr = new BufferedReader(fr);
   BufferedWriter bufw = new BufferedWriter(fw);

String line = null;

while((line = bufr.readLine())!=null){        //readLine()是BufferedReader特有方法,其中使用了BufferedReader的read方法,将读取到的字符串缓冲并判断换行标记,然后将标记前的字符串返回。

bufw.write(line);

bufw.newLine();                            //换行     newLine()是BufferedWriter特有方法

bufw.flush();

}

bufr.close();

bufw.close();                                    //关掉的是流,不是缓冲区

}

java.lang.Object

|--java.io.OutputStream

|--java.io.FileOutputStream

4.FileOutputStream,FileInputStream,BufferedInputStream,BufferedOutputStream.流只能操作文本文件,而字节流可以操作多种。

private static void copy() {
  FileOutputStream fos = null;
  FileInputStream fis = null;
         try{
         fis = new FileInputStream("D:\\cover.jpg");
         BufferedInputStream buis = new BufferedInputStream(fis);
    
         fos = new FileOutputStream("E:\\cover.jpg");
         BufferedOutputStream buos = new BufferedOutputStream(fos);
    
        int ch = 0;
        ry {
        while((ch=buis.read(buf))!=-1){
             try{
             buos.write(buf);
           }
       catch(IOException e){
       System.out.println("失败"); 
     }
     } catch (IOException e) {
     e.printStackTrace();
     }
   
    catch (FileNotFoundException e) {
    e.printStackTrace();
 }finally{
  try {
   if(fis==null)
   fis.close();
   if(fos==null)
   fos.close();
   System.out.println("复制成功");
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

5.字节流和字符流之间的转换 InputStreamReader,OutputStreamWriter

 InputStreamReader将字节流转换成字符流(读取的还是字节流,但是它拿着字节去查表去了,返回的是字符的ASCII值,一个汉字两个字节,如果不转的话,分别输出两个字节值,转换成字符流,输出一个值)         解码的过程


    从 InputStream in = System.in;                                                     上 OutputStream out = System.out;
    上 InputStreamReader isr = new InputStreamReader(in);                向 OutputStreamWriter osw = new OutputStreamWriter(out);
    向 BufferedReader bufr = new BufferedReader(isr);                         下 BufferedWriter bufw = new BufferedWriter(osw);
    下 String line = bufr.readLine();               ------------------------->   从 bufw.write(line);

简化写法 BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in或者是FileInputStream("demo.txt")));

BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out或者是FileOutputStream("demo.txt")));

注意点:FileWriter fw = new FileWriter("demo.txt");效果等同于

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("demo.txt"),"GBK");

FileWriter是子类,为操作文件而生,默认GBK,其中封装了转换流功能,虽然看起来是直接操作文本中的字符,但说到底文本还是要从硬盘读取,硬盘中的数据是字节。

6.File类

File f1 = new File("c:\\a.txt");   File f2 = new File("c:\\","a.txt");

File f = new File("c:\\");      File f4 = new File(f,"a.txt");

File f = new File("c:"+File.separator+"睿思"+File.separator+"a.txt");   分隔符File.separator

具体方法:文件对象的状态获取,创建删除,判断,重命名,获取根目录和容量,目录内容,过滤指定类型文件的过滤器(FilenameFilter接口)等。

7.Properties类(与流相关)

Map
   |--HashTable
      |--Properties
1.集合中的键和值都是字符串类型。
2.该集合中的数据可以保存到流中,或者从流获取。操作以键值对形式存在的配置文件。

功能:将配置文件以流的形式读出,然后利用properties的方法对其中的键值形式信息进行操作。

1.Properties p = new Properties();
     p.setProperty("zhangsan", "22");
     FileOutputStream fos = new FileOutputStream("demo.txt");
     p.store(fos, "name+age");
     fos.close();

2. File file = new File("demo.txt");
      if(!file.exists()){
      file.createNewFile();
      }
      FileReader fr = new FileReader(file);
      Properties p = new Properties();
      p.load(fr);
      p.list(System.out);//列出文件内容,测试是否关联成功
      p.setProperty("wangwu", "33");
      FileWriter fw = new FileWriter(file);
      fw.close();
      fr.close();

3.记录应用程序打开次数

File confile = new File("confile.txt");
   if(!confile.exists()){
    confile.createNewFile();
   }
   FileReader fr = new FileReader(confile);
   Properties p = new Properties();
   p.load(fr);
   String name = p.getProperty("time");
   int value = 0;
   if(name!=null){
    value = Integer.parseInt(name);
   }
   value++;
   p.setProperty("time", "value");

4.返回目录下文件名以.java结尾的文件(附件

复制代码
public class Test { public static void main(String[] args) throws IOException {File dir = new File("c:\\");FilenameFilter filter = new FilenameFilter(){ public boolean accept(File dir,String name){ return name.endsWith(".java");}};List<File> list = new ArrayList<File>();getFiles(dir,filter,list);File destFile = new File(dir,"javalist.txt");write2File(list,destFile);} public static void getFiles(File dir,FilenameFilter filter,List<File> list){File[] files = dir.listFiles(); for(File file : files){ if(file.isDirectory()){getFiles(file,filter,list);} else{ if(filter.accept(dir, file.getName()));{list.add(file);}}}} public static void write2File(List<File> list,File destFile){BufferedWriter bufw = null; try {bufw = new BufferedWriter(new FileWriter(destFile)); for(File file:list){bufw.write(file.getAbsolutePath());bufw.newLine();bufw.flush();}} catch (IOException e) { throw new RuntimeException();} finally{ if(bufw!=null){ try{bufw.close();}catch(IOException e){ throw new RuntimeException("关闭失败");}}}}}
复制代码

8.打印流 PrintStream PrintWriter

可以对多种数据类型值进行打印,并保持数据的表示形式。不抛IOException。想保证数据形式原样时,用print方法。

PrintStream 打印的所有字符都使用平台的默认字符编码转换为字节。在需要写入字符而不是写入字节的情况下,应该使用
PrintWriter类。

构造函数接受三种类型值:字符串路径,File对象,字节输出流

PrintStream out = new PrintStream("print.txt");

out.print(97);

out.close();

      9.序列流SequenceInputStream

复制代码
public static void main(String[] args) throws IOException {ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();al.add(new FileInputStream("demo1.txt"));al.add(new FileInputStream("demo2.txt"));al.add(new FileInputStream("demo3.txt"));Enumeration<FileInputStream> en = Collection.enumeration(al);               //迭代器SequenceInputStream sis = new SequenceInputStream(en);FileOutputStream fos = new FileOutputStream("demo.txt"); byte[] buf = new byte[1024]; int len = 0; while((len = sis.read(buf))!=-1){fos.write(buf,0,len);}fos.close();sis.close();}

转载于:https://my.oschina.net/1590538xiaokai/blog/399443

相关文章:

Visual Studio Code / Roboware Studio调整字体大小,跳转等操作

调大字体:Ctrl 调小字体:Ctrl _- 跳转:F12 跳转返回:Ctrl Alt _- 打开内部终端:Ctrl ~

C4D和Redshift:2D矢量到三维渲染 Cinema 4D and Redshift: 2D vector to 3D render

C4D和Redshift:2D矢量到三维渲染 时长:1h 4m |视频:. MP4 1280720&#xff0c;30 fps(r) |音频:AAC&#xff0c;48000 Hz&#xff0c;2ch |大小解压后:633 MB 含课程文件 语言&#xff1a;英语中英文字幕(机译) 本课程涵盖了诸如将矢量转换为3d场景的主题。您将了解哪些数据可以…

《深入理解Java虚拟机》(第二版)学习2:垃圾收集算法

对象存活判断 在对堆进行回收之前虚拟机需要判断这些对象中那些是“存活”的。 引用计数算法&#xff08;Reference Counting&#xff09; 原理&#xff1a;给对象中添加一个引用计数器&#xff0c;每当有一个地方引用它时&#xff0c;计数器值就加一&#xff1b;当引用失效…

Android 知识杂记(MVP模式)

MVP的模式在于将原来activity中业务逻辑的部分剥离出来&#xff0c;代码示例如下&#xff1a; Accountpublic class Account {private String mUsername;private String mPassword;public String getmUsername() {return mUsername;}public void setmUsername(String mUsername…

玩转百度即用API(2)——身份证查询

2019独角兽企业重金招聘Python工程师标准>>> 第二个即用API&#xff0c;身份证查询 示例代码&#xff1a; #-*- coding: utf-8 -*- #version&#xff1a;0.1 #note:该即用API接口简单&#xff0c;输入身份证只能查到3个信息&#xff1a;大概地址&#xff0c;性别&am…

解决Ubuntu环境下不能QT不能输入中文

参考链接: https://blog.csdn.net/baidu_33850454/article/details/81212026?utm_mediumdistribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_sourcedistribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2…

UE5虚幻引擎5中的实时特效学习 Introduction to real time FX in Unreal Engine 5

MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |时长:40节课(3h 36m) |大小解压后:2.65 GB 含课程文件 从零开始使用尼亚加拉在虚幻引擎中学习实时外汇…

《深入理解Java虚拟机》(第二版)学习3:垃圾收集器

垃圾收集器 如果说收集算法是内存回收的方法论&#xff0c;那么垃圾收集器就是内存回收的具体实现。 我们这里讨论的收集器主要是基于JDK 1.7 Update 14之后的 Hotspot VM 。 Serial 收集器 Serial 收集器是最基本、发展历史最悠久的收集器&#xff0c;曾经&#xff08;在 …

2016寒假训练3

题目链接 A CodeForces 362A Two Semiknights Meet 题意&#xff1a;在一个棋盘中有两个定义了特殊走法的棋子&#xff0c;同时移动他们&#xff0c;问是否会相遇&#xff08;只能在合法的位置&#xff09;。 做法&#xff1a;直接暴力dfs处理出这两个棋子到达各个位置的时间&a…

2015化妆品行业如何进行微信公众号营销

对比其他行业发展特点发现化妆品行业具有以下特点&#xff1a; 1、化妆品行业呈现节日、电商促销影响明显、口碑评价关注度高、女性网民占比高冲动消费多、整体用户年轻化等特点。 2、化妆品行业即使在各行业发展低迷期依然保持良好发展势头。 3、化妆品商家的顾客回头率高。 4…

在新建好的ROS空间里面添加功能包

第一步:创建功能包 cd catkin_ws打开src ~/catkin_ws/src新建文件夹名字 catkin_create_pkg (文件加名字) roscpp rospy std_msgs打开新建文件夹中的src ~/catkin_ws/src/(新建文件夹名字)/src输入: gedit 文件.cpp返回工作空间: 执行catkin build 编译后即可执行

Revit的Enscape基本培训(2021) Enscape Essential Training for Revit (2021)

MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |时长:2h 53m |大小解压后:2.23 GB 含课程练习文件 如果您使用Revit&#xff0c;您可能需要学习Enscape&…

设计模式学习2:单例模式

单例模式 所谓类的单例设计模式&#xff0c;就是采取一定的方法保证在整个的软件系统中&#xff0c;对某个类只能存在一个对象实例&#xff0c;并且该类只提供一个取得其对象实例的方法(静态方法)。 比如Hibernate的SessionFactory&#xff0c;它充当数据存储源的代理&#xf…

数据库插入时,标识列插入显式值

当 IDENTITY_INSERT 设置为 OFF 时&#xff0c;不能为表 CU_GiftExchange 中的标识列插入显式值。SET IDENTITY_INSERT [dbo].[CU_GiftExchange] ONGO转载于:https://blog.51cto.com/hezun/1631849

Ubuntu终端显示文本让选择确定,OK等等

问题1:首先按下"TAB"键,会看到选中文本"确定","OK"然后按下回车键,即可!

Unity安卓游戏开发:打造7款2D 3D游戏 Unity Android Game Development : Build 7 2D 3D Games

流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |大小:15.4 GB |时长:32h 55m Unity游戏开发与设计&#xff0c;用C# & Unity学习Unity安卓游戏开发(更…

唯一索引和普通索引的选择

前言&#xff1a;最近在研究阿里的开发手册中关于 MySQL 的一些规定&#xff0c;所以来记录一下学习中的心得 唯一索引和普通索引的选择 【强制】业务上具有唯一特性的字段&#xff0c;即使是组合字段&#xff0c;也必须建成唯一索引。 说明&#xff1a;不要以为唯一索引影响了…

Springboot整合HBase——大数据技术之HBase2.x

Apache HBase 是以hdfs为数据存储的,一种分布式、可扩展的noSql数据库。是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。HBase使用与BigTable(BigTable是一个稀疏的、分布式的、持久化的多维排序map)非常相似的数据模型。用户将数据行存储在带标签的表中。数据行具有可排序的键和任意数量的列。该表存储稀疏,因此如果用户喜欢,同一表中的行可以具有疯狂变化的列。

一个合格的Java选手必须要掌握的并发锁知识

Java内置锁:基于Java语法层面(关键词)实现的锁,主要是根据Java语义来实现,最典型的应用就是synchronized。Java显式锁:基于JDK层面实现的锁,主要是根据基于Lock接口和ReadWriteLock接口,以及统一的AQS基础同步器等来实现,最典型的有ReentrantLock。使用方式:synchronized关键字互斥锁主要有作用于对象方法上面,作用于类静态方法上面,作用于对象方法里面,作用于类静态方法里面等4种方式。

终于有人把Web 3.0和元宇宙讲明白了

分散的数据网络使个人数据(例如个人的健康数据、农民的作物数据或汽车的位置和性能数据)出售或交换成为可能,与此同时,不会失去对数据的所有权控制、放弃数据隐私或依赖第三方平台来管理数据。Web 3.0的目标是在创作者经济中取得更好的平衡。互联网第二次迭代(Web 2.0)的缺陷,加上公有区块链技术的诞生,帮助我们朝着更加去中心化的Web 3.0 迈进,元宇宙和更广泛的去中心化网络都是关于现实世界和虚拟世界的融合。此时的网络中不再是静态内容,而是动态的内容,用户现在可以与发布在网络上的内容进行交互。

ubuntu下安装 python 常用软件

1、用于科学计算的常用包&#xff1a; sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy python-nose 包括&#xff0c;numpy, scipy, matplotlib, ipython, ipython-notebook, pandas, sympy, nose 2、…

《团队项目开发之三对一维环形数组的求解》

《团队项目开发之三对一维环形数组的求解》 设计思想&#xff1a;通过把数组的长度扩大为原来的一倍&#xff0c;相当于新数组是由对原来的数组重复了一遍后而组成的&#xff0c;这样保证了数组以环状的形式&#xff0c;按照数组中每个数字的位序依次对它们可能形成的最大子数组…

PX4修改线程内存大小

当编译时出现错误&#xff1a; 在CMakeLists.txt文件中修改内存大小 px4_add_module(#下面添加文件夹名字MODULE modules__position_control#下面添加线程名字MAIN a#线程内存大小STACK_MAIN 4000SRCS#添加文件夹里面.cpp文件main.cppDEPENDS)修改后&#xff0c;再次编译就不…

Blender液体烟与火VFX特效制作教程 Blender VFX Liquid Smoke Fire

流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;48.0 KHz 语言:英语|大小:6.60 GB |时长:7h 44m Blender了解三维模型如何创建模拟和动画的简单方法 你会学到什么 完成创建两个鬼魅万圣节场景的完整指南&#xff0c;包括模拟和全动画元素 使用Blender…

Ajax+SpringBoot+Thymeleaf使用中遇到的跳转页面问题

前言&#xff1a;这周在使用 AjaxThymeleaf 时遇到一个问题&#xff0c;折腾了我很久&#xff0c;在此记录一下 AjaxSpringBootThymeleaf使用中遇到的跳转页面问题 问题描述 我的目的&#xff1a;通过 Ajax 获取数据&#xff0c;并通过 Model 渲染 View &#xff0c;实现跳转…

数据库分离 脱机

数据库分离&#xff1a;一般默认情况下数据库在联机状态下我们不能对数据库文件进行任何复制删除等操作&#xff0c;如果将数据库分离的话就可以对数据文件进行复制、剪切、删除等操作了。一般想直接备份数据文件&#xff0c;就先分离数据库&#xff0c;之后把数据文件复制到别…

年卡在手,城墙我走: 记葡萄城控件团队建设

上个周六&#xff0c;赶着春天的尾巴&#xff0c;《葡萄城控件业务团队》进行了一次有趣的团队建设&#xff1a;西安城墙半日游。 拿到《2015陕西旅游年票一卡通》&#xff0c;还是小小激动一下&#xff0c;据说有888个景点可以免费游玩呢。 从葡萄城到西安南门&#xff0c;这个…

PX4代码框架

src&#xff1a;目录是源码目录存放所有的源码&#xff0c;源码的查看都应该在这里。 mavlink&#xff1a;是MAvlink的库目录&#xff0c;源码要调用这个库&#xff0c;如果我们要修改和添加MAVLINLK消息ID也是在这个目录下面。 NuttX&#xff1a;是NuttX的系统库&#xff0c…

Houdini魔法特效制作学习教程

大小解压后&#xff1a;12.1G 1920X1080 mp4 语言&#xff1a;英语中英文字幕 Houdini已经成为特效行业的热门工具。 谁运用它的力量&#xff0c;谁就势不可挡。 魔法咒语、科幻盾牌和电磁脉冲冲击波。掌握特效的艺术元素是这里的目标&#xff0c;我们将指导您完成它。 魔法通常…

关于SpringBoot项目通过jar包启动之后无法读取项目根路径静态资源

前言&#xff1a;这个是昨天晚上在部署一个项目的时候发现的&#xff0c;在此记录一下 关于SpringBoot项目通过jar包启动之后无法读取项目根路径静态资源 问题描述 在部署了一个项目之后&#xff0c;打开项目页面进行测试&#xff0c;发现有一个查询页面查询失败了&#xff0…