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

JavaIO操作(1)字节流和字符流-1

3.2、字节流和字符流(核心)

使用File类执行的所有操作都是针对于文件本身,但是却没有针对于文件的内容,而要进行文件内容操作就需要通过Java之中提供的两组类完成:

· 字节操作流(是在JDK 1.0的时候定义的):OutputStream、InputStream;

· 字符操作流(是在JDK 1.1的时候定义的):Writer、Reader。

但是不管是字节流还是字符流的操作,本身都表示资源操作,而执行所有的资源操作都会按照如下的几个步骤进行,下面以文件操作为例(对文件进行读、写操作):

· 如果要操作的是文件,那么首先要通过File类对象找到一个要操作的文件路径(路径有可能存在,有可能不存在,如果不存在,则要创建路径);

· 通过字节流或字符流的子类为字节流或字符流的对象实例化(向上转型);

· 执行读 / 写操作;

· 最后一定要关闭操作的资源(close()),不管日后如何操作,资源永远要关闭。

3.2.1、字节输出流:OutputStream

java.io.OutputStream主要的功能是进行字节数据的输出的,而这个类的定义如下:

public abstract class OutputStream

extends Object

implements Closeable, Flushable

发现OutputStream类定义的时候实现了两个接口:Closeable、Flushable,那么这两个接口的定义如下:

CloseableJDK 1.5推出

FlushableJDK 1.5推出

public interface Closeable extends AutoCloseable {

public void close() throws IOException;

}

public interface Flushable {

public void flush() throws IOException;

}

提示:对于Closeable继承的AutoCloseable接口

AutoCloseable是在JDK 1.7的时候又增加了一个新的接口,但是这个接口的定义和Closeable定义是完全一样的,我个人认为:有可能在一些其他的类上出现了自动的关闭功能,Closeable是手工关闭,AutoCloseable属于自动关闭。

但是对于Closeable和Flushable这两个接口实话而言用户不需要关注,因为从最早的习惯对于flush()和close()两个方法都是直接在OutputStream类之中定义的,所以很少去关心这些父接口问题。

对于OutputStream类而言发现其本身定义的是一个抽象类(abstract class),按照抽象类的使用原则来讲,需要定义抽象类的子类,而现在如果要执行的是文件操作,则可以使用FileOutputStream子类完成,如果按照面向对象的开发原则,子类要为抽象类进行对象的实例化,而后调用的方法以父类中定义的方法为主,而具体的实现找实例化这个父类的子类完成,也就是说在整个的操作之中,用户最关心的只有子类的构造方法:

· 实例化FileOutputStream(新建数据):public FileOutputStream(File file) throws FileNotFoundException;

· 实例化FileOutputStream(追加数据):public FileOutputStream(File file, boolean append)

throws FileNotFoundException

当取得了OutputStream类的实例化对象之后,下面肯定要进行输出操作,在OutputStream类之中定义了三个方法:

· 输出单个字节数据:public abstract void write(int b) throws IOException;

· 输出一组字节数据:public void write(byte[] b) throws IOException;

· 输出部分字节数据:public void write(byte[] b, int off, int len) throws IOException;

范例:使用OutputStream向文件之中输出数据,输出路径:d:\hellodemo\test.txt

package cn.mldn.demo;

import java.io.File;

import java.io.FileOutputStream;

import java.io.OutputStream;

public class TestDemo {

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

File file = new File("D:" + File.separator + "hellodemo"

+ File.separator + "test.txt"); // 第1步:定义文件路径

if (!file.getParentFile().exists()) { // 父路径不存在

file.getParentFile().mkdirs(); // 创建父路径

}

OutputStream output = new FileOutputStream(file); // 第2步:通过子类实例化父类

String data = "Hello World .";// 要输出的数据

output.write(data.getBytes()); // 第3步:输出数据,要将数据变为字节数组输出

output.close(); // 第4步:关闭资源

}

}

在整个的文件输出过程之中可以发现,如果现在要输出的文件不存在,那么会出现自动创建文件的情况,并且如果重复执行以上的代码,会出现新的内容覆盖掉旧内容的操作,所以下面可以使用FileOutputStream类的另外一个构造方法进行数据的追加:

package cn.mldn.demo;

import java.io.File;

import java.io.FileOutputStream;

import java.io.OutputStream;

public class TestDemo {

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

File file = new File("D:" + File.separator + "hellodemo"

+ File.separator + "test.txt"); // 第1步:定义文件路径

if (!file.getParentFile().exists()) { // 父路径不存在

file.getParentFile().mkdirs(); // 创建父路径

}

OutputStream output = new FileOutputStream(file, true);// 第2步:通过子类实例化父类

String data = "Hello World .\r\n";// 要输出的数据

output.write(data.getBytes()); // 第3步:输出数据,要将数据变为字节数组输出

output.close(); // 第4步:关闭资源

}

}

如果说现在不想全部内容输出,也可以使用另外一个write()方法部分内容输出。

package cn.mldn.demo;

import java.io.File;

import java.io.FileOutputStream;

import java.io.OutputStream;

public class TestDemo {

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

File file = new File("D:" + File.separator + "hellodemo"

+ File.separator + "test.txt"); // 第1步:定义文件路径

if (!file.getParentFile().exists()) { // 父路径不存在

file.getParentFile().mkdirs(); // 创建父路径

}

OutputStream output = new FileOutputStream(file); // 第2步:通过子类实例化父类

String data = "Hello World .\r\n";// 要输出的数据

output.write(data.getBytes(), 0, 5); // 第3步:输出数据,要将数据变为字节数组输出

output.close(); // 第4步:关闭资源

}

}

在OutputStream类之中所有的数据都是以字节数据为主的。

转载于:https://www.cnblogs.com/guwenren/archive/2013/04/10/3012126.html

相关文章:

7min到40s:SpringBoot 启动优化实践

然后重点排查这些阶段的代码。先看下。

SpringBoot系列教程之Bean之指定初始化顺序的若干姿势

之前介绍了@Order注解的常见错误理解,它并不能指定 bean 的加载顺序,那么问题来了,如果我需要指定 bean 的加载顺序,那应该怎么办呢?本文将介绍几种可行的方式来控制 bean 之间的加载顺序。

在Java中使用WebSocket

WebSocket是一种协议,用于在Web应用程序和服务器之间建立实时、双向的通信连接。它通过一个单一的TCP连接提供了持久化连接,这使得Web应用程序可以更加实时地传递数据。WebSocket协议最初由W3C开发,并于2011年成为标准。

3种方案,模拟两个线程抢票

在多线程编程中,资源竞争是一个常见的问题。资源竞争发生在多个线程试图同时访问或修改共享资源时,可能导致数据不一致或其他并发问题。在模拟两个线程抢票的场景中,我们需要考虑如何公平地分配票,并确保每个线程都有机会成功获取票。本篇文章将通过三种方式来模拟两个线程抢票的过程,以展示不同的并发控制策略。使用 Synchronized 来确保一次只有一个线程可以访问票资源。使用 ReentrantLock 来实现线程间的协调。使用 Semaphore 来限制同时访问票的线程数量。

初级七 委托与事件

1.委托是一种类型,定义委托后想要实现他需要实例化,而事件其实就是委托的一个实例,加了event修饰; 委托实例化可以在 2.委托的作用:可以作为函数的参数传递; 无委托无异步; 委托主要是用来解耦 …

r-route 命令 显示/配置ip路由表

文章目录前言语法格式命令使用输出含义使用实例前言 route命令用于显示和配置IP路由表,在不同节点间的网络通信,想要实现同一局域网之间的通信就需要交换机,不同局域网之间的通信就需要路由器。而路由器的存在是为了提供NAT转换,…

suse oracle 12c安装,用半行代码实现在LINUX(SUSE/RH)下安装ORACLE 12C

最近新到单位的朋友总是抱怨在LINUX下安装ORACLE,实在是太麻烦了,而且这些步骤既不知是什么意思,也记不住;索性,我就分析了一下,经过实践,实现了只用半行代码(确切的说,只消4个字母)…

shell--数组的定义/访问/赋值/遍历

1 #!/bin/bash2 # 数组3 4 # 数组的定义5 a(0 1 2 3)6 # 数组元素的访问7 echo "a[0]:${a[0]}"8 # 数组的长度9 echo "length:${#a[*]}" 10 # 所有元素 11 echo "all element:${a[*]}" 12 # 删除某个元素 13 unset a[1] 14 echo "after uns…

四百元值不值——论小米2A与2S

作为一个米2用户,面对这手机市场极快的更新速度,有些跟不上速度。最近出了小米2A与2S,碰巧有人问值不值的问题,于是就小小的进行了一个研究,跟大家讨论一下。首先小米2A与2S在我看来就是2的翻版,现在小米的…

python复习冒泡排序

冒泡排序: 思路: 先找到最大值放到最右边: #encodingutf-8 a[1,9,2,8,3,6,4] print "a before change:",a for i in range(len(a)-1): if a[i] > a[i1]: a[i],a[i1] a[i1],a[i] print "a after change:",a 结果&…

linux 文件查找命令集:find,locate,wheres,which,type

文章目录前言find命令命令格式:常用选项:举例使用locate命令命令格式使用实例whereis命令使用过程:which命令type命令前言 在linux系统中一切皆文件,此时我们想要从海量的文件中快速定位中我们想要的文件来,需要指定的命令来操作…

oracle生成xml方法,oracle存储过程生成xml==转

1.创建如下存储过程,注意将其中location >d:\work之中的目录改为你本机的某个目录.create or replace procedure getXML(newContext_qry varchar2,rowSettag varchar2,rowTag varchar2,filename varchar2) is-- Input query string-- Input rowsetTag , the root…

打算看的书或正在看的书

打算看的书或正在看的书 《Data Structures and Algorithm Analysis in C》 正在看,这本书是在博客园上看到某个去google的大牛推荐的,的确,虽然数据结构,我已经很熟悉了,但是看这本书的时候,有一些细节我是…

Tutorial——使用Maven开发Cloud Driver

2019独角兽企业重金招聘Python工程师标准>>> Before You Start 开发之前,应有以下准备 Apache MavenCloudify调用云API的安全凭证,使用SSH访问你的机器,如果需要访问您的云的存储。 例如,通过以下步骤获得OpenStack的安…

[Machine Learning with Python] Data Visualization by Matplotlib Library

Before you can plot anything, you need to specify which backend Matplotlib should use. The simplest option is to use Jupyter’s magic command %matplotlib inline. This tells Jupyter to set up Matplotlib so it uses Jupyter’s own backend. Scatter Plot housin…

贪心:Burst Balloons 最少次数完成射击气球

已知在一个平面上有一定数量的气球,平面可以看作一个坐标系,在平面的x轴的不同位 置安排弓箭手向y轴方向射箭,弓箭可以向y轴走无穷远;给定气球的宽度 xstart ≤ x ≤ xend,问至少需要多少弓箭手,将全部气球打爆? 例如…

linux服务器加固的命令,Linux 服务器安全加固

一、summary随着互联网的发展,隐私以及安全被大家看的越来越重视,越来越多的重要交易正在通过网络完成,与此同时数据被损坏、截取和修改的风险也在增加。优秀的系统应当拥有完善的安全措施,应当足够坚固、能够抵抗来自Internet的侵…

devexpress toolbar 填充整行宽度

设置 bar 的 optionsBar.UseWholeRow True 然后可设置Bar 中 Item的右对齐属性。转载于:https://www.cnblogs.com/perpetual/p/3756101.html

【java】staitc

一、static变量 二、static方法 三、static代码块 四、static类:只能是内部类

002.Docker安装部署

一 docker安装-CentOS系统1.1 docker自动安装脚本 1 rootdocker:~# wget -qO- https://get.docker.com/ | sh2 或——3 rootdocker:~# curl -sSL https://get.docker.com/ | sh 注意:若出现以下错误,可使用yum解决依赖——Delta RPMs disabled because /…

贪心:expedition 最优加油方法

已知一条公路上,有一个起点与一个终点,这之间有n个加油站;已知从这n个加 油站到终点的距离d与各个加油站可以加油的量l,起点位置至终点的距离L与起 始时刻油箱中汽油量P;假设使用1个单位的汽油即走1个单位的距离,油箱没有 上限&am…

UML for Java Programmers之dx实战

dx是一套简单的开发规则。它说白了就是迭代开发,在短周期内迭代处理”所有事情“,这里所指的”所有事情“包括需求、分析、设计、实现、测试和文档等等。 它的大概流程是这样:1. 初始探索 跟客户坐下来一起讨论系统到底是做什么的。在这个…

linux进程池动态维护,可直接商用的跨平台c,c++动态线程池,任务池stpool库

stpool是一个轻便高效的动态跨平台的线程池/任务池库.常规线程池的缺点:1. 总是启动时候就开启固定数目的线程,而不管系统的繁忙状态(这是很浪费系统资源的).2. 当任务繁重的时候,即使线程池被设计成可继续添加更多线程来服务,由于实时服务状…

hdu 1286( 欧拉函数 )

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1286 数学题真的是有点吃不消了。。。 View Code 1 #include<iostream>2 #include<cmath>3 using namespace std;4 //可以快速求出欧拉函数的值 ( P为N的质因子 )5 //若(N%P0 && (N/P)%P0…

CF 1093 E. Intersection of Permutations

E. Intersection of Permutations 链接 题意&#xff1a; 给定两个序列&#xff0c;询问第一个排列的[l1,r1]和第二个排列[l2,r2]中有多少个共同的数&#xff0c;支持在第二个排列中交换两个数。 分析&#xff1a; 首先求出一个数组&#xff0c;c[i]&#xff0c;第二个排列的这…

s-seq 生成序列化数字

前言 seq命令用于产生从某个数到另外一个数之间的所有整数。 命令格式 seq [OPTION]... LAST seq [OPTION]... FIRST LAST seq [OPTION]... FIRST INCREMENT LAST 支持将指定范围的数字打印出来&#xff0c;按照指定的递增规律 -f, --format格式 使用printf 样式的浮点格式…

linux c++ 目录操作,C++文件及文件夹操作整理(代码示例)

一 文件1.1 使用C标准库中的IO库(fstream)读写文件#include #include using namespace std;int main(){char szData[200] "123456 test";fstream fFile;fFile.open("test.txt", ios::app | ios::out | ios::in);/****************将数据写入文件-begin***…

cocos2d-x 音效中断问题

做跑酷重吃金币播音效时&#xff0c;播放其它音效会使得音效所有中断&#xff0c;最后发现时音效上限的问题&#xff0c;2.2.3默认的似乎是5个音效&#xff0c;改动成50后问题解决。 在java中的org.cocos2dx.lib包下有一个Cocos2dxSound.java文件&#xff0c;改动里面 private …

AStyle - SourceInsight

SourceInsight : Options : Custom Commands Add 在弹出对话框写入 C/C Formatter "C:\AStyle\AStyle.exe" --styleansi -s2 --convert-tabs %f SourceInsight : Options : Key Assignments

c# blockingcollections

1 class Program2 {3 static BlockingCollection<int> cols new BlockingCollection<int>(2); //设置阻塞队列最大的容量&#xff1b;4 public static void Main(string[] args)5 {6 7 8 var t1…