JavaIo流入门篇之字节流基本使用。
一 基本知识了解( 字节流, 字符流, byte,bit是啥?)
/*
java中字节流和字符流之前有接触过,但是一直没有深入的学习和了解。
今天带着几个问题,简单的使用字节流的基本操作。 1 什么是字节流?
字节流是由字节组成的,字符流是由字符组成的.Java里字符由两个字节组成.字节流是最基本的
所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的但实际中很多的数据是文本,
又提出了字符流的概念,它是按虚拟机的encode来处理,
也就是要进行字符集的转化。在从字节流转化为字符流时,实际上就是byte[]转化为String时,
public String(byte bytes[], String charsetName)有一个关键的参数字符集编码,通常我们都省略了,那系统就用操作系统默认的long 总结
·字节流按照字节来处理
·字符流处理文本
·字节输出流OutputStream 数据从程序流到外面(本机电脑等) 在程序中写入文本到本机电脑
·字节输入流InputStream 数据从外部流入写的程序(使用程序读取本机的文件内容) 2 什么是字符流?
Java中的字符流处理的最基本的单元是Unicode码元(大小2字节),它通常用来处理文本数据。所谓Unicode码元,也就是一个Unicode代码单元,
范围是0x0000~0xFFFF。在以上范围内的每个数字都与一个字符相对应,
Java中的String类型默认就把字符以Unicode规则编码而后存储在内存中。然而与存储在内存中不同,存储在磁盘上的数据通常有着各种各样的编码方式。
使用不同的编码方式,相同的字符会有不同的二进制表示。实际上字符流是这样工作的: 输出字符流:把要写入文件的字符序列(实际上是Unicode码元序列)转为指定编码方式下的字节序列,然后再写入到文件中;
输入字符流:把要读取的字节序列按指定编码方式解码为相应字符序列(实际上是Unicode码元序列从)从而可以存在内存中。 3 什么是字节(byte 简称B)
是计算机信息技术用于计量存储容量的一种计量单位,也表示一些计算机编程语言中的数据类型和语言字符。
是计算机中存储数据的一种计量单位。
是编程语言中的数据类型和语言字符。
英文1个字节,中文2个字节 4 什么是位(比特 bit)
电脑的各种存储器的最小的存储单位是比特,也就是位(bit,简称b),它表示一个二进制位。
比位大的单位是字节(byte,简称B),它等于8个二进制位。
因为在存储器中含有大量的存储单元,每个存储单元可以存放8个二进制位,所以存储器的容量是以字节为基本单位的。
电脑有32位和64位。 5 字节(byte)和位(bit)之间的关系?
·字节是byte简称B 位是bit简称b。
·1B等于8b,一个字节等于八个比特,等于8个二进制位。
·bit是电脑存储器中最小的存储单位。他表示一个二进制位。
·电脑中存在多个存储单元,一个单元可以存放8个二进制位,就是可以存放一个byte。所以存储器的容量是以字节为基本单位的。
*/
二 OutPutStream基本使用
public class OutputDemo {
public static void main(String[] args) throws IOException {
write();
}
static void write () throws IOException{
/*
·使用file对象,要确保填写的本机路径的位置是正确的。
·这里的异常直接交给jvm处理,直接声明出去,基本就是io异常。注意声明异常的范围选择。
·File.separator 是系统默认的文件分隔符号,用 File.separator 保证了在任何系统下不会出错。
*/
File file = new File("/Users/zhouxufeng/Desktop" + File.separator + "demo.txt");
//通过子类FileOutputStream 实列化父类对象OutputStream,打开流的通道。
OutputStream outputStream = new FileOutputStream(file);
// 定义一个字符串对象。就是我们要写入的内容
String str1 = "123";
// 字节流只能处理字节,需要把定义的字符串变为byte。
byte [] bytes1 = str1.getBytes();
// 实行写入操作。
outputStream.write(bytes1);
// 流是一种珍贵的资源,使用完毕后要关闭!
outputStream.close();
}
}
写入成功的结果

尝试再次写入,追加文本内容,跑一下看看能否追加成功。
public class OutputDemo {
public static void main(String[] args) throws IOException {
write();
}
static void write () throws IOException{
/*
·使用file对象,要确保填写的本机路径的位置是正确的。
·这里的异常直接交给jvm处理,直接声明出去,基本就是io异常。注意声明异常的范围选择。
·File.separator 是系统默认的文件分隔符号,用 File.separator 保证了在任何系统下不会出错。
*/
File file = new File("/Users/zhouxufeng/Desktop" + File.separator + "demo.txt");
//通过子类FileOutputStream 实列化父类对象OutputStream,打开流的通道。
OutputStream outputStream = new FileOutputStream(file);
// 定义一个字符串对象。就是我们要写入的内容
String str1 = "123";
String str2 = "666";
// 字节流只能处理字节,需要把定义的字符串变为byte。
byte [] bytes1 = str1.getBytes();
byte [] bytes2 = str2.getBytes();
// 实行写入操作。
outputStream.write(bytes1);
outputStream.write(bytes2);
// 流是一种珍贵的资源,使用完毕后要关闭!
outputStream.close();
}
}
查看结果,发现之前写入的文本被后续的写入覆盖了。

解决方案 在FileOutPutStream 的参数中加入 true标记。

看源码,发现这里要追加内容,新增一个true的判断即可。
public class OutputDemo {
public static void main(String[] args) throws IOException {
write();
}
static void write () throws IOException{
/*
·使用file对象,要确保填写的本机路径的位置是正确的。
·这里的异常直接交给jvm处理,直接声明出去,基本就是io异常。注意声明异常的范围选择。
·File.separator 是系统默认的文件分隔符号,用 File.separator 保证了在任何系统下不会出错。
*/
File file = new File("/Users/zhouxufeng/Desktop" + File.separator + "demo.txt");
//true 表示会在文件末尾追加的内容
OutputStream outputStream = new FileOutputStream(file,true);
// 定义一个字符串对象。就是我们要写入的内容
String str1 = "尝试加入新内容";
String str2 = "龙猫";
// 字节流只能处理字节,需要把定义的字符串变为byte。
byte [] bytes1 = str1.getBytes();
byte [] bytes2 = str2.getBytes();
// 实行写入操作。
outputStream.write(bytes1);
outputStream.write(bytes2);
// 流是一种珍贵的资源,使用完毕后要关闭!
outputStream.close();
}
}
查看结果 ,追加内容成功。

三 InPutStrem的基本public class OutputDemo {
public static void main(String[] args) throws IOException {
read();
}
static void write () throws IOException{
/*
·使用file对象,要确保填写的本机路径的位置是正确的。
·这里的异常直接交给jvm处理,直接声明出去,基本就是io异常。注意声明异常的范围选择。
·File.separator 是系统默认的文件分隔符号,用 File.separator 保证了在任何系统下不会出错。
*/
File file = new File("/Users/zhouxufeng/Desktop" + File.separator + "demo.txt");
//true 表示会在文件末尾追加的内容
OutputStream outputStream = new FileOutputStream(file,true);
// 定义一个字符串对象。就是我们要写入的内容
String str1 = "尝试加入新内容";
String str2 = "龙猫";
// 字节流只能处理字节,需要把定义的字符串变为byte。
byte [] bytes1 = str1.getBytes();
byte [] bytes2 = str2.getBytes();
// 实行写入操作。
outputStream.write(bytes1);
outputStream.write(bytes2);
// 流是一种珍贵的资源,使用完毕后要关闭!
outputStream.close();
}
static void read () throws IOException{
File file = new File("/Users/zhouxufeng/Desktop" + File.separator + "demo.txt");
// 通过子类实列化父类对象,打开流的通道
InputStream inputStream = new FileInputStream(file);
// 需要定义一个byte来接收文本中的字符串。
byte [] bytes = new byte[1024];
// 读取
inputStream.read(bytes);
inputStream.close();
//输出
System.out.println(new String(bytes));
}
}
可以读取到文本内容,但是后面有很多0。 因为byte定义的1024。数组定义的大,有了很多空格。

解决方案, 获得read后的返回值。获取byte的长度,在读取数组时,指定读取的范围。

public class OutputDemo {
public static void main(String[] args) throws IOException {
read();
}
static void read () throws IOException{
File file = new File("/Users/zhouxufeng/Desktop" + File.separator + "demo.txt");
// 通过子类实列化父类对象,打开流的通道
InputStream inputStream = new FileInputStream(file);
// 需要定义一个byte来接收文本中的字符串。
byte [] bytes = new byte[1024];
// 读取
int len = inputStream.read(bytes);
inputStream.close();
//输出
System.out.println(new String(bytes,0,len)); } }
正常的读取结果。

在循环中依次读取文本内容
public class OutputDemo {
public static void main(String[] args) throws IOException {
readFu();
}
// 定义一个数组,再循环中一个个的读取文本内容,并存到数组中。
static void readOne()throws IOException{
File file = new File("/Users/zhouxufeng/Desktop" + File.separator + "demo.txt");
InputStream inputStream = new FileInputStream(file);
//这个数组的长度,就是文本内容的长度。
byte [] bytes = new byte[(int)file.length()];
//依次读取,存入数组
for (int i = 0; i < file.length(); i++) {
bytes[i] = (byte) inputStream.read();
}
inputStream.close();
System.out.println(new String(bytes));
}
// read() 返回-1 表示文件读完。 通过判读是否读到文件末尾的方式来读取文件。
static void readFu()throws IOException{
File file = new File("/Users/zhouxufeng/Desktop" + File.separator + "demo.txt");
InputStream inputStream = new FileInputStream(file);
// 首先需要一个容器来装
byte [] bytes = new byte[1024];
// 用于记录读取的数据
int len = 0;
// 不定义这个int变量,输出的内容是乱码
int temp ;
//判读
while ((temp = inputStream.read())!=-1){
bytes[len] = (byte) temp;
len++;
}
// 文件读到末尾,返回值-1。 未用定义的temp去替代这里的返回值,输出的内容有乱码。
// while (inputStream.read()!=-1){
// bytes[len] = (byte)inputStream.read();
// len++;
// }
inputStream.close();
System.out.println(new String(bytes,0,len,"UTF-8"));
// System.out.println(new String(bytes,0,len));
}
}
目前简单的介绍了字节流的输入和输出方法,后续的使用慢慢聊。 学习的过程是逐渐的,加油。
JavaIo流入门篇之字节流基本使用。的更多相关文章
- Java-io流入门到精通详细总结
IO流:★★★★★,用于处理设备上数据. 流:可以理解数据的流动,就是一个数据流.IO流最终要以对象来体现,对象都存在IO包中. 流也进行分类: 1:输入流(读)和输出流(写). 2:因为处理的数据不 ...
- HTML-入门篇day01
HTML-入门篇day01 1.web C/S:Client Server 客户端 服务器 QQ,... B/S:Browser Server 浏览器 服务器 PC机: ...
- Unslider--入门篇
Unslider--入门篇 背景:因工作需求,需要完成一个图片轮播效果,因博主不是专业的前端开发人员,so google之,经过挑选最终选择使用Unslider插件完成工作. 一.Unslider插件 ...
- 使用Guava RateLimiter限流入门到深入
前言 在开发高并发系统时有三把利器用来保护系统:缓存.降级和限流 缓存: 缓存的目的是提升系统访问速度和增大系统处理容量 降级: 降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问 ...
- AngularJS-入门篇
AngularJS是什么? 既然能找到这篇日志,证明大家已经了解AngularJS了我这里也就不长篇大论的说了. 其实AngularJS就是,使用JavaScript编写的客户端技术.和Web技术( ...
- java基础知识回顾之javaIO类---FileInputStream和FileOutputStream字节流复制图片
package com.lp.ecjtu; import java.io.FileInputStream; import java.io.FileNotFoundException; import j ...
- Azure IoT 技术研究系列1-入门篇
物联网技术已经火了很多年了,业界各大厂商都有各自成熟的解决方案.我们公司主要搞新能源汽车充电,充电桩就是我们物联网技术的最大应用,车联网.物联网. 互联网三网合一.作为Azure重要的Partner和 ...
- IO流回顾与总结第一篇之字节流与字符流的操作。。。。。
一.引言 趁着年后的这点时间,抓紧点时间回顾下javase中的IO流,以往都是用到那些常用的IO类,这次来个全点的,有不对的地方还请大神指正一下,做到坚持写博的习惯来...... 回归正题,IO流顾名 ...
- Django--入门篇:下载与项目生成
django作为python web应用开发最火的框架,没有之一,今天就给大家介绍django的一些入门知识. 我们选择pycharm工具,首先得要有django. 1.下载django --pip ...
随机推荐
- 【LeetCode】152. Maximum Product Subarray 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双重循环 动态规划 参考资料 日期 题目地址:htt ...
- rsync 守护进程及实时同步
目录 rsync 守护进程及实时同步 rsync简介 rsync特性 rsync应用场景 cp命令 scp命令 rsync的传输方式 rsync的传输模式 rsync实际使用 rsync命令 案例 r ...
- 文件挂载(一)- Linux挂载Linux文件夹
一.概述 工作中经常会出现不同服务器.不同操作系统之间文件夹互相挂载的情形,例如文件服务器或数据备份服务器. 挂载一般来说就是以下四种类型: 同类型操作系统 a. linux挂载linux文件夹 b. ...
- Java Web程序设计笔记 • 【第10章 JSTL标签库】
全部章节 >>>> 本章目录 10.1 JSTL 概述 10.1.1 JSTL 简介 10.1.1 JSTL 使用 10.1.2 实践练习 10.2 核心标签库 10.2. ...
- Java基础寒假作业-个人所得税计算系统
<个人所得税计算系统>设计 一.需求说明 设计一个简易的个人所得税计算系统,通过输入个人应发工资计算出各个地区的三险(医疗保险.养老保险)一金(公积金)和个人所得税.系统需要实现用户登录. ...
- MySQL8.0.20安装详解
https://blog.csdn.net/yeb112233/article/details/106042867/ alter user root@localhost identified by ' ...
- Kafka基础教程(三):C#使用Kafka消息队列
接上篇Kafka的安装,我安装的Kafka集群地址:192.168.209.133:9092,192.168.209.134:9092,192.168.209.135:9092,所以这里直接使用这个集 ...
- shell 之 循环执行某操作
需求: 按月执行201904到202010的py脚本. 代码如下: #!/bin/bash i=201904 # 定义开始月份 while [ $i -le 202010 ] # 当i小于等于2020 ...
- MYSQL修改配置文件之后无法重启服务
错误:修改配置文件my.ini之后无法重启服务. 原因:以记事本方式打开my.ini文件修改完之后保存.保存之后文本编码格式为操作系统默认格式utf-8.my.ini格式要是ANSI才可以正常启动服务 ...
- python的作用域、globals()-全局变量 和 locals()-局部变量
在python中,函数会创建一个自己的作用域,也称为为命名空间.当我们在函数内部访问某个变量时,函数会优先在自己的命名空间中寻找. 我们自己定义的全局变量均在python内建的globals()函数中 ...