Core Java - 流(Stream) - 字节流和字符流(一)
0. 概述:
Java中基于流的I/O构建在4个抽象类之上, 其中2个是字节流,另外2个是字符流。
字节流:
InputStream / OutputStream
当操作字节或其它二进制对象时,应当使用字节流。
字符流:
Reader / Writer
当操作字符或字符串时,应当使用字符流。
1. InputStream
InputStream: 输入字节流,它是一个抽象类。
常用主要方法:
int read()
返回代表下一个可用字节的整数,当文件达到末尾时,返回-1。
int read(bute buffer[])
尝试读取buffer.length个字节到buffer中,返回实际成功读取的字节数;文件到末尾返回-1。
int read(bute buffer[], int offset, int numBytes)
尝试读取numBytes个字节到buffer中,从buffer[offset]开始保存读取的字节;
返回实际成功读取的字节数;文件到末尾返回-1。
2. OutputStream
OutputStream: 输出字节流,它是一个抽象类。
OutputStream有很多子类,它们分别负责向不同的介质写入数据。
例如:
FileOutputStream 写入数据到文件
TelnetOutputStream 写入数据到网络连接
ByteArrayOutputStream 写入数据到字节数组
常用主要方法:
void write(int b)
向输出流中写入单个字节。
void write(byte buffer[])
向输出流中写入一个完整的字节数组。
void write(byte buffer[], int offset, int numBytes)
从buffer[offset]开始将numBytes个字节写入输出流中。
void flush()
结束输出状态,刷新输出缓冲区。
3. FileInputStream
文件读取字节流。
常用构造函数:
FileInputStream(String filePath) (更常用)
FileInputStream(File fileObj)
一个同构输入流来读取文件内容的例子,演示了3种方式(单字节读取, 字节数组读取, 忽略部分字节读取)
代码如下:
package corejava8.io.stream; import java.io.*; public class FileInputStreamDemo {
public static void main(String args[]) {
int size; // Use try-with-resources to close the stream
try (FileInputStream f = new FileInputStream("src/corejava8/io/stream/FileInputStreamDemo.java")) {
System.out.println("Total Available Bytes: " + (size = f.available()));
int n = size / 40; // 通过循环每次单字节读取
System.out.println("First " + n + " bytes of the file one read() at a time");
for (int i = 0; i < n; i++) {
System.out.print((char) f.read());
}
System.out.println("\nStill Available: " + f.available());
System.out.println("--------------------------------------------------------------"); // 字节数组读取
System.out.println("Reading the next " + n + " with one read(b[])");
byte b[] = new byte[n];
if (f.read(b) != n) {
System.err.println("couldn’t read " + n + " bytes.");
}
System.out.println(new String(b, 0, n));
System.out.println("\nStill Available: " + (size = f.available()));
System.out.println("--------------------------------------------------------------"); // 忽略部分字节读取
System.out.println("Skipping half of remaining bytes with skip()");
f.skip(size / 2);
System.out.println("Still Available: " + f.available());
System.out.println("Reading " + n / 2 + " into the end of array");
if (f.read(b, n / 2, n / 2) != n / 2) {
System.err.println("couldn't read " + n / 2 + " bytes.");
}
System.out.println(new String(b, 0, b.length));
System.out.println("\nStill Available: " + f.available());
} catch (IOException e) {
System.out.println("I/O Error: " + e);
}
}
}
运行结果如下:
Total Available Bytes: 1704
First 42 bytes of the file one read() at a time
package corejava8.io.stream;
import java.
Still Available: 1662
--------------------------------------------------------------
Reading the next 42 with one read(b[])
io.*;
public class FileInputStreamDemo {
Still Available: 1620
--------------------------------------------------------------
Skipping half of remaining bytes with skip()
Still Available: 810
Reading 21 into the end of array
io.*;
public class Fm.err.println("couldn
Still Available: 789
4. FileOutputStream
文件输出字节流,用于向文件中写入字节。
4个常用构造函数:
FileOutputStream(String filePath)
FileOutputStream(File fileObj)
FileOutputStream(String filePath, boolean append)
FileOutputStream(File fileObj, boolean append)
在开始下面的例子前,我们先提到流关闭的一个细节,那就是
在JDK 7之前的遗留代码,都使用显式地调用close()方法来关闭流,这种办法
比较笨拙。
老的代码:
try {
FileOutputStream f0 = new FileOutputStream("file1.txt");
// 文件写入操作
} catch(IOException e) {
System.out.println("An I/O Error Occurred");
} finally {
try {
if(f0 != null) f0.close();
} catch(IOException e) {
System.out.println("Error Closing file1.txt");
}
}
}
新的代码(JDK 7及以后的代码):
带资源的try(try with resources)
try (FileOutputStream f0 = new FileOutputStream("file1.txt")) {
// 文件写入操作
} catch(IOException e) {
System.out.println("An I/O Error Occurred");
}
是不是代码变得更加简洁了?
我们的例子:
package corejava8.io.stream; import java.io.*; public class FileOutputStreamDemo {
public static void main(String args[]) {
String source = "Now is the time for all good men\n" + " to come to the aid of their country\n"
+ " and pay their due taxes.";
byte buf[] = source.getBytes();
// Use try-with-resources to close the files.
try (FileOutputStream f0 = new FileOutputStream("file1.txt");
FileOutputStream f1 = new FileOutputStream("file2.txt");
FileOutputStream f2 = new FileOutputStream("file3.txt")) {
// write to first file
for (int i = 0; i < buf.length; i++)
f0.write(buf[i]); // write to second file
f1.write(buf); // write to third file
f2.write(buf, 3, buf.length - 3);
} catch (IOException e) {
System.out.println("An I/O Error Occurred");
}
}
}
运行结果如下:
第一个,第二个文件内容都是:
Now is the time for all good men
to come to the aid of their country
and pay their due taxes.
第三个文件跳过第一个单词,内容如下:
is the time for all good men
to come to the aid of their country
and pay their due taxes.
上述代码中:
byte buf[] = source.getBytes();
用于获取源数据(字符串)的字节数组。
Core Java - 流(Stream) - 字节流和字符流(一)的更多相关文章
- java 笔记(4) —— java I/O 流、字节流、字符流
Java中使用流来处理程序的输入和输出操作,流是一个抽象的概念,封装了程序数据于输入输出设备交换的底层细节.JavaIO中又将流分为字节流和字符流,字节流主要用于处理诸如图像,音频视频等二进制格式数据 ...
- JavaSE学习笔记(14)---File类和IO流(字节流和字符流)
JavaSE学习笔记(14)---File类和IO流(字节流和字符流) File类 概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 构造方 ...
- Java 输入/输出——字节流和字符流
1.流的分类 (1)输入流和输出流(划分输入/输出流时是从程序运行所在内存的角度来考虑的) 输入流:只能从中读取数据,而不能向其写入数据. 输出流:只能向其写入数据,而不能从中读取数据. 输入流主要由 ...
- Java基础:IO流之字节流和字符流
1. 流的概念 流(stream)的概念源于UNIX中管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备.外部文件等. 一个流,必有源端和目的端 ...
- Java笔记(二十六)……IO流上 字节流与字符流
概述 IO流用来处理设备之间的数据传输 Java对数据的操作时通过流的方式 Java用于操作流的对象都在IO包中 流按操作的数据分为:字节流和字符流 流按流向不同分为:输入流和输出流 IO流常用基类 ...
- java IO之字节流和字符流-Reader和Writer以及实现文件复制拷贝
接上一篇的字节流,以下主要介绍字符流.字符流和字节流的差别以及文件复制拷贝.在程序中一个字符等于两个字节.而一个汉字占俩个字节(一般有限面试会问:一个char是否能存下一个汉字,答案当然是能了,一个c ...
- 【Java IO流】字节流和字符流详解
字节流和字符流 对于文件必然有读和写的操作,读和写就对应了输入和输出流,流又分成字节和字符流. 1.从对文件的操作来讲,有读和写的操作——也就是输入和输出. 2.从流的流向来讲,有输入和输出之分. 3 ...
- 【java】io流之字节流转为字符流:java.io.OutputStreamWriter和java.io.InputStreamReader
package 文件操作; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; impo ...
- java的IO流,字节流和字符流
java操作文件都是通过流来处理的,(其实其他很多语言也是这样) 第一:java的IO流,分为:输入流 和 输出流(这真是废话,这是从流向的角度来说的) 第二:java的所有IO流,只分为:字节流 和 ...
随机推荐
- php执行流程
1.源码文件编写,php源文件 2.词法分析,token 3.语法分析,生成opcode并组成opcode array 4.执行opcode,返回结果
- 3163: [Heoi2013]Eden的新背包问题
Description "寄没有地址的信,这样的情绪有种距离,你放着谁的歌曲,是怎样的心心静,能不能说给我听."失忆的Eden总想努力地回忆起过去,然而总是只能清晰地记得那种思念的 ...
- php public protected private属性实例详解
php 类中函数和类变量都有三个属性:public protected private,具体什么时候使用什么属性好纠结,特意找了个实例,这样看起来更清晰. public 表示全局,类内部外部子类都可以 ...
- C++矢量图形库系列(1)——矢量图形库乱谈(转)
转自:http://blog.sina.com.cn/s/blog_4265e1760100lg03.html 本系列篇章的主要内容是讲解矢量图形库的编译.开发和使用.并不对他们周边的内容做过多的描述 ...
- Web前台直接加载GIS格式数据分析
本文以Flex直接加载Shp.DWG和MDB为例. 首先看一份现估测数据: 1) 加载Shp文件,目前直接由前台Flex代码完成: 图1 在ArcCatalog里面的Shp文件 图2 直接在前台加载 ...
- jexus ASP.NET开发注意项1
Jexus@宇内(273766940) 9:09:02 linux上的文件名和文件路径是大小写敏感的. Jexus@宇内(273766940) 9:10:11 在win上,你文件名是 Login.as ...
- Adaboost算法初识
1.算法思想很简单: AdaBoost 是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器,即弱分类器,然后把这些弱分类器集合起来,构造一个更强的最终分类器.(三个臭皮匠,顶个诸葛亮) 它的 ...
- ServiceStack.Redis之IRedisClient<第三篇>
事实上,IRedisClient里面的很多方法,其实就是Redis的命令名.只要对Redis的命令熟悉一点就能够非常快速地理解和掌握这些方法,趁着现在对Redis不是特别了解,我也对着命令来了解一下这 ...
- 分分钟用上C#中的委托和事件之窗体篇
上次以鸿门宴的例子写了一篇名为<分分钟用上C#中的委托和事件>的博文,旨在帮助C#初学者迈过委托和事件这道坎,能够用最快的速度掌握如何使用它们.如果觉得意犹未尽,或者仍然不知如何在实际应用 ...
- REST API 安全设计指南
0x01 REST API 简介 REST的全称是REpresentational State Transfer,表示表述性无状态传输,无需session,所以每次请求都得带上身份认证信息.rest是 ...