前言
网络程序员很大部分的工作都是简单的输入输出,就是将数据字节从一个系统移动到另一个系统。字节就是字节,服务器发给你的数据和读取文件没有什么区别。但是java的输入输出流和大多数语言都不太一样。java的i/o建立于流之上。输入流读取数据,输出流写入数据。
输出流
Java的基本输出流是OutputStream,里面提供了一些操作输出流的方法。下面是其简单的使用。
public static void generateCharacters(OutputStream out)throws IOException {
// 第一次开始写入的字符位置
int firstPrintableCharacter = 33;
int numberOfPrintableCharacters = 94;
int numberOfCharactersPerLine = 72;
int start = firstPrintableCharacter;
while(true){
for (int i = start; i < start + numberOfCharactersPerLine; i++) {
// ((i - firstPrintableCharacter) % numberOfPrintableCharacters) + firstPrintableCharacter
out.write(
((i - firstPrintableCharacter) % numberOfPrintableCharacters) + firstPrintableCharacter);
}
out.write('\r');
out.write('\n');
start = ((start + 1) - firstPrintableCharacter) % numberOfPrintableCharacters + firstPrintableCharacter;
}
}
上面这个方法,就是将ascii码33到94对应的字符,循环写入到文本文件中,也可以将将这些字节,发送到其他服务器。
除了这种一个一个字节的写入,我们也可以一整个字节数组写入。如下面代码
public static void generateCharacterss(OutputStream out)throws IOException {
int frstPrintableCharacter =33;
int number0fPrintableCharacters =94;
int number0fCharactersPerLine =72;
int start =frstPrintableCharacter;
byte[] line = new byte[number0fCharactersPerLine +2];//+2对应回车和换行
while(true){
/*无限循环*/
for (int i = start; i < start + number0fCharactersPerLine; i++){
line[i - start] =(byte) ((i - frstPrintableCharacter)% number0fPrintableCharacters + frstPrintableCharacter);
};
line[72]=(byte)'\r';// 回车
line[73]=(byte)'\n';//换行
out.write(line);
start = ((start + 1) - frstPrintableCharacter)%number0fPrintableCharacters + frstPrintableCharacter;
}
}
}
相比较上面的那个数组效率可能会更高一点。
与硬件缓存一样,流还可以在软件中缓存,即直接使用java代码缓存。因此写入数据之后,刷新输出流非常的重要。
例如,你向http服务器写了300字节的请求,通常需要等待相应,等待更多的数据写入,然后一起发送。但是你直接刷新输出流,它会强制发送。
当然强制刷新输出流的好处不止这一点,所以希望大家可以养成,随手刷新输出流的习惯,当然在流使用完成之后,要及时的关闭流。
输入流
Java输入流的基本类是InputStream,这个类同样的提供了一些基本的方法。输入流的简单使用如下
// 一个字节一个字节读取
public static byte[] getInputStreame(InputStream in) throws IOException {
byte[] input = new byte[10];
for (int i = 0; i < input.length; i++) {
int b = in.read();
if(b == -1){
break;
}
input[i] = (byte)b;
}
return input;
}
// 读取指定长度
public static byte[] getInputStreameAll(InputStream in) throws IOException {
int byteRead = 0;
int bytesToRead = 1024;
byte[] input = new byte[bytesToRead];
while (byteRead < bytesToRead){
// 这里有个问题,可能你读的流可能没有这么长的字节内容,或者有一部分字节永远读不到,这个时候就会报错
// 长度够了,或者比你读的长,就没事
byteRead += in.read(input,byteRead,bytesToRead - byteRead);
System.out.println("看下返回值是什么:" + byteRead );
}
return input;
}
// 读取可利用长度
public static byte[] getInputStreameAvaliable(InputStream in) throws IOException {
int avaliable = in.available();
byte[] input = new byte[avaliable];
int start = 0;
start += in.read(input,start,avaliable);
System.out.println("---------------------------------" + start);
return input;
}
上面是输入流的基本使用,第一个是一个一个字节的读取,第二个是读取指定长度的数据。第三个是读取可利用的长度的字节。
总结
上面介绍java基本的输入输出流,同时举了几个简单的例子,对输入输出流的基本使用做了一个展示,希望可以对大家有所帮助。