- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java中的InputStreamReader和OutputStreamWriter源码分析_动力节点Java学院整理由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
InputStreamReader和OutputStreamWriter源码分析 。
1. InputStreamReader 源码(基于jdk1.7.40) 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
package
java.io;
import
java.nio.charset.Charset;
import
java.nio.charset.CharsetDecoder;
import
sun.nio.cs.StreamDecoder;
// 将“字节输入流”转换成“字符输入流”
public
class
InputStreamReader
extends
Reader {
private
final
StreamDecoder sd;
// 根据in创建InputStreamReader,使用默认的编码
public
InputStreamReader(InputStream in) {
super
(in);
try
{
sd = StreamDecoder.forInputStreamReader(in,
this
, (String)
null
);
// ## check lock object
}
catch
(UnsupportedEncodingException e) {
// The default encoding should always be available
throw
new
Error(e);
}
}
// 根据in创建InputStreamReader,使用编码charsetName(编码名)
public
InputStreamReader(InputStream in, String charsetName)
throws
UnsupportedEncodingException
{
super
(in);
if
(charsetName ==
null
)
throw
new
NullPointerException(
"charsetName"
);
sd = StreamDecoder.forInputStreamReader(in,
this
, charsetName);
}
// 根据in创建InputStreamReader,使用编码cs
public
InputStreamReader(InputStream in, Charset cs) {
super
(in);
if
(cs ==
null
)
throw
new
NullPointerException(
"charset"
);
sd = StreamDecoder.forInputStreamReader(in,
this
, cs);
}
// 根据in创建InputStreamReader,使用解码器dec
public
InputStreamReader(InputStream in, CharsetDecoder dec) {
super
(in);
if
(dec ==
null
)
throw
new
NullPointerException(
"charset decoder"
);
sd = StreamDecoder.forInputStreamReader(in,
this
, dec);
}
// 获取解码器
public
String getEncoding() {
return
sd.getEncoding();
}
// 读取并返回一个字符
public
int
read()
throws
IOException {
return
sd.read();
}
// 将InputStreamReader中的数据写入cbuf中,从cbuf的offset位置开始写入,写入长度是length
public
int
read(
char
cbuf[],
int
offset,
int
length)
throws
IOException {
return
sd.read(cbuf, offset, length);
}
// 能否从InputStreamReader中读取数据
public
boolean
ready()
throws
IOException {
return
sd.ready();
}
// 关闭InputStreamReader
public
void
close()
throws
IOException {
sd.close();
}
}
|
2. OutputStreamWriter 源码(基于jdk1.7.40) 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
package
java.io;
import
java.nio.charset.Charset;
import
java.nio.charset.CharsetEncoder;
import
sun.nio.cs.StreamEncoder;
// 将“字节输出流”转换成“字符输出流”
public
class
OutputStreamWriter
extends
Writer {
private
final
StreamEncoder se;
// 根据out创建OutputStreamWriter,使用编码charsetName(编码名)
public
OutputStreamWriter(OutputStream out, String charsetName)
throws
UnsupportedEncodingException
{
super
(out);
if
(charsetName ==
null
)
throw
new
NullPointerException(
"charsetName"
);
se = StreamEncoder.forOutputStreamWriter(out,
this
, charsetName);
}
// 根据out创建OutputStreamWriter,使用默认的编码
public
OutputStreamWriter(OutputStream out) {
super
(out);
try
{
se = StreamEncoder.forOutputStreamWriter(out,
this
, (String)
null
);
}
catch
(UnsupportedEncodingException e) {
throw
new
Error(e);
}
}
// 根据out创建OutputStreamWriter,使用编码cs
public
OutputStreamWriter(OutputStream out, Charset cs) {
super
(out);
if
(cs ==
null
)
throw
new
NullPointerException(
"charset"
);
se = StreamEncoder.forOutputStreamWriter(out,
this
, cs);
}
// 根据out创建OutputStreamWriter,使用编码器enc
public
OutputStreamWriter(OutputStream out, CharsetEncoder enc) {
super
(out);
if
(enc ==
null
)
throw
new
NullPointerException(
"charset encoder"
);
se = StreamEncoder.forOutputStreamWriter(out,
this
, enc);
}java io系列
01
之
"目录"
// 获取编码器enc
public
String getEncoding() {
return
se.getEncoding();
}
// 刷新缓冲区
void
flushBuffer()
throws
IOException {
se.flushBuffer();
}
// 将单个字符写入到OutputStreamWriter中
public
void
write(
int
c)
throws
IOException {
se.write(c);
}
// 将字符数组cbuf从off开始的数据写入到OutputStreamWriter中,写入长度是len
public
void
write(
char
cbuf[],
int
off,
int
len)
throws
IOException {
se.write(cbuf, off, len);
}
// 将字符串str从off开始的数据写入到OutputStreamWriter中,写入长度是len
public
void
write(String str,
int
off,
int
len)
throws
IOException {
se.write(str, off, len);
}java io系列
01
之
"目录"
// 刷新“输出流”
// 它与flushBuffer()的区别是:flushBuffer()只会刷新缓冲,而flush()是刷新流,flush()包括了flushBuffer。
public
void
flush()
throws
IOException {
se.flush();
}
// 关闭“输出流”
public
void
close()
throws
IOException {
se.close();
}
}
|
说明:
OutputStreamWriter 作用和原理都比较简单.
作用就是将“字节输出流”转换成“字符输出流”。它的原理是,我们创建“字符输出流”对象时,会指定“字节输出流”以及“字符编码”。 。
示例程序 。
InputStreamReader和OutputStreamWriter的使用示例,参考源码(StreamConverter.java): 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
import
java.io.File;
import
java.io.FileInputStream;
import
java.io.FileOutputStream;
import
java.io.OutputStreamWriter;;
import
java.io.InputStreamReader;
import
java.io.IOException;
/**
* InputStreamReader 和 OutputStreamWriter 测试程序
*
*
*/
public
class
StreamConverter {
private
static
final
String FileName =
"file.txt"
;
private
static
final
String CharsetName =
"utf-8"
;
//private static final String CharsetName = "gb2312";
public
static
void
main(String[] args) {
testWrite();
testRead();
}
/**
* OutputStreamWriter 演示函数
*
*/
private
static
void
testWrite() {
try
{
// 创建文件“file.txt”对应File对象
File file =
new
File(FileName);
// 创建FileOutputStream对应OutputStreamWriter:将字节流转换为字符流,即写入out的数据会自动由字节转换为字符。
OutputStreamWriter out1 =
new
OutputStreamWriter(
new
FileOutputStream(file), CharsetName);
// 写入10个汉字
out.write(
"字节流转为字符流示例"
);
// 向“文件中”写入"0123456789"+换行符
out1.write(
"0123456789\n"
);
out1.close();
}
catch
(IOException e) {
e.printStackTrace();
}
}
/**
* InputStreamReader 演示程序
*/
private
static
void
testRead() {
try
{
// 方法1:新建FileInputStream对象
// 新建文件“file.txt”对应File对象
File file =
new
File(FileName);
InputStreamReader in =
new
InputStreamReader(
new
FileInputStream(file), CharsetName);
// 测试read(),从中读取一个字符
char
c1 = (
char
)in1.read();
System.out.println(
"c1="
+c1);
// 测试skip(long byteCount),跳过4个字符
in1.skip(
6
);
// 测试read(char[] cbuf, int off, int len)
char
[] buf =
new
char
[
10
];
in1.read(buf,
0
, buf.length);
System.out.println(
"buf="
+(
new
String(buf)));
in.close();
}
catch
(IOException e) {
e.printStackTrace();
}
}
}
|
运行结果:
1
2
|
c1=字
buf=流示例
0123456
|
结果说明:
(01) testWrite() 的作用是将“内容写入到输出流”。写入的时候,会将写入的内容转换utf-8编码并写入.
(02) testRead() 的作用是将“内容读取到输入流”。读取的时候,会将内容转换成utf-8的内容转换成字节并读出来.
生成的文件utf-8的file.txt的16进制效果图如下: 。
将StreamConverter.java中的CharsetName修改为"gb2312"。运行程序,生产的file.txt的16进制效果图如下:
以上所述是小编给大家介绍的Java中的InputStreamReader和OutputStreamWriter源码分析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 。
最后此篇关于Java中的InputStreamReader和OutputStreamWriter源码分析_动力节点Java学院整理的文章就讲到这里了,如果你想了解更多关于Java中的InputStreamReader和OutputStreamWriter源码分析_动力节点Java学院整理的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在使用 JavaFX 8 创建一个应用程序。我使用拖/放动态更改网格 Pane 的内容。我希望每行或每行/列迭代 GridPane 内容。JavaFX 允许通过指定行和列在 GridPane 中添
我正在尝试将图像拖放到div上。图像没有被拖到div上并给出以下错误 Uncaught TypeError: Failed to execute 'appendChild' on 'Node': pa
我正在 android studio 中创建内部构建 AR 导航。我正在寻找一种方法将 anchor 与其他 anchor 或 anchor 节点/节点“连接”起来。我不确定使用哪一个。基于我将强制用
我在 Hive 上运行一些作业:首先是 4 节点,然后是 2 节点。令我惊讶的是,我的 2 节点性能比我的 4 节点更好。 首先,我在一个 4 节点(4 个事件节点)上运行查询,然后关闭 2 个节点(
我有 Node* current ,我在其中存储指向列表“顶部”当前节点的指针。当我将一个新节点设置为当前节点时,出现错误: '=' : cannot convert from 'CircularDo
我是 dcos Mesos 的新手,在本地 Ubuntu 机器上安装了 dc os。 我可以查看 dcos 仪表板。 但我无法使用 dcos node ssh --master-proxy --lea
在 JavaFX 中,是否有类似 setLayout(); 的东西?或 setBounds(); ? 例如,我想将按钮定位到我想要的位置。 最佳答案 JavaFX 场景图上的所有内容都是 Node .
我正在开发一个 JavaFX 应用程序,其中我开发的类(从 javafx.scene.Parent 扩展)是根据用户在 ListView 控件中单击的条目动态创建的。 只是要清楚这个节点,它不是使用像
我正在尝试为节点-边缘关系创建一个类图,因为它可以在有向图中找到。我想传达的是,Nodes 引用了 Edges,Edges 也引用了 Nodes。每个 Edge 都恰好需要两个 Node(源和目标)。
在mapreduce作业期间,单个任务将在随机节点上运行,是否有任何方法限制应在其中运行任务的节点? 最佳答案 Hadoop不会选择节点来随机运行任务。考虑到数据局部性,否则将有很多网络开销。 任务与
有什么区别: a) nodetool 重建 b) nodetool 修复 [-pr] 换句话来说,各个命令到底是做什么的? 最佳答案 nodetool重建:类似于引导过程(当您向集群添加新节点时),但
我已将第一个 OneToMany 关系添加到我的 hibernate 3.6.10 项目中。这是一个类: /** * */ package com.heavyweightsoftware.leal
是否有可能找到正在监听触发当前函数的事件的元素? 在下面的代码中,event.target 返回 #xScrollPane 和 event.currentTarget 和 event 的最低子节点.f
我正在尝试覆盖我数据库中的一些数据。结构很简单,就是: recipes { user_1{ recipe_1{data} recipe_2{data} } user_2{
我使用 setInterval 来运行该函数,但它会多次执行函数 2... 如何在输入中插入一个值后执行函数 第一个输入与其余输入的距离不同 如何在插入 val(tab 选项)后将插入从 1 个输入移
我不知道代码有什么问题,但在 visual studio 中不断收到这些错误消息。 Error 18 error C1903: unable to recover from previous e
我正在尝试从其类中获取 SharePoint 搜索导航节点的对象。 var nodes = $("div.ms-qSuggest-listItem"); 我正在获取节点对象,现在想要获取“_promp
D:\nodeP>node main.js module.js:327 抛出错误; ^ 错误:在 Function.Module 的 Function.Module._resolveFilename
struct node{ int key, prior, cnt, val; node *l, *r; node(){} node(int nkey) : key(nkey),
我有以下代码使用迭代器将项目插入双链表。这就是我们被要求这样做的方式。代码有效,但问题是我有 24 字节的绝对内存泄漏。 NodeIterator insert(NodeIterator & itrP
我是一名优秀的程序员,十分优秀!