- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章深入解析Java编程中面向字节流的一些应用由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
文件输入输出流 。
文件输入输出流 FileInputStream 和 FileOutputStream 负责完成对本地磁盘文件的顺序输入输出操作.
【例】通过程序创建一个文件,从键盘输入字符,当遇到字符“#”时结束,在屏幕上显示该文件的所有内容 。
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
|
import
java.io.*;
class
ep10_5{
public
static
void
main(String args[]){
char
ch;
int
data;
try
{
FileInputStream a=
new
FileInputStream(FileDescriptor.in);
//创建文件输入流对象
FileOutputStream b=
new
FileOutputStream(
"ep10_5"
);
//创建文件输出流对象
System.out.println(
"请输入字符,以#号结束:"
);
while
((ch=(
char
)a.read())!=
'#'
){
b.write(ch);
}
a.close();
b.close();
System.out.println();
FileInputStream c=
new
FileInputStream(
"ep10_5"
);
FileOutputStream d=
new
FileOutputStream(FileDescriptor.out);
while
(c.available()>
0
){
data=c.read();
d.write(data);
}
c.close();d.close();
}
catch
(FileNotFoundException e){
System.out.println(
"找不到该文件!"
);
}
catch
(IOException e){}
}
}
|
FileDescriptor 是 java.io 中的一个类,该类不能实例化,其中包含三个静态成员:in、out 和err,分别对应于标准输入流、标准输出流和标准错误流,利用它们可以在标准输入输出流上建立文件输入输出流,实现键盘输入或屏幕输出操作.
【例】实现对二进制图形文件(.gif)的备份 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import
java.io.*;
class
ep10_6{
public
static
void
main(String args[])
throws
IOException{
FileInputStream a=
new
FileInputStream(
"ep10_6.gif"
);
FileOutputStream b=
new
FileOutputStream(
"ep10_6_a.gif"
);
System.out.println(
"文件的大小为:"
+a.available());
byte
c[]=
new
byte
[a.available()];
a.read(c);
//将图形文件读入数组
b.write(c);
//将数组中的数据写入到新文件中
System.out.println(
"文件已经被更名复制!"
);
a.close();
b.close();
}
}
|
过滤流 。
FilterInputStream 和 FileOutputStream 是 InputStream 和 OutputStream 的直接子类,分别实现了在数据的读、写操作的同时能对所传输的数据做指定类型或格式的转换,即可实现对二进制字节数据的理解和编码转换.
常用的两个过滤流是数据输入流 DataInputStream 和数据输出流 DataOutputStream。其构造方法为:
1
2
|
DataInputStream(InputStream in);
//创建新输入流,从指定的输入流 in 读数据
DataOutputStream(OutputStream out);
//创建新输出流,向指定的输出流 out 写数据
|
由于 DataInputStream 和 DataOutputStream 分别实现了 DataInput 和 DataOutput 两个接口(这两个接口规定了基本类型数据的输入输出方法)中定义的独立于具体机器的带格式的读写操作,从而实现了对不同类型数据的读写。由构造方法可以看出,输入输出流分别作为数据输入输出流的构造方法参数,即作为过滤流必须与相应的数据流相连.
DataInputStream 和 DataOutputStream 类提供了很多个针对不同类型数据的读写方法,具体内容读者可参看 Java 的帮助文档.
【例】将三个 int 型数字 100,0,-100 写入数据文件 ep10_6.dat 中.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import
java.io.*;
class
ep10_7{
public
static
void
main(String args[]){
String fileName=
"ep10_7.dat"
;
int
value1=
100
,value2=
0
,value3=-
100
;
try
{
//将 DataOutputStream 与 FileOutputStream 连接输出不同类型的数据
DataOutputStream a=
new
DataOutputStream(
new
FileOutputStream(fileName));
a.writeInt(value1);
a.writeInt(value2);
a.writeInt(value3);
a.close();
}
catch
(IOException i){
System.out.println(
"出现错误!"
+fileName);
}
}
}
|
运行后在程序目录中生成数据文件 ep10_7.dat,用文本编辑器打开后发现内容为二进制的: 00 00 00 64 00 00 00 00 FF FF FF 9C.
【例】读取数据文件 ep10_6.dat 中的三个 int 型数字,求和并显示.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import
java.io.*;
class
ep10_8{
public
static
void
main(String args[]){
String fileName=
"D:\\myjava/ep10_7.dat"
;
int
sum=
0
;
try
{
DataInputStream a=
new
DataInputStream(
new
BufferedInputStream(
new
FileInputStream(fileName)));
sum+=a.readInt();
sum+=a.readInt();
sum+=a.readInt();
System.out.println(
"三个数的和为:"
+sum);
a.close();
}
catch
(IOException e){
System.out.println(
"出现错误!"
+fileName);
}
}
}
|
运行结果:
1
|
三个数的和为:0
|
readInt 方法可以从输入输出流中读入 4 个字节并将其作为 int 型数据直接参与运算。由于已经知道文件中有 3 个数据,所以可以使用 3 个读入语句,但若只知道文件中是 int 型数据而不知道数据的个数时该怎么办呢?因为 DataInputStream 的读入操作如遇到文件结尾就会抛出 EOFException 异常,所以可将读操作放入 try 中.
1
2
3
4
5
6
7
8
|
try
{
while
(
true
)
sum+=a.readInt();
}
catch
(EOFException e){
System.out.pritnln(
"三个数的和为:"
+sum);
a.close();
}
|
EOFException 是 IOException 的子类,只有文件结束异常时才会被捕捉到,但如果没有读到文件结尾,在读取过程中出现异常就属于 IOException.
【例】从键盘输入一个整数,求该数的各位数字之和.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import
java.io.*;
class
ep10_9{
public
static
void
main(String args[])
throws
IOException{
DataInputStream a=
new
DataInputStream(System.in);
System.out.print(
"请输入一个整数:"
);
int
b=a.readInt();
int
sum=
0
;
int
c=b;
while
(c>
0
){
int
d=c%
10
;
//取最低位
c=c/
10
;
//去掉最低位
sum=sum+d;
//累加各位之和
}
System.out.println(b+
"的各位数字之和="
+sum);
}
}
|
运行结果:
1
2
|
请输入一个整数:26
842403082 的各位数字之和=31
|
需要注意的是,输入的数据 26 为变成了 842403082,原因在于输入数据不符合基本类型数据的格式,从键盘提供的数据是字符的字节码表示方式,若输入 26,只代表 2 和 6 两个字符的字节数据,而不是代表整数 26 的字节码.
若要从键盘得到整数需要先读取字符串,再利用其他方法将字符串转化为整数。 标准输入输出 。
System.in、System.out、System.err 这 3 个标准输入输流对象定义在 java.lang.System 包中,这 3 个对象在 Java 源程序编译时会被自动加载。 标准输入:标准输入 System.in 是 BufferedInputStream 类的对象,当程序需要从键盘上读入数据时,只需要调用 System.in 的 read()方法即可,该方法从键盘缓冲区读入一个字节的二进制数据,返回以此字节为低位字节,高位字节为 0 的整型数据。 标准输出:标准输出 System.out 是打印输出流 PrintStream 类的对象。PrintStream 类是过滤输出流类 FilterOutputStream 的一个子类,其中定义了向屏幕输出不同类型数据的方法print()和 println()。 标准错误输出:System.err 用于为用户显示错误信息,也是由 PrintStream 类派生出来的错误流。Err 流的作用是使 print()和 println()将信息输出到 err 流并显示在屏幕上,以方便用户使用和调试程序.
【例】输入一串字符显示出来,并显示 System.in 和 System.out 所属的类.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
import
java.io.*;
class
ep10_10{
public
static
void
main(String args[]){
try
{
byte
a[]=
new
byte
[
128
];
//设置输入缓冲区
System.out.print(
"请输入字符串:"
);
int
count =System.in.read(a);
//读取标准输入输出流
System.out.println(
"输入的是:"
);
for
(
int
i=
0
;i<count;i++)
System.out.print(a[i]+
""
);
//输出数组元素的 ASCII 值
System.out.println();
for
(
int
i=
0
;i<count-
2
;i++)
//不显示回车和换行符
System.out.print((
char
)a[i]+
""
);
//按字符方式输出元素
System.out.println();
System.out.println(
"输入的字符个数为:"
+count);
Class InClass=System.in.getClass();
Class OutClass=System.out.getClass();
System.out.println(
"in 所在的类为:"
+InClass.toString());
System.out.println(
"out 所在的类为:"
+OutClass.toString());
}
catch
(IOException e){}
}
}
|
运行结果如所示: 需要注意的是,输入了 3 个字符按回车后,输出的结果显示为 5 个字符。这是由于 Java 中回车被当作两个字符,一个是 ASCⅡ为 13 的回车符,一个是值为 10 的换行符。程序中 getClass()和 ToString()是 Object 类的方法,作用分别是返回当前对象所对应的类和返回当前对象的字符串表示.
最后此篇关于深入解析Java编程中面向字节流的一些应用的文章就讲到这里了,如果你想了解更多关于深入解析Java编程中面向字节流的一些应用的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
美好的一天!我试图添加两个字节变量并注意到奇怪的结果。 byte valueA = 255; byte valueB = 1; byte valueC = (byte)(valueA + valueB
嗨,我是 swift 的新手,我正在尝试解码以 [Byte] 形式发回给我的字节数组?当我尝试使用 if let string = String(bytes: d, encoding: .utf8)
我正在使用 ipv4 和 ipv6 存储在 postgres 数据库中。 因为 ipv4 需要 32 位(4 字节)而 ipv6 需要 128(16 字节)位。那么为什么在 postgres 中 CI
我很好奇为什么 Go 不提供 []byte(*string) 方法。从性能的角度来看,[]byte(string) 不会复制输入参数并增加更多成本(尽管这看起来很奇怪,因为字符串是不可变的,为什么要复
我正在尝试为UDP实现Stop-and-Wait ARQ。根据停止等待约定,我在 0 和 1 之间切换 ACK。 正确的 ACK 定义为正确的序列号(0 或 1)AND消息长度。 以下片段是我的代码的
我在下面写了一些代码,目前我正在测试,所以代码中没有数据库查询。 下面的代码显示 if(filesize($filename) != 0) 总是转到 else,即使文件不是 0 字节而是 16 字节那
我使用 Apache poi 3.8 来读取 xls 文件,但出现异常: java.io.IOException: Unable to read entire header; 0 by
字典大小为 72 字节(根据 getsizeof(dict) 在字典上调用 .clear() 之后发生了什么,当新实例化的字典返回 240 字节时? 我知道一个简单的 dict 的起始大小为“8”,并
我目前正在努力创建一个函数,它接受两个 4 字节无符号整数,并返回一个 8 字节无符号长整数。我试图将我的工作基于 this research 描述的方法,但我的所有尝试都没有成功。我正在处理的具体输
看看这个简单的程序: #include using namespace std; int main() { unsigned int i=0x3f800000; float* p=(float*)(
我创建了自己的函数,将一个字符串转换为其等效的 BCD 格式的 bytes[]。然后我将此字节发送到 DataOutputStram (使用需要 byte[] 数组的写入方法)。问题出在数字字符串“8
此分配器将在具有静态内存的嵌入式系统中使用(即,没有可用的系统堆,因此“堆”将只是“char heap[4096]”) 周围似乎有很多“小型内存分配器”,但我正在寻找能够处理非常小的分配的一个。我说的
我将数据库脚本从 64 位系统传输到 32 位系统。当我执行脚本时,出现以下错误, Warning! The maximum key length is 900 bytes. The index 'U
想知道 128 字节 ext2 和 256 字节 ext3 文件系统之间的 inode 数据结构差异。 我一直在为 ext2、128 字节 inode 使用此引用:http://www.nongnu.
我试图理解使用 MD5 哈希作为 Cassandra key 在“内存/存储消耗”方面的含义: 我的内容(在 Java 中)的 MD5 哈希 = byte[] 长 16 个字节。 (16 字节来自维基
检查其他人是否也遇到类似问题。 shell脚本中的代码: ## Convert file into Unix format first. ## THIS is IMPORTANT. ###
我们有一个测量数据处理应用程序,目前所有数据都保存为 C++ float,这意味着在我们的 x86/Windows 平台上为 32 位/4 字节。 (32 位 Windows 应用程序)。 由于精度成
我读到在 Java 中 long 类型可以提升为 float 和 double ( http://www.javatpoint.com/method-overloading-in-java )。我想问
我有一个包含 n 个十进制元素的列表,其中每个元素都是两个字节长。 可以说: x = [9000 , 5000 , 2000 , 400] 这个想法是将每个元素拆分为 MSB 和 LSB 并将其存储在
我使用以下代码进行 AES-128 加密来编码一个 16 字节的 block ,但编码值的长度给出了 2 个 32 字节的 block 。我错过了什么吗? plainEnc = AES.enc
我是一名优秀的程序员,十分优秀!