在沈阳华清远见的学习之输入输出流~
文章目录
流(Stream)是指在计算机的输入输出操作中各部件之间的数据流动。按照数据的传输方向,流可分为输入流与输出流,它是java中比较重要的知识点,无论是面试考试,还是实际工作中,这都是经常能够看到的身影,所以今天我写下这篇文章,希望各位看官可以更好地了解流的相关知识。
字节流处理单元为1个字节,操作字节和字节数组。
package com.hqyj.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
File file = new File("文件地址");
if (file.exists()) {
FileInputStream fis = null;//判断文件是否存在
try {
// 创建一个文件字节流进行对文件读取
fis = new FileInputStream(file);
// 创建字节数组作为传递载体
byte b[] = new byte[1024];
// 判断每次读取到的内容数量,不为-1则说明还有内容
int length = 0;
// 创建一个字符串对象来承载读取到的内容
StringBuffer str = new StringBuffer();
// 循环读取,数量为-1则说明读取完成
while ((length = fis.read(b)) != -1) {
// 将每次读取到的内容制作成字符串,拼接在原字符串的后面
str.append(new String(b, 0, length));
}
// 显示字符串
System.out.println(str);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
// 关流
fis.close();
}
} else {
System.out.println("文件不存在");
}
}
}
字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好。
package com.hqyj.test;
import java.io.File;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
File file = new File("文件地址");
if (file.exists()) {
FileReader fr = null;//判断文件是否存在
try {
// 创建一个文件字节流进行对文件读取
fr = new FileReader(file);
// 创建字节数组作为传递载体
char[] c= new char[1024];
// 判断每次读取到的内容数量,不为-1则说明还有内容
int length = 0;
// 创建一个字符串对象来承载读取到的内容
StringBuffer str = new StringBuffer();
// 循环读取,数量为-1则说明读取完成
while ((length = fr.read(c)) != -1) {
// 将每次读取到的内容制作成字符串,拼接在原字符串的后面
str.append(new String(c, 0, length));
}
// 显示字符串
System.out.println(str);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
// 关流
fr.close();
}
} else {
System.out.println("文件不存在");
}
}
}
package com.hqyj.test;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) throws IOException {
Scanner scan = new Scanner(System.in);
String str = scan.next();
File file = new File("文件地址");
if (file.exists()) {
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file,true);
fos.write(str.getBytes());
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
fos.close();
}
} else {
System.out.println("文件不存在");
}
}
}
package com.hqyj.test;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) throws IOException {
Scanner scan = new Scanner(System.in);
String str = scan.next();
File file = new File("文件地址");
if (file.exists()) {
FileWriter fw = null;
try {
fw = new FileWriter(file,true);
fw.write(str.getBytes());
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
fw.close();
}
} else {
System.out.println("文件不存在");
}
}
}
首先要提到的是字节流与字符流的区别:
(1)字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。
(2)字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好
(3)如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点
(4)所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列
说完了输入流与输出流,接下来就是他们的应用啦,最经典的例子就是文件复制的问题,这里用字节流举例
package com.hqyj.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test2 {
public static void main(String[] args) throws IOException {
File file = new File("文件1地址");
File file1 = new File("文件2地址");
FileInputStream fis = null;
FileOutputStream fos = null;
fis = new FileInputStream(file);
fos = new FileOutputStream(file1);
byte b[] = new byte[1024];
int length = 0;
while ((length = fis.read(b)) != -1) {
fos.write(b);
}
fis.close();
fos.close();
}
}
字节流:BufferedInputStream,BufferedOutputStream
字符流:BufferedReader,BufferedWritter
缓冲流是一个特别的流,缓冲流的基本原理是创建流对象时候,会创建一个内置的默认大小的缓冲区数组,通过缓冲区书写,他的作用是提高系统读写速度,这里用上面的文件复制加缓冲流进行举例
package com.hqyj.test;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test3 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream(
new File("文件1地址"));
FileOutputStream fos = new FileOutputStream(
new File("文件2地址"));
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
byte[] bytes = new byte[1024];
while (bis.read(bytes) != -1) {
bos.write(bytes);
}
bos.flush();
bis.close();
bos.close();
fis.close();
fos.close();
}
}
缓冲流减少了CPU通过内存访问磁盘的次数,极大的提高了读写的速度和效率,IO流操作文件内容都是在缓冲流内部的缓冲数组之中的。
以上就是今天要讲的内容,何为输入流,何为输出流,何为字节流,他们的作用是什么,怎么使用,有什么优缺点,希望对各位读者能有所帮助。
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我刚刚为fedora安装了emacs。我想用emacs编写ruby。为ruby提供代码提示、代码完成类型功能所需的工具、扩展是什么? 最佳答案 ruby-mode已经包含在Emacs23之后的版本中。不过,它也可以通过ELPA获得。您可能感兴趣的其他一些事情是集成RVM、feature-mode(Cucumber)、rspec-mode、ruby-electric、inf-ruby、rinari(用于Rails)等。这是我当前用于Ruby开发的Emacs配置:https://github.com/citizen428/emacs
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][
我想使用spawn(针对多个并发子进程)在Ruby中执行一个外部进程,并将标准输出或标准错误收集到一个字符串中,其方式类似于使用Python的子进程Popen.communicate()可以完成的操作。我尝试将:out/:err重定向到一个新的StringIO对象,但这会生成一个ArgumentError,并且临时重新定义$stdxxx会混淆子进程的输出。 最佳答案 如果你不喜欢popen,这是我的方法:r,w=IO.pipepid=Process.spawn(command,:out=>w,:err=>[:child,:out])
我想知道Ruby用来在命令行打印这些东西的输出流:irb(main):001:0>a="test"=>"test"irb(main):002:0>putsatest=>nilirb(main):003:0>a=>"test"$stdout是否用于irb(main):002:0>和irb(main):003:0>?而且,在这两次调用之间,$stdout的值是否有任何变化?另外,有人能告诉我打印/写入这些内容的Ruby源代码吗? 最佳答案 是的。而且很容易向自己测试/证明。在命令行试试这个:ruby-e'puts"foo"'>test.
我在使用自定义RailsFormBuilder时遇到了问题,从昨天晚上开始我就发疯了。基本上我想对我的构建器方法之一有一个可选block,以便我可以在我的主要content_tag中显示其他内容。:defform_field(method,&block)content_tag(:div,class:'field')doconcatlabel(method,"Label#{method}")concattext_field(method)capture(&block)ifblock_given?endend当我在我的一个Slim模板中调用该方法时,如下所示:=f.form_field:e
这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac
我使用rails3.1+rspec和factorygirl。我对必填字段(validates_presence_of)的验证工作正常。我如何让测试将该事实用作“成功”而不是“失败”规范是:describe"Addanindustrywithnoname"docontext"Unabletocreatearecordwhenthenameisblank"dosubjectdoind=Factory.create(:industry_name_blank)endit{shouldbe_invalid}endend但是我失败了:Failures:1)Addanindustrywithnona
考虑一下:现在这些情况:#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2我需要用其他字符串输出URL。我如何保证&符号不会被转义?由于我无法控制的原因,我无法发送&。求助!把我的头发拉到这里:\编辑:为了澄清,我实际上有一个像这样的数组:@images=[{:id=>"fooid",:url=>"http://